使用LinkedList <biginteger> </biginteger>

时间:2011-04-25 12:54:34

标签: 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 */
}

这意味着将链表中的所有节点设置为活动(1) 变量c和b也是大整数 我从VS10得到的错误是:

  

无法将类型'System.Numerics.BigInteger'隐式转换为'int'。存在显式转换(您是否错过了演员?)

问题:

  1. 有可能完成吗?
  2. 如何使用BigInteger(非int)标记所有节点数?
  3. 还有其他更好的方法来完成这件事吗?
  4. 更新
    在示例中,我使用c ++作为计数器。虽然这是可变的。
    节点列表可能如下所示:

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

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

4 个答案:

答案 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>值,则可以使用truefalse。或者,如果您不需要区分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*