java - 生成 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 万个不重叠的字符串。
解决方案
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()
推荐阅读
- ios - 如何创建只接受数字和单个点的 SwiftUI TextField?
- c - 高级数字模式
- ios - 反序列化 BinaryData 并映射到对象
- memory - Redis - 在插入失败之前监控最大内存?
- highcharts - 当我向下钻取和向上钻取自定义事件(上下文菜单)不起作用时,highchart 自定义菜单
- iframe - 3D 安全认证 iframe 高度
- c# - 使用表达式树通过C#在分组后生成带有总和的选择语句
- node.js - 我在哪里可以在我的谷歌云服务器中创建文件夹“上传”来存储上传的文件?
- php - 根据 SQL 数据库中的日期可用性更改课程的日历
- python - 将多个工作表从 excel 附加到 pandas 数据框 - 排序问题