Mix*_*oid 0 c# linked-list biginteger
我已经挣扎了一段时间,但是我无法修复错误.
我在没有任何成功的情况下搜索了互联网,并开始徘徊,如果有可能我想完成的事情.
我希望创建一个包含大量节点的数组,这么大,我需要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 */
}
Run Code Online (Sandbox Code Playgroud)
这意味着将链表中的所有节点都设置为活动状态(1).
变量c和b也是大整数.
我从VS10得到的错误是:
无法将类型'System.Numerics.BigInteger'隐式转换为'int'.存在显式转换(您是否错过了演员?)
问题:
更新
在示例中,我使用c ++作为计数器.这是可变的......
节点列表可能如下所示:
numberlist[2]
numberlist[3]
numberlist[200]
numberlist[20034759044900]
numberlist[23847982344986350]
Run Code Online (Sandbox Code Playgroud)
我将删除已处理的节点.最多我将使用1,5GB的内存.
请回复此更新,我想知道我的想法是否正确.
我也想从错误中吸取教训!
泛型参数LinkedList<T>描述了元素类型,与您可以放入集合中的元素数量无关.
索引到链表也是一个坏主意.这是O(n)操作.
我无法想象你如何拥有更多的元素而不是适合的元素Int64.根本没有足够的内存来支持它.
在64位进程中,您可以拥有2 ^ 31-1个元素,但很可能需要为此创建自己的集合类型,因为大多数内置集合都有较低的限制.
如果您需要超过2 ^ 31个标志,我将创建自己的集合类型,该类型由多个数组支持并对标志进行bitpack.这样你就可以在2GB阵列中获得大约8*2 ^ 31 = 160亿个标志.
如果您的数据稀少,您可以考虑使用HashSet<Int64>或Dictionary<Int64,Node>.
如果您的数据具有相同值的长序列,则可以使用某种树结构或者某些运行长度编码的变体.
如果你根本不需要索引,你可以Queue<T>从头开始使用a 和dequeue.