分治-寻找第k小的数
给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素
template<class Type>
Type RandomizedSelect(Type a[],int p,int r,int k)
{if (p==r) return a[p];int i=RandomizedPartition(a,p,r),j=i-p+1;if (k<=j) return RandomizedSelect(a,p,i,k);else return RandomizedSelect(a,i+1,r,k-j);
}
在最坏情况下,算法randomizedSelect需要O(n2)计算时间
但可以证明,算法randomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。
如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。
例如,若 ε=9/10 ,算法递归调用所产生的子数组的长度至少缩短 1/10 。所以,在最坏情况下,算法所需的计算时间 T(n) 满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得 T(n)=O(n)
Type Select(Type a[], int p, int r, int k)
{if (r-p<75) {用某个简单排序算法对数组a[p:r]排序;return a[p+k-1];};for ( int i = 0; i<=(r-p-4)/5; i++ )将a[p+5*i]至a[p+5*i+4]的第3小元素与a[p+i]交换位置;//找中位数的中位数,r-p-4即上面所说的n-5Type x = Select(a, p, p+(r-p-4)/5, (r-p-4)/10);int i=Partition(a,p,r, x),j=i-p+1;if (k<=j) return Select(a,p,i,k);else return Select(a,i+1,r,k-j);
}
上述算法将每一组的大小定为5,并选取75作为是否作递归调用的分界点。这2点保证了T(n)的递归式中2个自变量之和n/5+3n/4=19n/20=εn,0<ε<1。这是使T(n)=O(n)的关键之处。当然,除了5和75之外,还有其他选择。
T(n)=O(n)
分治-寻找第k小的数相关推荐
- python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...
python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...
- (寻找第K小的数amp;amp;寻找第K小的数的和)
这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...
- 寻找第K小的数(O(n))
寻找第K小的数,使用的方法有多种.今天,我主要是使用面试中面试官想要的方法.就是运用快排的思想在O(n)时间内得到结果. #include <iostream> #include < ...
- 分治算法求解列表中第k小的数
分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...
- 面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...
- 海量无序数据寻找第 K 大的数
前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...
- C语言寻找第k小元素,小技巧——查找第k小的元素
今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题.题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当 ...
- 7-1 找第k小的数(反思),a++和++a的区别,运算符优先级,递归分制思想
作者 陈晓梅 单位 广东外语外贸大学 设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数. 提示 函数int partition(int a[],i ...
- 算法-寻找第k小元素(C)
序言 刚开始我认为,寻找第k小的元素:简单呀,先对所有元素排序,之后再找不就完事啦,这时时间复杂度在O(nlgn).那有没有更好的排序的方法了呢?答案:当然是有的. 算法基本思路: (1) 当规模小于 ...
最新文章
- 申请硕士学位不必发表论文,清华大学新规登上热搜:不把学术权力交给期刊审稿人...
- EonerCMS——做一个仿桌面系统的CMS(三)
- TCP/IP总结(1)分层
- Flyweight Pattern简单随笔
- 一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?
- make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标
- 字符串、对象、数组操作方法、json方法
- C# 谈谈Interface和通过Interface传递web页面数据
- 百度打造AIR智能道路系统,可降低90%交通事故
- 无代码来了,还要程序员吗?
- 一位软件工程师的6年总结收藏
- 630显卡驱动安装win7_Centos7 显卡驱动安装教程
- 创建dataframe_Spark原理与实战(五) Spark核心数据抽象DataFrame
- 面向对象2:类和对象
- go.mod 文件中的 //indirect
- java根据http url下载图片
- 微信红包随机数字_微信红包随机算法初探
- python 螺旋_用Python生成气候温度螺旋
- linux系统及编程基础唐晓君,Linux-Shell编程之判断文件类型
- Android resource compilation failed