【发布时间】:2011-01-23 23:31:00
【问题描述】:
我希望在性能关键代码中大量计算熵和互信息。作为中间步骤,我需要计算每个值的出现次数。例如:
uint[] myArray = [1,1,2,1,4,5,2];
uint[] occurrences = countOccurrences(myArray);
// Occurrences == [3, 2, 1, 1] or some permutation of that.
// 3 occurrences of 1, 2 occurrences of 2, one each of 4 and 5.
当然,显而易见的方法是使用关联数组或使用“标准”排序算法(如快速排序)对输入数组进行排序。对于像字节这样的小整数,代码目前专门使用普通的旧数组。
是否有任何聪明的算法比哈希表或“标准”排序算法提供的更有效地做到这一点,例如一个关联数组实现,它非常支持更新而不是插入,或者当你的数据有一个时发光的排序算法很多关系?
注意:非稀疏整数只是可能的数据类型的一个示例。我希望在这里实现一个合理的通用解决方案,尽管由于整数和仅包含整数的结构是常见的情况,如果它们非常有效,我会对特定于这些的解决方案感兴趣。
【问题讨论】:
-
想不出比你上面说的更多。对数组进行排序,然后按顺序遍历它。
-
也许您可以使用某种 Hadoop 或 Map/Reduce 来加速您的算法?除此之外,我什么也没看到。
-
@kgrad:我已经通过并行化外循环充分使用了我所有的内核,所以并行化这个函数的单独执行是没有意义的。
标签: performance algorithm language-agnostic data-structures statistics