[英]Counting the number of occurences of a number in C#
我目前正在使用字典計算事件結果的出現次數,我將其添加如下:
IDictionary<double, double> OutcomeCounter = new Dictionary<double, double>();
public void IncrementDict(IDictionary<double, double> dict, double newKey, double increment = 1)
{
if (!dict.ContainsKey(newKey))
{
dict.Add(newKey, 0);
}
dict[newKey] += increment;
}
然而,這占總模擬時間的 20% 左右,我想知道你們中是否有人對如何減少這個有一些好主意?
模擬產生了 100 億個結果(總計約 50,000 個不同的結果),因此將每個結果存儲在列表中將使用過多的 memory。
提前致謝。
性能問題可能是由於字典中已經存在的數字的單次增量需要三個字典查找。 每個增量的三個字典查找。
第一次字典查找發生在執行dict.ContainsKey(newKey)
時。 第二次和第三次查找發生在dict[newKey] += increment;
(一個查找從字典中獲取要增加的值,另一個查找用增加的值替換舊值)。
一種想法是減少查找次數,理想情況下每次增量只有一次查找。 這意味着,字典中的值一旦存儲就不應更改。
實現這一點的一種方法是使用 arrays (或具有計數值字段的自定義 class 的實例,這可能比使用數組有輕微的性能優勢)用作保存計數值的容器,字典保存那些容器實例。 由於容器實例本身仍然存在並且永遠不會在字典中被替換(只有容器中的計數值會改變),我們只需要一次字典查找即可獲得適當的容器實例。 (當然,當在新鍵下存儲新容器實例時,需要進行額外的查找。)
例如,這可能看起來像這樣。 另請注意,我將計數值的類型更改為long
——我不確定你為什么在這里使用double
,除非你想實現小數增量(但不管是long
還是double
,方法都是一樣的):
IDictionary<double, long[]> OutcomeCounter = new Dictionary<double, long[]>();
public void IncrementDict(IDictionary<double, long[]> dict, double newKey, long increment = 1)
{
if (dict.TryGetValue(newKey, out long[] container))
{
container[0] += increment;
}
else
{
dict[newKey] = new long[] { increment };
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.