2011-04-25 30 views
0

我一直在努力一段時間,現在出現了一個我無法修復的錯誤。
我搜索了互聯網沒有任何成功,並開始流浪,如果有可能我想完成。LinkedList的使用<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也是bigintegers。
我從VS10得到的錯誤是:

無法隱式轉換類型「System.Numerics.BigInteger」到「廉政」。一個顯式轉換存在(是否缺少強制轉換?)

的問題:

  1. 是否有可能實現?
  2. 如何使用BigInteger(而不是int)標記所有節點的編號?
  3. 有沒有其他更好的方法來完成這件事?

UPDATE
在這個例子中我用C++作爲計數器。這是可變的,但...
節點列表看起來是這樣的:

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

我會刪除處理節點。最多我會使用1,5GB的內存。
請回復此更新,我想知道我的想法是否正確。
我也想從我的錯誤中學習!

+1

我真誠地懷疑你的機器有足夠的內存來衡量BigInteger索引的數組。我誤解了你的要求嗎? – spender 2011-04-25 12:59:48

+0

你的問題仍然沒有多大意義。你如何將這麼多的節點裝入1.5GB?你用他們做什麼?你需要什麼索引? – CodesInChaos 2011-04-25 13:08:18

+0

@CodeInChaos:如果不能將其放入1,5GB內存中,我必須將其分開。但我仍然需要20位數以上的節點號碼。 – Mixxiphoid 2011-04-25 13:10:40

回答

4

從你的更新看來你不想擁有大量的數據,你只是想用巨大的數字爲它們編制索引。如果是這種情況,如果您只想要true/false值,則可以使用Dictionary<BigInteger, int>Dictionary<BigInteger, bool>。或者,如果您不需要區分false和「不收集」,則可以使用HashSet<BigInteger>

+0

我會看字典<> up。感謝提示。 – Mixxiphoid 2011-04-25 13:15:27

+0

@Justin:的確,我只需要0/1。感謝更新! – Mixxiphoid 2011-04-25 13:16:09

+0

這幫了我一把!非常感謝。 – Mixxiphoid 2011-04-25 13:46:54

5

LinkedList<T>的泛型參數描述了元素類型,與您可以放入集合中的元素數目無關。

索引到鏈接列表也是一個壞主意。這是一個O(n)操作。

我無法想象如何擁有比適合Int64更多的元素。沒有足夠的內存來支持它。

您可以在64位進程中擁有超過2^31-1個元素,但很可能您需要爲此創建自己的集合類型,因爲大多數內置集合具有較低的限制。

如果您需要超過2^31個標誌,我會創建自己的集合類型,並支持多個數組和位組。這樣你就可以將大約8 * 2^31 = 160億個標誌放入2GB的陣列中。

如果您的數據稀疏,您可以考慮使用HashSet<Int64>Dictionary<Int64,Node>

如果您的數據具有相同值的長序列,您可以使用某種樹結構或可能使用某種運行長度編碼的變體。

如果你根本不需要索引,那麼你可以只使用一個Queue<T>並從頭開始出列。

2

LinkedList<BigInteger>是一小部分元素,其中每個元素是BigInteger

.NET不允許任何單個數組大於2GB(即使在64位上),因此索引大於int沒有意義。

試着打破你的大陣列成更小的細分市場,其中每個細分市場可以通過int尋址。

+0

但'LinkedList '不是作爲一個單一的數組來實現的,所以它*可能有超過2GB的空間。但我並不是說這是個好主意。 – svick 2011-04-25 13:09:56

+1

@svick:'LinkedList '也沒有有效的索引,所以是的,「不是一個好主意」有點輕描淡寫。 – 2011-04-25 13:14:07

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* 
相關問題