2012-04-12 54 views
-3

我創建了一個jquery腳本,用於生成字符串的所有可能組合,其中包含數字和小寫字母。我只想要字符串10個字符長,所以我扔了一個if語句來控制它。所有可能的組合字符串 - 速度

對於那些有興趣,這裏的腳本:

$(document).ready(function(){ 

    var parts = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','1','2','3','4','5','6','7','8','9','0']; 
    var url = ""; 

for (var a = 0; a < parts.length; a++) { 
    for (var b = 0; b < parts.length; b++) { 
     for (var c = 0; c < parts.length; c++) { 
      for (var d = c + 1; d < parts.length; d++) { 
       for (var e = d + 1; e < parts.length; e++) { 
        for (var f = e + 1; f < parts.length; f++) { 
         for (var g = f + 1; g < parts.length; g++) { 
          for (var h = g + 1; h < parts.length; h++) { 
           for (var i = h + 1; i < parts.length; i++) { 
            for (var j = i + 1; j < parts.length; j++) { 
              url = parts[a]+parts[b]+parts[c]+parts[d]+parts[e]+parts[f]+parts[g]+parts[h]+parts[i]+parts[j]; 
              if (url.length === 10) { 
               $("#URLs").append(url+', '); 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

}); 

有一個爲每個字符現貨循環。如果你只想要3字符長的字符串,只能使用3個嵌套字符串。

它可能不雅,但它的工作原理。我的問題是速度/崩潰。

當然,試圖通過瀏覽器運行這是一個壞主意。什麼是更好的程序/語言/設置速度?我明白,無論如何,我可能受到我的CPU能力的約束,而暴力強制總是很慢。

如果有一個服務可以做到這一點,我想這也可以。

+1

爲什麼你需要使用javascript來做到這一點? – 2012-04-12 19:57:53

+0

對於這些類型的問題,通常遞歸比10 for循環更好。 http://en.wikipedia.org/wiki/Recursion_(computer_science) – 2012-04-12 19:58:01

+2

你爲什麼需要這樣做?我唯一的想法是,這是實現你的目標的錯誤方式。 – Jlange 2012-04-12 20:00:55

回答

5

你不會有地方來存儲輸出。你所談論的是3.656e + 15的組合,所以你將它附加到DOM元素的方法是行不通的。

即使您使用C/C++或Java,您仍然在談論可能不適合您的存儲容量的事情。如果你只是動態提交它們(而不是存儲它們),那麼提交很多請求就會花費很長時間。我不認爲你會在這裏嘗試完成的任何(陰暗的)事情成功。

+1

對於那些會對我的答案投下贊成票的人,請說明原因。 – Marc 2012-04-12 20:09:35

+0

這應該是被接受的答案。 – Jlange 2012-04-12 20:15:23

2

您正在創建3656158440062976個字符串,每秒1百萬個字符串,您的腳本將運行115年,每秒處理10億個字符串,這將是42天。結果字符串(您的$('#URLs').append)將爲每個字符1個字節的36PB。

我投不可行

(Math.pow(36,10)/1000000)/(60*60*24*365) 
=115.93602359408219 
(Math.pow(36,10)/1000000000)/(60*60*24) 
=42.31664861184 
(Math.pow(36,10)*10)/(1000*1000*1000*1000*1000) 
=36.56158440062976 

wolfram alpha

0

不是說我完全回答你的問題(存在由於排列數量龐大還是性能和內存的限制),但這裏的其中一種算法橫跨了我的想法:將字符串視爲基數N中的大數字,其中N是允許的字符數。

  1. 開始用繩子aaaaa..aa
  2. 如果在最後位置的字符不等於0(最後,「最大的」允許的符號),增加它。否則,將字符設置爲a,如果不等於0,則將前一個符號加1。否則,......你明白了。
  3. 重複步驟2所需的次數。

該算法的一個好處是,你可以把它包裝在一個函數,如getNextString(),並調用它需要的次數。 此外,沒有遞歸,所以在大多數語言中應該更快。

0

什麼會是一個更好的程序/語言/設置速度?

C/C++將是很好的語言。並使用遞歸。

相關問題