牛骨文教育服务平台(让学习变的简单)
博文笔记

求数组中第k小的数,或者最小的k个数

创建时间:2012-12-07 投稿人: 浏览次数:933

一:利用快速排序的思想,可以在O(n)的时间复杂度下解决问题,

为什么是O(n)呢,它是这么相加的n+n/2+n/4+n/8+...=2n所以是O(n),

这种方法会改变原数组的顺序。

二:另外还有一种nlong(k),特别适合处理海量数据

首先创建一个k大小的容器,这个容器建议使用二叉树,或者最大堆来实现,每次查找容器中最大数,删除最大数,插入新数。操作需要log(k)的时间。所以总的时间复杂度时nlong(k)。

二叉排序树,查找,删除,插入都是log(n)

堆,查找最大只需O(1),删除,插入都是log(n)


还有平衡二叉树,B+,B-树,红黑书,都是二叉排序树的变体,但是更稳定,平衡性更好。


第一种的详细解答如下:

给定线性序集中n个元素和一个整数k1≤k≤n,要求找出这n个元素中第k小的元素。

求数组第7小元素  A[1:9]=[65,70,75,80,85,60,55,50,45]

partition[1:9]=[60,45,50,55,65,85,80,75,70]  j=7 q=5

[6:9]=[85,80,75,70]  j=2

partition[6:9]=[70,80,75,85]  j=2 q=4

[6:8]=[70,80,75]  j=2

partition[6:8]=[70,80,75]  j=2 q=1

[7:8]=[80,75]  j=1


int randomizedSelect(int *a, int L, int R, int k)
   {
      if (L == R) return a[L];
      int i = randomizedpartition(L, R),
      j = i – L + 1;
      if (k <  j) 
          return randomizedSelect(a, L, i - 1, k);
      else
         return randomizedSelect(a, i, R, k – j);
   }

最坏时间复杂度: O(n2)

平均时间复杂度:O(n)




声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。