2016-01-27 16 views
5

AA000からZZ999へのコード生成に非常に遅い関数を書いています(順不同)。そして、私はこれを行うより良い方法があると結論づけました。これをより速くする方法に関する提案はありますか?英数字のシーケンスを生成するjavascript

function generateAlphaNumeric(){ 

theAlphabet = ['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']; 
resultArrray = []; 
resultArrray2 = []; 
teller = 0; 

for(i in theAlphabet){ 
    for(x in theAlphabet){ 
     resultArrray[teller] = theAlphabet[i] + theAlphabet[x]; 
     teller++; 
    } 
} 
teller = 0; 
for(x = 0; x<10; x++){ 
    for(y = 0; y<10; y++){ 
     for(z = 0; z<10; z++){ 
      resultArrray2[teller] = x.toString() + y.toString() +z.toString(); 
      teller++; 
     } 
    } 
} 
teller = 0; 
finalArray = []; 
for(index in resultArrray){ 
    for(i in resultArrray2){ 
     finalArray[teller] = resultArrray[index] + resultArrray2[i]; 
     teller++; 
    } 
} 
//console.log(resultArrray); 
//console.log(resultArrray2); 
console.log(finalArray); 
} 
+1

小さな問題に問題を分けます。単一のランダムな文字と単一の乱数を生成し、それらを追加する方法を解説します。 –

+0

[可能な重複](https://stackoverflow.com/questions/10726909/random-alpha-numeric-string-in-javascript) –

+2

ランダムコードではなく、すべてのコードを列挙することが目標です。 – lex82

答えて

3

これはかなり速くする必要があります:

var theAlphabet = ['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']; 
var theDigits = ['0','1','2','3','4','5','6','7','8','9']; 

var result = []; 
for (var i=0 ; i<26 ; i++) { 
    var prefix1 = theAlphabet[i]; 
    for (var j=0 ; j<26; j++) { 
     var prefix2 = prefix1 + theAlphabet[j]; 
     for(var x = 0; x<10; x++){ 
      var prefix3 = prefix2 + theDigits[x]; 
      for(var y = 0; y<10; y++){ 
       var prefix4 = prefix3 + theDigits[y]; 
       for(var z = 0; z<10; z++){ 
        result.push(prefix4 + theDigits[z]); 
       } 
      }  
     } 
    } 
} 

キーアイデア:

  • できるだけ1回の実行ですべて
  • リユース部分文字列として多くを生成

どうやってこれまでのところ、どのように網羅的なリストが有用かはわかりません。厳密に26 * 26 * 1000の異なるコードがあります。だから、代わりに、それは単に要求された特定のコードを生成する機能を構築することに意味を作ることができ、すべてのコードを持つ配列を維持:

function getCode(number) { 
    var z = number % 10; 
    number -= z; number /= 10; 
    var y = number % 10; 
    number -= y; number /= 10; 
    var x = number % 10; 
    number -= x; number /= 10; 
    var a = number % 26; 
    number -= a; number /= 26; 
    var b = number; 

    return theAlphabet[a] + theAlphabet[b] + theDigits[x] + theDigits[y] + theDigits[z]; 
} 
+0

これはかなりの時間を削った!私は、新しいリクエストがあるたびに、次の行を取得する機能を構築します。 –

+0

私はあなたの機能を実装して、素晴らしい作品!ありがとう:) –

0

は、このソリューションをお試しください:

function generate() { 
    var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
     ar = []; 
    for (var index1 = 0; index1 < str.length; index1++) { 
     for (var index2 = 0; index2 < str.length; index2++) { 
     for (var index3 = 0; index3 < 1000; index3++) { 
      ar.push(str[index1] + str[index2] + ('000' + index3).slice(-3)); 
     } 
     } 
    } 
    return ar; 
    } 
    console.log(generate()); 
0
function generate() { 
    var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
     array = []; 
    for (var i = 0; i < str.length; i++) { 
     for (var j = 0; j < str.length; j++) { 
     for (var k = 0; k < 10; k++) { 
      for (var l = 0; l < 10; l++) { 
      for (var m = 0; m < 10; m++) { 
       ar.push(str[i] + str[j] + k + l + m); 
      } 
      } 
     } 
     } 
    } 
    return array; 
    } 
    console.log(generate()); 

これが生成されます。すべてのコードの配列.. Uはその配列を保存し、ループを使って簡単に解析することができます。

0

私はそれをテストしていないが、それは計算の複雑さの観点からトリック

function generateAlphaNumeric() 
{ 

    var theAlphabet = ['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']; 
    var result = []; 

    // Will take a random letter inside theAlphabet 
    // Math.floor(Math.random() * theAlphabet.length) will generate a random number between 0 and 25 
    var i = 0; 
    while(i<2) 
    { 
     var letter = theAlphabet[Math.floor(Math.random() * theAlphabet.length)]; 
     result.push(letter); 
     i++; 
    } 

    i = 0; 
    while(i<3) 
    { 
     // Adds a random number between 0 and 9 
     result.push(Math.floor(Math.random() * 10)); 
     i++; 
    } 
    return result; 
} 
0

を行う必要があり、残念ながらこれはあなたができる最善です。 (他の人が指摘しているように)少し上手くいくことができますが、それでも複雑さは同じです(定数/乗数は大きな複雑さの中では無関係です)。また、ストレージを少し最適化することもできます。

考えてみてください。あなたの配列は26 * 26 * 10 * 10 * 10のメンバーが必要です。これは、少なくともその多くの要素に触れる必要があることを意味します。

レッツN =アルファベットの要素数 レッツM =あなたの桁キュー

ベストケースの注文複雑= O(N * N * M * M * M)(あなたが持っていたすべての場合の要素数

for(i in theAlphabet){ // *O(N)* 
    for(x in theAlphabet){ // *O(N)* 
    resultArrray[teller] = theAlphabet[i] + theAlphabet[x];// *(O(1))* 
    } 
} 



for(x = 0; x<10; x++){ // O(M) 
    for(y = 0; y<10; y++){ // O(M) 
     for(z = 0; z<10; z++){ // O(M) 
      resultArrray2[teller] = x.toString() + y.toString() +z.toString(); // O(1) (technically this is O(length of x + y + z) 
      teller++; 
     } 
    } 
} 


for(index in resultArrray){ // O(N * N) 
    for(i in resultArrray2){ // O(M * M * M(
     finalArray[teller] = resultArrray[index] + resultArrray2[i]; //O(1) 
     teller++; 
    } 
} 
:行うには、今のあなたは、以下の操作を使用している

)上記と同じ

ベストケース・ストレージ・複雑=(あなたはすべてのコードを格納する必要がある)

割り当て値でした

あなたの注文の複雑さはO(N * N * M * M * M)です。これはあなたができる最高のものです。

もっと大きな疑問は、なぜすべてのコードを生成したいのかということです。あなたが望むすべての注文番号か何かごとに固有のコードを作成する場合は、あなたのようなステートマシンを作ることができます:あなたが望むすべてがランダム識別子である場合

function getNextCode(previousCode) { 
    // in here, just increment the previous code 
} 

、タイムスタンプ+何かについてのハッシュを使用することを検討してください代わりにリクエスト。

一意性を気にしない場合は、いつでもランダムコードを生成できます。

上記はすべてO(1)です。

関連する問題