首页 > 解决方案 > 生成 700 万个不重叠的随机字符串

问题描述

我试图生成 700 万个不重叠的随机字符串。(字符串长度必须为 2 到 4)

然而,我的代码花了 28023 毫秒来生成 700 万个不重叠的字符串。

我不知道如何有效地生成 700 万个没有重叠的字符串。

我尝试使用 hashmap, list, ... 因为我需要一个键值类型

    HashMap<String, Integer> map = new HashMap();
    long start = System.currentTimeMillis();

    for(int i = 0 ; i < 7000000 ; ) {
        int MAX_LENGTH = 4;
        int MIN_LENGTH = 2;

        StringBuffer temp = new StringBuffer();
        Random rnd = new Random();
        int length = rnd.nextInt(MAX_LENGTH - MIN_LENGTH + 1) + MIN_LENGTH; // 문자열 길이 랜덤(2~4자리)

        for (int j = 0; j < length; j++) {
            int rIndex = rnd.nextInt(2);
            switch (rIndex) {
                case 0:
                    // a-z(소문자)
                    temp.append((char) ((int) (rnd.nextInt(26)) + 97));
                    break;
                case 1:
                    // A-Z(대문자)
                    temp.append((char) ((int) (rnd.nextInt(26)) + 65));
                    break;
            }
        }


        String str = temp.toString();

        if(!map.containsKey(str)) {
            map.put(str, rnd.nextInt());
            i++;
        }
    }

    long end = System.currentTimeMillis();

    System.out.println("Setup Performance : " + (end - start));

我的代码用了 28023 毫秒来生成 700 万个不重叠的字符串。

标签: javastringalgorithmrandom

解决方案


A-Z因此,您希望从一组 52 个字符(和a-z)中生成 700 万个字符串,每个字符串包含 2 到 4 个字符。

一些简单的数学运算告诉我们,有 2,704 个可能的 2 字符字符串、140,608 个 3 字符字符串和 7,311,616 个可能的 4 字符字符串。总共有 7,454,928 个可能的字符串。

因此,创建一个包含从 0 到 7,454,927 的所有数字的数组。洗牌,从数组中挑选前 700 万个。

当然,您必须编写代码将该数字转换为您的输出字符串之一。这很容易。0 是“AA”,51 是“Az”,52 是“BA”。您基本上是在进行整数到字符串的转换。

这是基本的想法。您必须转换为 Java。

arraySize = 7454928
numbers = new array[arraySize]

// populate array
for i = 0 to arraySize-1
    numbers[i] = i

shuffle(numbers)

for i = 0 to 7000000
    code = convertNumberToString(numbers[i])
    print code


convertNumberToString(n)
    Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    outputString = ""
    while (n > 0 || outputString.length < 2)
      result = n / 52 // length of alphabet
      remainder = n % 52;
      outputString.append(Alphabet[remainder])
      n = result;
    // outputString now contains the characters,
    // but they're reversed. So reverse the string.
    return outputString.reverse()

推荐阅读