查询一个数组中字符出现最多频率的算法

因为觉得查询一个数组中字符出现最多频率的算法
这种复杂度非常的不科学... 所以我Google了一下, 然后在stackoverflow上找到了一个问题...algorithm - Find mode of a multiset in given time bound (most multiplicity)所以我想你要问的复杂度应该是查询一个数组中字符出现最多频率的算法
才对...那个算法基本是对的, 不过需要注意的是, 找到出现次数过半的元素会有点问题, 最好是不断划分, 使得长度最大的没有元素出现次数过半的一段的长度小于等于当前出现次数在某一段中过半且出现次数最多的元素出现的次数(妈呀好绕口). 然后, 每次把当前没有出现次数过半的元素, 并且最长的那一段拿来split. 然后对分出的两段分别考虑是否满足 1) 存在出现次数过半的元素 2)是否影响全局的答案.我来证明一下那个做法的复杂度...不过因为很多证明步骤可以直接从快排那里搬过来, 所以写的也比较简略了...(这里假设每次都把所有元素都划分过一次的最坏情况)首先, 整个算法最后的复杂度上界显然是查询一个数组中字符出现最多频率的算法
其中查询一个数组中字符出现最多频率的算法
是最后划分了多少次.而这时候, 感情上每段的长度应该是查询一个数组中字符出现最多频率的算法
, 要让这个长度小于等于查询一个数组中字符出现最多频率的算法
, 那也就是查询一个数组中字符出现最多频率的算法
两边取对数就是查询一个数组中字符出现最多频率的算法
, 但是我们并不需要这个长度小很多(恰好满足就够了), 所以取查询一个数组中字符出现最多频率的算法
.最后的复杂度大概就是 【查询一个数组中字符出现最多频率的算法】 查询一个数组中字符出现最多频率的算法
.并没有证明的很严格..但是感情上大概就这样了...


    推荐阅读