我已经为一个无法修复的错误挣扎了一段时间。
我在网上搜索没有任何成功,开始徘徊是否有可能实现我想要的。
我想创建一个包含大量节点的数组,大到我需要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 . numeric"。将"BigInteger"转换为"int"。存在显式转换(您是否缺少强制类型转换?)
问题:
- 有可能完成吗?
- 我如何用BigInteger(不是int)标记所有节点的数量? 有没有其他更好的方法来完成这件事?
在这个例子中,我使用c++作为计数器。这是可变的…
节点列表如下所示:
numberlist[2]
numberlist[3]
numberlist[200]
numberlist[20034759044900]
numberlist[23847982344986350]
我将删除处理过的节点。我最多将使用1.5 gb内存。
请回复这个更新,我想知道我的想法是否正确。
我也想从我的错误中吸取教训!
LinkedList<T>
的泛型参数描述元素类型,与可以放入集合中的元素数量无关。
索引到一个链表也是一个坏主意。这是一个O(n)的操作
我无法想象你怎么能有更多的元素,而不是适合Int64
。没有足够的内存来支持。
你可以在64位进程中拥有超过2^31-1个元素,但很可能你需要为此创建自己的集合类型,因为大多数内置集合都有较低的限制。
如果你需要超过2^31个标志,我会创建我自己的集合类型,由多个数组和位包支持的标志。这样你就可以在一个2GB的数组中得到8*2^31 = 160亿个标志。
如果你的数据稀疏,你可以考虑使用HashSet<Int64>
或Dictionary<Int64,Node>
。
如果你的数据有相同值的长序列,你可以使用一些树结构或一些变体的运行长度编码。
如果您根本不需要索引,您可以使用Queue<T>
并从一开始就取消队列。
从你的更新,似乎你不想有大量的数据,你只是想索引他们使用巨大的数字。如果是这种情况,如果您只想要true
/false
值,则可以使用Dictionary<BigInteger, int>
或Dictionary<BigInteger, bool>
。另外,如果您不需要区分false
和" not in collection ",您也可以使用HashSet<BigInteger>
。
LinkedList<BigInteger>
为少量元素,其中每个元素为一个BigInteger
。
。. NET不允许任何单个数组大于2GB(即使是64位),所以索引大于int
是没有意义的。
尝试将你的大数组分解成更小的段,其中每个段可以通过int
寻址。
如果我可以读懂你的想法,这听起来像你想要一个稀疏数组,这是由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*