编辑:好的,因为很明显我采用了错误的方法,我会解释我打算做什么。总体意图是(作为练习)根据规范验证所有有效的电子邮件地址。这部分是为了生成一部分数据集来验证算法。
作为练习,我正在编写一个能够生成所有可能的电子邮件地址的程序。这将导致 80 81 65 ≈1.4e122可能的项目。我目前正在使用List<T>
来存储生成的项目,但我的理解是它的最大容量为Int32.MaxValue
。我猜测一个正确的解决方案不会涉及List
个List
的{{1}} s。这是我到目前为止所做的。
List
private void GenerateLocalPart()
{
List<string> validLocalSymbols = new List<string>()
{
".", "!", "#", "$", "%", "&", "*", "+", "-",
"/", "^", "_", "`", "{", "|", "}", "~", "\"",
};
List<string> validLocalNumbers = new List<string>()
{
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
};
List<string> validLocalLowercase = new List<string>()
{
"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",
};
List<string> validLocalUppercase = new List<string>()
{
"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",
};
List<string> validLocalPartCharacters = new List<string>();
validLocalPartCharacters.AddRange(validLocalSymbols);
validLocalPartCharacters.AddRange(validLocalNumbers);
validLocalPartCharacters.AddRange(validLocalLowercase);
validLocalPartCharacters.AddRange(validLocalUppercase);
List<string> targetSequence = validLocalLowercase;
int lengthOfStringToGenerate = 5;
int numberOfDifferentSourceCharacters = targetSequence.Count;
List<List<string>> localPart = new List<List<string>>();
List<string> localPartSeed = new List<string>();
localPart.Add(localPartSeed);
foreach (string character in targetSequence)
localPartSeed.Add(character);
for (int i = 1; i < lengthOfStringToGenerate; i++)
{
List<string> bufferList = new List<string>();
localPart.Add(bufferList);
foreach (string lastListString in localPart[i - 1])
foreach (string character in targetSequence)
bufferList.Add(lastListString + character);
}
Console.WriteLine("Break here.");
}
是字符串的最大长度(因此它会生成从1到lengthOfStringToGenerate
的所有组合)。 lengthOfStringToGenerate
最终将localPart
与List
相当。我应该使用不同类型的收藏吗?我应该采取不同的整体方法吗?
答案 0 :(得分:15)
您希望将所有这些数据存储在哪里? List<T>
将始终将其值存储在内存中...但即使您编写了将结果存储到磁盘的内容,您仍然无法保存1.4e122项。你真的接受了这个数字有多大吗?即使每个项目只有一个比特,如果整个宇宙都是一个大硬盘,那么这比宇宙的容量更大。
我听说过以最有意义的方式谈论的最大数据单位是exabyte,即10 18 字节。对于大多数人来说,1 PB(10 15 字节)是非常大量的数据。您正在考虑的是这些数量在微观上看起来很小。
之后你想用做的数据是什么?什么时候你会期望这样的算法真正完成?
答案 1 :(得分:1)
你的项目甚至可能比大型强子对撞机和可能的微型黑洞对现实构成更大的威胁,参见Arthur C. Clarke的'The Nine Billion Names of God'
实际上,鉴于您的算法完全是确定性的,为什么首先存储值?为什么不将它们表示为内存中的IEnumerable流,每次调用Next时都会生成下一个可能的电子邮件地址。到目前为止,您可以存储您的进度(祝您好运)并使用“当前位置”(或者更确切地说是“到达位置”)作为后续运行的生成器的输入。正如乔恩所指出的那样,这不仅仅是一个空间问题 - 总运行时间也要与之抗争(另一个原因可能是使用非持久性,基于拉取的架构 - 假设您可以使用结果,因为它们至少可以使用你会在早期得到一些有用的效果。
可爱的项目,人们自然会想:为什么。