查找出现次数大于n/k的重复元素 --- 多重集算法
来源:互联网 发布:淘宝网首 编辑:程序博客网 时间:2024/04/28 20:11
继续前一篇文章...
相对于前一篇文章讲的算法来说,“多重集算法”比较容易理解。
我们把原始数组看成一个多重集,每次从数组中删除k个不同的元素,直到不能再删了为止。那么最后数组中剩余的元素就是候选元素。
例如 {1,2,3,3,4,4,3,5,3} ,这里n=9,k=3。我们要查找出现次数大于n/k=3的元素。
下划线表示被删除的元素:
{1,2,3,3,4,4,3,5,3} =>
{3,4,4,3,5,3}=>
{4,3,3}
然后,再检验4,3在数组中出现的次数是否大于3。算法复杂度是O(n*log(k))。
代码(不包括检验过程,执行完之后,t中就是候选元素):
struct Pair{ int v; mutable int c;};struct Comp{ bool operator()(const Pair& lhs, const Pair& rhs) { return lhs.v<rhs.v; }};void find_repeated_elements(int b[],int n,int k){ int d=0;//表示t中不同的元素个数,也就是t的大小 set<Pair,Comp> t; for(int i=0;i<n;++i) { struct Pair p; p.v=b[i]; p.c=1; set<Pair,Comp>::iterator ret=t.find(p); if(ret==t.end())//在t中没有找到b[i] { t.insert(p); ++d; if(d==k)//t中不同的元素数量达到了k个 { for(set<Pair,Comp>::iterator it=t.begin();it!=t.end();) { if(it->c>1) { --(it->c); ++it; } else t.erase(it++); } d=t.size();//如果t中某些元素被删掉,需要更新d的值 } } else//在t中找到了b[i] { ++(ret->c); } }}
还有一种是“决策树”算法,比“多重集”算法效率更高。我们下回再讲。
- 查找出现次数大于n/k的重复元素 ---非多重集算法
- 查找出现次数大于n/k的重复元素 --- 多重集算法
- java 找出n个元素数组中重复次数最多的数(假设出现次数大于n/2)
- 数组长度为n,其中有k-1个元素出现的次数大于 n/K(k>1),请找出这个K-1元素?
- 笔试面试算法经典-找到数组中出现次数大于N/k的数(Java)
- 数组中找到出现次数大于N/K的数
- 算法之找出数组中出现次数大于n/m的元素
- C++实现数组中找到出现次数大于N/K的数
- 数组与矩阵---在数组中找到出现次数大于一半(N/K)的数
- 求数组中出现次数大于N/2的元素(majority number)
- 从有n个元素的数组中找出出现次数大于n/3次的元素
- 寻找一个主元(出现次数大于总元素的一半)的算法
- 在数组中找到次数大于N/K的数
- 遍历数组查找其中数字出现次数大于一半的
- 算法 n大小的数组中找出出现3/n次数以上的元素
- 查找数组中重复出现的元素
- 算法---N以内2出现的次数
- 去除数组中重复项,并统计重复出现次数最多的元素及重复次数
- java集合和数组
- android Activity 半透明效果
- Windows Phone与Android风格的对比
- Win32ASM学习[15]:加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
- 布局篇-DockPanel布局
- 查找出现次数大于n/k的重复元素 --- 多重集算法
- 人人网JAVA笔试题解答
- win7和ubuntu启动顺序调整
- android 弹出层,窗口
- SQL Server 触发器-----(特殊的存储过程)
- Eclipse 调试器:零距离接触实战技巧
- 理解Inode
- 内存和CPU搭配的基本原则
- 由笔试题引发的知识点