k-选取问题
一、k-选取问题:
给定任意一个可比较的序列,从中找出第k个元素(k从0开始,默认是从小到大的次序)的问题称为k-选取(k-selection)。
k-选取问题有两种退化的情况:
1、0-选取问题即是找出序列的最小值问题。
2、(length-1)-选取问题即是找出序列的最大值问题。
以上两中问题都有最优解,都可以在线性的时间复杂度内求解。
k-选取问题的另一个常见的问题是中位数问题:
严格来说:
1、如果序列的长度为奇数,其中位数为ary[length/2]
2、如果序列的长度为偶素,其中位数为(ary[length/2-1]+ary[length/2])/2
但是可以稍作简化,统一规定序列中位数为索引为length/2的元素。
二、k-选取问题的一般解:
//此非递归的版本实际为减治思想
public static int kSelection(int[] ary,int k){
int length = ary.length;
if (k < 0 || k > length-1) {return -1;}//k值不在范围内
int index,low = 0,high = length-1;
while(true){
index = position(ary, low, high);
if (index == k) {break;}//命中,返回
if (index < k) {//k必然会在index+1和high之间
low = index+1;
}else {//k必然会在low1和index-1之间
high = index-1;
}
}
return index;
}
三、主流数问题
除此之外,还有一个与之稍有关联的问题时序列主流数问题:
若序列中有一半以上的值(此处定义为严格大于一半)同为m,这该值m称为该序列的主流数。
不难发现,如果某序列有主流数m,则经过排序后,ary[length/2]必定等于该序列的主流数。
public static boolean hasMajority(int[] ary){
int length = ary.length;
int index = kSelection(ary,length/2);//k为length/2
int count = 0;
for (int i = 0; i < length; i++) {
if (ary[i] == ary[index]) {
count++;
}
}
return count > length/2;//如果存在主流数,ary[index]重复次数必然大于length/2
}
k-选取问题的更多相关文章
- K最近邻算法
K最近邻(K-Nearest-Neighbour,KNN)算法是机器学习里简单易掌握的一个算法.通过你的邻居判断你的类型,“近朱者赤,近墨者黑”表达了K近邻的算法思想. 一.算法描述: 1.1 KNN ...
- [译]学习IPython进行交互式计算和数据可视化(四)
第三章 使用Python进行数字计算 尽管IPython强大的shell和扩展后的控制台能被任何Python程序员使用,但是这个工具最初是科学奖为科学家设计的.它的主要设计目标就是为使用Python进 ...
- 关于KNN的python3实现
关于KNN,有幸看到这篇文章,写的很好,这里就不在赘述.直接贴上代码了,有小的改动.(原来是python2版本的,这里改为python3的,主要就是print) 环境:win7 32bit + spy ...
- BZOJ 1072: [SCOI2007]排列perm 状态压缩DP
1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...
- 机器学习(二)——K-均值聚类(K-means)算法
最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习,在写这篇文章之前对FCM有过一定的了解,所以对K均值算 ...
- AOE关键路径
这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间. 从而算出活动最早开始的时间和最晚开始的时间,如果这两个时间相等,则为关键路径. 时间复杂度为O ...
- XML中的Xpath解析的例子
/*XPath 术语节点(Node)在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节 ...
- vi使用高级
下面的命令在vi命令模式被激活 h 光标左移一个字符 l 光标向右移动一个字符 j 光标下移一行 k 移动光标线 一.对整行操作 1.复制光标所在行 yy 2.删除光标所在行 dd 3.选中光标所在行 ...
- KNN算法的代码实现
# -*- coding: utf-8 -*-"""Created on Wed Mar 7 09:17:17 2018 @author: admin"&quo ...
- 机器学习实战1-K均值
本例来源于github项目:https://github.com/jakevdp/sklearn_pycon2015/blob/master/notebooks/04.2-Clustering-KMe ...
随机推荐
- 自制VTP实验总结
(packet tracer模拟器) 6.1)实验拓扑 //绿色:通:橙色:不通 //sw0是根桥:全通 Pc0:ip 192.168.1.1 Pc1: ip 192.168.1.2 Pc2:ip 1 ...
- 【ctrl+A】与【ctrl+单击图层缩略图】有什么区别?
如果这图层没有透明区域的话那和ctrl+A的效果是一样的! 但如果图层有不透明区域,那选中的就是图层中所有不透明的区域!
- 转:【Java集合源码剖析】LinkedHashmap源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/37867985 前言:有网友建议分析下LinkedHashMap的源码,于是花了一晚上时 ...
- 团队作业8----第二次项目冲刺(Beta阶段) 第三天
BETA阶段冲刺第三天 1.小会议ing 2.每个人的工作 (1) 昨天已完成的工作 注册账号时时添加了账号相同不能添加的功能,以防两个账号一样的情况: 老师账号注册时添加一个密令: (2) 今天计划 ...
- GUI(JMenuBar+JMenu+JMenuItem)
public class WindowMenu extends JFrame { JMenuBar menubar; JMenu menu,subMenu; JMenuItem item1,item2 ...
- Eclipse安装完findbugs插件后,SVN插件不可用有关问题解决
Eclipse安装完findbugs插件后,SVN插件不可用问题解决: 安装findbugs插件后,SVN插件就消失了.后来从网上查到解决方案:eclipse/configuration目录下的org ...
- 201521123103 《Java学习笔记》 第五次学习总结
一.本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. (1).接口更灵活.更方便,可以方便的为现有的系统添加新的功能. (2).is-a ...
- Java 第十一周总结
1. 本周学习总结 2. 书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访 ...
- 201521123032 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...