给定线性序集中n个元素和一个整数k1≤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)

l将n个输入元素划分成én/5ù个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共én/5ù个。
l递归调用select来找出这én/5ù个元素的中位数。如果én/5ù是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准。

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=εn0<ε<1。这是使T(n)=O(n)的关键之处。当然,除了575之外,还有其他选择。

T(n)=O(n)

分治-寻找第k小的数相关推荐

  1. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

    python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...

  2. (寻找第K小的数amp;amp;寻找第K小的数的和)

    这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...

  3. 寻找第K小的数(O(n))

    寻找第K小的数,使用的方法有多种.今天,我主要是使用面试中面试官想要的方法.就是运用快排的思想在O(n)时间内得到结果. #include <iostream> #include < ...

  4. 分治算法求解列表中第k小的数

    分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...

  5. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  6. 海量无序数据寻找第 K 大的数

    前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...

  7. C语言寻找第k小元素,小技巧——查找第k小的元素

    今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题.题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当 ...

  8. 7-1 找第k小的数(反思),a++和++a的区别,运算符优先级,递归分制思想

    作者 陈晓梅 单位 广东外语外贸大学 设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数. 提示 函数int partition(int a[],i ...

  9. 算法-寻找第k小元素(C)

    序言 刚开始我认为,寻找第k小的元素:简单呀,先对所有元素排序,之后再找不就完事啦,这时时间复杂度在O(nlgn).那有没有更好的排序的方法了呢?答案:当然是有的. 算法基本思路: (1) 当规模小于 ...

最新文章

  1. 申请硕士学位不必发表论文,清华大学新规登上热搜:不把学术权力交给期刊审稿人...
  2. EonerCMS——做一个仿桌面系统的CMS(三)
  3. TCP/IP总结(1)分层
  4. Flyweight Pattern简单随笔
  5. 一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?
  6. make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标
  7. 字符串、对象、数组操作方法、json方法
  8. C# 谈谈Interface和通过Interface传递web页面数据
  9. 百度打造AIR智能道路系统,可降低90%交通事故
  10. 无代码来了,还要程序员吗?
  11. 一位软件工程师的6年总结收藏
  12. 630显卡驱动安装win7_Centos7 显卡驱动安装教程
  13. 创建dataframe_Spark原理与实战(五) Spark核心数据抽象DataFrame
  14. 面向对象2:类和对象
  15. go.mod 文件中的 //indirect
  16. java根据http url下载图片
  17. 微信红包随机数字_微信红包随机算法初探
  18. python 螺旋_用Python生成气候温度螺旋
  19. linux系统及编程基础唐晓君,Linux-Shell编程之判断文件类型
  20. Android resource compilation failed

热门文章

  1. 物流车辆数据在金融科技的应用
  2. Flink SQL实时数仓开源UI平台
  3. Axure智慧、智能乡镇通数字管理服务平台+基础数据管理+招商后台管理+web端高保真管理后台
  4. 02_入门程序(非注解方式,了解)
  5. Spring+CXF的WebServices简单示例
  6. Hive操作语句实例讲解(帮助你了解 桶 bucket)
  7. DevExpress ActiveX
  8. delphi 的插件机制与自动更新
  9. Spring Boot官网概述
  10. 【Java并发.2】线程安全性