我遇到一种情况,我需要创建数以万计的唯一数字。但是这些数字必须是 9 位数字并且不能包含任何 0。我当前的方法是生成 9 个数字 (1-9) 并将它们连接在一起,如果该数字尚未在列表中,则将其添加到列表中。例如。
public void generateIdentifiers(int quantity)
{
uniqueIdentifiers = new List<string>(quantity);
while (this.uniqueIdentifiers.Count < quantity)
{
string id = string.Empty;
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
id += " ";
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
id += " ";
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
if (!this.uniqueIdentifiers.Contains(id))
{
this.uniqueIdentifiers.Add(id);
}
}
}
然而,在大约 400,000 时,由于生成的数字越来越多是重复的,该过程确实变慢了。我正在寻找一种更有效的方法来执行此过程,任何帮助将不胜感激。
编辑:-我正在生成这些-http://www.nhs.uk/NHSEngland/thenhs/records/Pages/thenhsnumber.aspx
正如其他人提到的,使用HashSet<T>
代替List<T>
.
此外,使用 StringBuilder 而不是简单的字符串操作将使您再获得 25% 的收益。如果您可以使用数字而不是字符串,那么您就赢了,因为它只需要三分之一或四分之一的时间。
var quantity = 400000;
var uniqueIdentifiers = new HashSet<int>();
while (uniqueIdentifiers.Count < quantity)
{
int i=0;
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
i = i*10 + random.Next(1,10);
uniqueIdentifiers.Add(i);
}
在我的机器上,处理 400,000 个数字大约需要 270 毫秒,处理 1,000,000 个数字大约需要 700 毫秒。即使没有任何并行性也是如此。
由于使用了一个HashSet<T>
代替List<T>
,该算法的运行时间为 O(n),即持续时间将线性增长。因此,10,000,000 个值大约需要 7 秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)