我一直在苦苦挣扎一段时间,因为我无法修复错误 我没有任何成功地搜索互联网,如果有可能实现我想要完成的话就开始徘徊。
我希望创建一个包含大量节点的数组,这么大,以至于我需要BigInteger
我发现LinkedList
最符合我的解决方案,所以我开始使用这段代码。
BigInteger[] numberlist = { 0, 1 };
LinkedList<BigInteger> number = new LinkedList<BigInteger>(numberlist);
for(c = 2; c <= b; c++)
{
numberlist [b] = 1; /* flag numbers to 1 */
}
这意味着将链表中的所有节点设置为活动(1) 变量c和b也是大整数 我从VS10得到的错误是:
无法将类型'System.Numerics.BigInteger'隐式转换为'int'。存在显式转换(您是否错过了演员?)
问题:
更新
在示例中,我使用c ++作为计数器。虽然这是可变的。
节点列表可能如下所示:
numberlist[2]
numberlist[3]
numberlist[200]
numberlist[20034759044900]
numberlist[23847982344986350]
我将删除已处理的节点。最多我将使用1,5GB的内存 请回复此更新,我想知道我的想法是否正确 我也想从错误中吸取教训!
答案 0 :(得分:5)
LinkedList<T>
的泛型参数描述了元素类型,与您可以放入集合中的元素数量无关。
索引到链表也是一个坏主意。这是一个O(n)操作。
我无法想象你如何拥有比Int64
更适合的元素。根本没有足够的记忆来支持它。
在64位进程中,您可以拥有2 ^ 31-1个元素,但很可能需要为此创建自己的集合类型,因为大多数内置集合都有较低的限制。
如果您需要超过2 ^ 31个标志,我将创建自己的集合类型,该类型由多个数组支持并对标志进行bitpack。这样你就可以在2GB阵列中得到大约8 * 2 ^ 31 = 160亿个标志。
如果您的数据稀少,可以考虑使用HashSet<Int64>
或Dictionary<Int64,Node>
。
如果您的数据具有相同值的长序列,则可以使用某种树结构或某些运行长度编码变体。
如果你根本不需要索引,你可以使用Queue<T>
并从头开始出列。
答案 1 :(得分:4)
从您的更新中看来,您似乎不希望拥有大量数据,您只想使用大量数据对其进行索引。如果是这种情况,如果您只想要Dictionary<BigInteger, int>
/ Dictionary<BigInteger, bool>
值,则可以使用true
或false
。或者,如果您不需要区分HashSet<BigInteger>
和“不在收集中”,则可以使用false
。
答案 2 :(得分:2)
LinkedList<BigInteger>
是少量元素,其中每个元素都是BigInteger
。
.NET不允许任何单个数组大于2GB(即使是64位),因此索引大于int
没有意义。
尝试将您的大型数据分成更小的细分,每个细分可以通过int
进行处理。
答案 3 :(得分:2)
如果我可以阅读你的想法,这听起来就像你想要一个由BigInteger
索引的稀疏数组。正如其他人所提到的,LinkedList<BigInteger>
完全是错误的数据结构。我建议完全不同的东西,即Dictionary<BigInteger, int>
。这允许您执行以下操作:
Dictionary<BigInteger, int> data = new Dictionary<BigInteger, int>();
BigInteger b = GetBigInteger();
data[b] = 1; // the BigInteger is the *index*, and the integer is the *value*