Boyer Moore多数投票算法采用了一种漂亮的方法来突出第一遍中可能的多数元素,然后在第二遍中检查其有效性。有没有人知道类似的2通过算法类?尝试搜索但找不到。谢谢 !!你能分享一下这两个传递算法吗?
答案 0 :(得分:2)
如果您正在寻找Boyer-Moore算法的概括,可以使用Karp-Papadimitriou-Shanker提出的算法。
该算法正在寻找频繁的#34;元素,其中"频繁"对于某些1/Θ
,定义为重复Θ \in (0,1)
次。
该算法会生成一个1/Θ
个候选列表,其中一些可能是假阳性,但它永远不会错过候选者。
算法是1遍算法。
如果您可以允许第二次传递数据,则可以轻松验证这些候选人中的哪些确实经常"
算法的伪代码(取自course I TAed):
1. PF = ∅
2. foreach element e∈S {
3. if PF.hasKey(e) { // increase counter
4. PF.value(e)++ // of existing elements
5. }
6. Else {
7. PF.insert(e,1) // insert new element
8. If |PF|== 1/θ { // but if PF is full
9. Foreach key ∈ PF {
10. PF.value(k)-- // decrease all counters
11. if PF.value(k) == 0 { // and remove
12. PF.remove(k) // elements at 0
13. } } } } }
14. Output PF