2011-06-11 66 views
0

考慮到與ň鍵對象3個按鍵的所有組合,需要找到每3個按鍵(第三次通報數學)找到對象

這是最有效的方式的所有組合?

var x = {}; // object 

x['00'] = [1, 7, 9]; 
x['01'] = [1, 9]; 
x['02'] = [6, 8]; 
x['03'] = [1, 7]; 
x['04'] = [1, 5, 8]; 
x['05'] = [4, 6, 8, 9]; 

var triples = [], 
    c = [0,0,0]; // counter. keep track of the indexes when looping over objects 

for(var i in x){ 
    c[0]++; 
    c[1] = 0; 

    for(var j in x){ // loop to compare this x[i] array to all other arrays 
     c[1]++; 
     if(c[1] < c[0]+1) continue; 
     c[2] = 0; 

     for(var k in x){ 
      c[2]++; 
      if(c[2] < c[1]+1) continue; 

      triples.push([i,j,k]); 
     } 
    } 
} 

console.dir(triples); 
+1

你能顯示你所需的輸出? – cwallenpoole 2011-06-11 23:43:07

+0

我發佈的內容已經是期望的輸出了...我只想知道是否有更好的方法 – vsync 2011-06-11 23:49:55

+0

不,你沒有發佈你想要的輸出。你已經發布了一個程序,如果我們想看看它輸出了什麼,我們必須運行它,並且我們必須假設它的輸出完成你想要的功能。考慮爲我們節省麻煩並直接發佈期望的輸出。 – 2011-06-12 13:17:43

回答

2

根據我的猜測,最好的辦法是循環訪問密鑰,然後基於該密鑰進行推送。這樣你就可以避免基本上等於一系列字符串查找 - 這是JS通常擅長的,但不像簡單的數字迭代那麼快。

這將是這樣的:

var keys = [] 
for(var it in x) keys.push(it); 

var triples = [] 
var len = keys.length; //cache the value. 
for(var i = 0; i < len; i++) 
    for(var j = i + 1; j < len; j++) 
     for(var k = j + 1; k < len; k++) 
     triples.push([ keys[ i ], keys[ j ], keys[ k ] ]); 
+0

確實非常聰明:)你將對象轉換爲字典數組,因此可以使用普通的'for'循環並跳過項目 – vsync 2011-06-12 08:43:03

+0

您是否足夠使用遞歸方法顯示示例? – vsync 2011-06-15 13:12:12

0

不要使用for .. in ..,它很慢,可以給出問題。只需使用for循環。

爲什麼你只能深3?在你的例子中,你有一組4.我期望一些遞歸解決方案。

至於你的問題:這是最有效的方法嗎?

如果您真的在尋找最有效的方法,那麼您最終可能會針對每個瀏覽器(或JavaScript引擎更精確)使用不同的腳本。

我將重點放在一個工作實現上,因爲我認爲現在還沒有這樣做。

+0

,但它的工作完美。你怎麼能使用任何東西,但一個對象''在...循環?沒有意義..我需要它是快速的,因爲這是一個大的一部分,將運行多次 – vsync 2011-06-11 23:57:32

+1

然後我不明白你的算法。 – Halcyon 2011-06-12 00:08:45

+0

你怎麼能不理解〜10行簡單循環,效果很好..? – vsync 2011-06-12 08:39:59