我期待在性能关键代码中计算熵和互信息很多次。作为中间步骤,我需要计算每个值的出现次数。例如:最有效的方法来计数事件?
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.
。当然,明显的方式给此要么使用关联数组或通过排序使用“标准”的排序算法等快速排序输入数组做。对于像字节这样的小整数,代码目前专门用于使用普通的旧数组。
是否有任何聪明的算法比散列表或“标准”排序算法提供的效率更高效,例如关联数组实现,该算法非常支持插入更新或排序算法,这些算法在数据存在时发光很多关系?
注意:非稀疏整数只是可能数据类型的一个示例。我期望在这里实现一个合理的通用解决方案,但由于整数和只包含整数的结构是常见的情况,如果它们非常有效,我会对这些解决方案感兴趣。
不能再想起你上面说的。对数组进行排序,然后顺序遍历它。 – 2010-03-05 04:20:49
也许你可以使用某种Hadoop或Map/Reduce来加速你的算法?除此之外,我什么都看不到。 – kgrad 2010-03-05 04:34:10
@kgrad:我已经完全通过并行化外部循环来充分利用所有内核,因此将此函数的单独执行并行化没有意义。 – dsimcha 2010-03-05 04:37:26