算法导论--在平均线性时间下选择元素

来源:互联网 发布:软件项目实施规范 编辑:程序博客网 时间:2024/04/30 15:03

一般的选择问题比简单的选择最小值要难的多。但是,随着n的增大,它们所消耗的时间都是O(n)。这一次我们介绍一个基于分治法的算法来解决这个问题,叫做随机选择算法,英文名叫,RANDOMIZED-SELECT。这个算法跟快速排序很像,只不过它只在一边执行partition算法。这个区别导致这样的分析:苏日安快速排序的时间复杂度是O(nlgn),但是RANDOM-SELECT算法的平均时间是O(n),在元素都是互不相同的假设下。
RANDOMIZED-SELECT 用RANDOMIZED-PARTITION程序。就像随机化快速排序,这是一个随机化的算法。因为它的部分行为是基于一个随机数产生器产生的随机数的。以下的伪代码返回i th smallest, 即是第i小的元素,在一个数组里。

这里写图片描述

来解释以下:
第1-2行:这里是递归的返回条件之一,当A[p…r]之间包含的只有一个元素的时候,这种情况下,i == 1, 并且我们在第2行就直接返回A[p],就是i th smallest 元素。
第3行:调用随机化partition算法,这时候A[p…q-1]小于等于A[q],并且A[q+1….r]大于A[q]。就像快速排序,我们将A[q]命名为pivot元素
第4行:计算子数组A[p..q]的元素个数k
第5行:检查A[q]是否是i th smallest元素,如果是,就直接返回A[q],否则的话,算法需要决定i th smallest元素在哪个子数组里,A[p…q-1]或者是A[q+1….r]
第7-9行:判断我们想要的元素在哪个子数组,然后递归执行。

时间复杂度:最坏情况下这个算法的时间复杂度是O(n^2),也就是我们特别倒霉,每次划分都划分出了最大的剩下的元素。但是平均情况下,这个算法有着线性的复杂度O(n),这里就不证明了。

阅读全文
0 0