我有一個包含一些重複值(雙的)中存在的與奔跑穿插重複值的運行列表對象改變價值。我想減少這個List對象佔用的內存空間,而不損害索引和值之間的關聯。我也想盡可能地保持O(1)算法查找時間,使用索引作爲查找。例如,如果您有一個包含元素{0,0.1,0.1,0.1,0.2}的列表,那麼如果給定索引1,2或3,則新對象/實體將始終返回0.1。我希望我需要創建我自己的對象(也許實現IList),或者使用現有的對象。我有一個關於如何實現這個算法O(log(m))的想法,其中,m是相同值的運行次數(在我的例子中,只有1次運行)。但是,如果可能的話,我寧願不推出自己的產品。
這樣的對象是否存在用於C#,還是我需要滾動自己的?
動機/長版:
我有一個是做一些繁重的科學計算的桌面應用程序。這些計算會生成大量數據,並且這些數據是基於時間組織的。也就是說,對於時間50,存在變量x,y和z的值。對於時間51,存在變量x,y和z的另一個值。我有一個包含所有計算運行時間的列表。每個變量都有一個List,其索引與時間列表的索引相同。也就是說,如果您查看時間數組的索引234,則可能會得到時間46(秒)。然後,在時間46(秒)的每個變量的計算將在該變量的列表的索引234處找到。
大約有100,000個這樣的變量(因此有100,000個列表),但只有一次列表。我也期望增加更多的變量。這顯然是一個記憶問題。 (目前至少有200 MB左右的原始空間:-))。這也應該解釋爲什麼我想使用索引作爲在特定時間查找某個變量的值的方法。
變量在前x個插槽中只有0的情況是相當典型的。或者在索引y之後,變量保持不變直到結束。我想說的是,對於值恆定的期間數的最壞情況,可能在單個列表中約爲30,但更通常在2和5之間。每個陣列中的總值的數量通常可以是約250.
編輯:
請注意,我期望添加更多的變量比100,000,所以這是比只有200 MB更大的問題。爲了解釋更多的動機,我的應用程序目前運行在大約1 GB以上,並且我看到200 MB作爲降低內存使用率的低成本成果。
EDIT2:
我認識到一個非常重要的編輯對我explanation-我上面editted它和這裏解釋。這些列表可能會在其中運行,但它們也具有值從索引變爲索引的部分。因此,我可能列出的一個更好的示例是:
0 0 0 0 0 0 ....(50個重複的0)... 0.1 0.2 0.4 0.5 0.6 ...(50個更改的值) ... 200.45 200.45 200.45 200.55 ...(50更多重複值)....等
使用二進制查找的排序列表可能對您有用... – Lucas 2013-03-25 19:34:51
跳過列表會給您O(log n)查找時間。我在C#中發佈了一個跳過列表實現。請參閱http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=876。但是,跳過列表的開銷可能會否定短列表的壓縮節省。 – 2013-03-25 20:17:22