【发布时间】:2010-12-14 03:05:08
【问题描述】:
我正在做某种蛮力攻击来解决问题。理论上这是一个可行的解决方案,实际上也是,但需要相当长的时间。
我有 7 个相互嵌套的 for 循环,但我只需要没有重复的“for 变量”的组合。所以例如允许使用 1,2,3,4,5,6,7,但应忽略 1,1,3,4,5,6,7。我目前正在使用一个函数来检查数组中的重复项:
http://www.groggyjava.tv/freebies/duplicates.html
但是,我认为如果我可以立即忽略这些组合,而不是对 每个 单个组合反复使用该函数,我会做得更好。现在我正在评估 14^7 = 105.413.504 组合,但其中只有 14 nPr 7 = 17.297.280 是必要的。
我的代码目前是(其中 hgd 是重复的测试函数,如果没有重复则返回 true):
for(var a=0;a<14;a++) {
for(var b=0;b<14;b++) {if(hgd([a,b])) {
for(var c=0;c<14;c++) {if(hgd([a,b,c])) {
for(var d=0;d<14;d++) {if(hgd([a,b,c,d])) {
for(var e=0;e<14;e++) {if(hgd([a,b,c,d,e])) {
for(var f=0;f<14;f++) {if(hgd([a,b,c,d,e,f])) {
for(var g=0;g<14;g++) {if(hgd([a,b,c,d,e,f,g])) {
check([a,b,c,d,e,f,g]);
}}
}}
}}
}}
}}
}}
}
我怎样才能让它更快,也许有另一种解决方案而不是 for 循环?
谢谢。
【问题讨论】:
-
出于某种原因,我在想 B+ 树。 en.wikipedia.org/wiki/B%2B_tree 但不要问我怎么做。我只记得“管道”和“扇出/扇入”处理
-
您是否可以将验证结果(例如基于 id)存储在某处?如果可能的话,您可以检查一次并存储该组合是否有效。
标签: javascript