The use of LinkedList<BigInteger>

本文关键字:BigInteger gt use lt LinkedList The of | 更新日期: 2023-09-27 17:53:01

我已经为一个无法修复的错误挣扎了一段时间。
我在网上搜索没有任何成功,开始徘徊是否有可能实现我想要的。

我想创建一个包含大量节点的数组,大到我需要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"。存在显式转换(您是否缺少强制类型转换?)

问题:

  1. 有可能完成吗?
  2. 我如何用BigInteger(不是int)标记所有节点的数量?
  3. 有没有其他更好的方法来完成这件事?


在这个例子中,我使用c++作为计数器。这是可变的…
节点列表如下所示:

numberlist[2]
numberlist[3]
numberlist[200]
numberlist[20034759044900]
numberlist[23847982344986350]

我将删除处理过的节点。我最多将使用1.5 gb内存。
请回复这个更新,我想知道我的想法是否正确。
我也想从我的错误中吸取教训!

The use of LinkedList<BigInteger>

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*