很多時候我發現自己會用Tally[ ]
來計算出現的次數,然後,一旦我放棄了原來的列表,不得不添加(並加入)該計數器列出來自另一個列表的結果。聚合理貨計數器
aggTally[listUnTallied__List:{},
listUnTallied1_List,
listTallied_List] :=
Join[[email protected][listUnTallied, listUnTallied1], listTallied] //.
{a___, {x_, p_}, b___, {x_, q_}, c___} -> {a, {x, p + q}, b, c};
這樣
:當我計數配置,事件,做一些離散統計等
所以我定義了理貨聚集了非常簡單,但好用的功能這通常發生
l = {x, y, z}; lt = [email protected];
n = {x};
m = {x, y, t};
aggTally[n, {}]
{{x, 1}}
aggTally[m, n, {}]
{{x, 2}, {y, 1}, {t, 1}}
aggTally[m, n, lt]
{{x, 3}, {y, 2}, {t, 1}, {z, 1}}
這個函數有兩個問題:
:1)行爲
Timing[Fold[aggTally[[email protected]#2, #1] &, {}, Range[100]];]
{23.656, Null}
(* functional equivalent to *)
Timing[s = {}; j = 1; While[j < 100, s = aggTally[[email protected], s]; j++]]
{23.047, Null}
2)它不驗證的最後一個參數是真正計數的列表或空(對我來說不那麼重要了,雖然)
有一個簡單的,優雅的,更快更有效的解決方案? (據我所知,這是太多的要求,但希望是免費的)
真的很蒼蠅! – 2011-02-28 15:51:03
你的第二個版本非常快。看起來性能問題時,應該非常小心地使用ReplaceRepeated []。 – 2011-02-28 16:02:16
事實上,'ReplaceRepeated'應該小心使用。在我的書中有關於這個主題的小節:http://www.mathprogramming-intro.org/book/node355.html。若要查看其性能相當不錯的示例(由於使用鏈接列表),您可能需要查看此主題:http://groups.google.com/group/comp.soft-sys.math.mathematica/msg/062e206f2372d899。所以,這一切都取決於模式。與ReplaceRepeated一起使用時,具有許多空白的模式通常效率低下。 – 2011-02-28 16:10:56