查找算法
来源:互联网 发布:淘宝店铺资质60000 编辑:程序博客网 时间:2024/06/06 04:46
http://blog.csdn.net/pipisorry/article/details/50752792
O(n)时间快速选择
算法导论里有讲到,可以参考如下的文章,
http://www.shadowxh.com/?p=598
以及本文的别人的评论
皮皮blog
求无序数组的中位数
中位数即是排过序后的处于数组最中间的元素。 不考虑数组长度为偶数的情况。设集合元素个数为n。
简单的想了下:
思路1) 把无序数组排好序,取出中间的元素
时间复杂度 采用普通的比较排序法 O(N*logN)
如果采用非比较的计数排序等方法, 时间复杂度 O(N), 空间复杂度也是O(N).
思路2)
2.1)将前(n+1)/2个元素调整为一个小顶堆,
2.2)对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。 如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素。重复2.2步
2.3) 当遍历完所有元素之后,堆顶即是中位数。
思路3) 熟话说,想让算法跑的更快,用分治!
快速排序之所以得名"快排",绝非浪得虚名!因为快排就是一种分治排序法!
同样,找中位数也可以用快排分治的思想。具体如下:
任意挑一个元素,以改元素为支点,划分集合为两部分,如果左侧集合长度恰为 (n-1)/2,那么支点恰为中位数。如果左侧长度<(n-1)/2, 那么中位点在右侧,反之,中位数在左侧。 进入相应的一侧继续寻找中位点。
这种方法很快,但是在最坏的情况下时间复杂度为O(N^2), 不过平均时间复杂度好像是O(N)。
思路4) 快排的方法存在不确定性,导致其最坏和最好的时候差别很大, 那么有没有一种确定性的方法呢? 答案是有的,参考前面的O(n)时间快速选择。
引申一:
查找N个元素中的第K个小的元素(来自编程珠玑)
编程珠玑给出了一个时间复杂度O(N),的解决方案。该方案改编自快速排序。
经过快排的一次划分,
1)如果左半部份的长度>K-1,那么这个元素就肯定在左半部份了
2)如果左半部份的长度==K-1,那么当前划分元素就是结果了。
3)如果。。。。。。。<K-1,那么这个元素就肯定在右半部分了。
并且,该方法可以用尾递归实现。效率更高。
时间复杂度分析, 由于差不多每次都是把序列划分为一半。。。假设划分的元素做了随机优化,时间复杂度近似于
N+N/2+N/4.... = 2N*(1-2^-(logN)) 当N较大时 约等于 2N 也就是 O(N)。
看来,快速排需的用处可大着咧。。。
也用来查找可以N个元素中的前K个小的元素,前K个大的元素。。。。等等。
引申二:
查找N个元素中的第K个小的元素,假设内存受限,仅能容下K/4个元素。
分趟查找,
第一趟,用堆方法查找最小的K/4个小的元素,同时记录剩下的N-K/4个元素到外部文件。
第二趟,用堆方法从第一趟筛选出的N-K/4个元素中查找K/4个小的元素,同时记录剩下的N-K/2个元素到外部文件。
。。。
第四趟,用堆方法从第一趟筛选出的N-K/3个元素中查找K/4个小的元素,这是的第K/4小的元素即使所求。
http://siteofaqi.appspot.com/article/52001/%E5%AF%BB%E6%89%BE%E7%AC%ACk%E5%A4%A7%E7%9A%84%E6%95%B0%E7%9A%84O(n)%E7%AE%97%E6%B3%95
[求无序数组的中位数 ]
皮皮blog
from:http://blog.csdn.net/pipisorry/article/details/50752792
ref:
- 查找算法(静态查找)
- 查找算法 二分查找
- 查找算法:二分查找
- 查找算法 - 二分法查找
- 算法--查找--二分查找
- 算法--查找--差值查找
- 查找算法:二分法查找
- 查找算法---二分查找
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法:
- 学会设计状态+注意初始化的边界(1421)
- 虚拟机中使linux系统分辨率变大,能够在虚拟机全屏显示
- 程序员爱上网站[整理]
- Fedora开机直接进入终端界面
- myEclipse设置java编译环境和运行环境
- 查找算法
- Android 四种常用设计模式
- 原理分析之二:框架整体设计
- 针对"您的计算机配置似乎是正确的,但该设备或资源(DNS 服务器)没有响应"问题解决
- 纯JS实现省市县三级联动
- 自定义Android View组件——实现雷达图效果
- ELF文件和BIN文件
- 修改数据表
- Ajax发送和接收请求