生成字母数字序列javascript

时间:2016-01-27 15:47:15

标签: javascript

我编写了一个非常慢的函数来生成从AA000到ZZ999的代码(按顺序而非随机)。我已经得出结论,必须有一个更好的方法来做到这一点。关于如何加快速度的任何建议?

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);
}

5 个答案:

答案 0 :(得分: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]);
                }
            }       
        }
    }
}

主要观点:

  • 一次生成所有内容
  • 尽可能重用部分字符串

但是,我没有看到这样详尽的清单是如何有用的。正好有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];
}

答案 1 :(得分: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());

答案 2 :(得分: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可以保存该数组并使用循环轻松解析它。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

从计算复杂性的角度来看,遗憾的是这是你能做的最好的事情。从大量的指令角度来看,你可以做得更好(正如其他人指出的那样),但它仍然是复杂的相同顺序(请记住,常数/乘数与大O复杂性无关)。您还可以优化存储。

想一想。你的阵列需要有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)。