线性的时间内选择出rank n的元素
来源:互联网 发布:mac pro type c 编辑:程序博客网 时间:2024/06/05 09:56
/*
2013年10月3日
by --- acton
在线性的时间内选择出rank n 的元素,一般来说找最值是特殊的情况,但是这里列出的算法是查找一般的情况,也适用于最值的情况
这个算法是基于快速排序上面的Partition上写的,但是这个算法的递归树却是 T(n) = T(n/2) + O(n), 解得递归树的运行的时间为O(n)
把问题的规模每次都缩小,但是也有极端的情况,与快速排序的原因一样,也是由于pivotkey的选取的原因可能导致划分出现一边没有元素,
另一边为n-1个元素,则T(n)= T(n-1) + O(n) 同样会是O(n2)的复杂度
说到找特殊值的话,这里说下找最小和最大值分析:
做法一:
void Select(int A[], int p ,int r ){
int Max = -INFINITY;
int Min = INFINITY;
for (int i= 0 ; i < N ; i ++ ){
if (A[i] < Min){
Min = A[i];
}
if (A[i] > Max){
Max = A[i];
}
}
}
做法二:
解法一中需要比较2(n-1)次,它的做法是把每一个元素与最大和最小值都进行了比较,现在我们每次成对的处理元素,先将输入的一对元素做两两之间的比较
然后把两两中较大的与MAX比较,较小的与MIN比较,这样的话,总共只需要比较3(n/2)次就可以得到最终的结果了
*/
2013年10月3日
by --- acton
在线性的时间内选择出rank n 的元素,一般来说找最值是特殊的情况,但是这里列出的算法是查找一般的情况,也适用于最值的情况
这个算法是基于快速排序上面的Partition上写的,但是这个算法的递归树却是 T(n) = T(n/2) + O(n), 解得递归树的运行的时间为O(n)
把问题的规模每次都缩小,但是也有极端的情况,与快速排序的原因一样,也是由于pivotkey的选取的原因可能导致划分出现一边没有元素,
另一边为n-1个元素,则T(n)= T(n-1) + O(n) 同样会是O(n2)的复杂度
说到找特殊值的话,这里说下找最小和最大值分析:
做法一:
void Select(int A[], int p ,int r ){
int Max = -INFINITY;
int Min = INFINITY;
for (int i= 0 ; i < N ; i ++ ){
if (A[i] < Min){
Min = A[i];
}
if (A[i] > Max){
Max = A[i];
}
}
}
做法二:
解法一中需要比较2(n-1)次,它的做法是把每一个元素与最大和最小值都进行了比较,现在我们每次成对的处理元素,先将输入的一对元素做两两之间的比较
然后把两两中较大的与MAX比较,较小的与MIN比较,这样的话,总共只需要比较3(n/2)次就可以得到最终的结果了
*/
如下的代码中我先对与要进行选择的相同的一个数组进行快速排序(未实现RANDOMIZE),打印结果,以便查看Select的正确与否,然后在进行Select选择打印
# include <stdio.h># define N 7void Exchange(int * p ,int * q){int temp = * p ;*p = *q;*q = temp;}int Partition(int A[], int p, int r){int pivotkey = A[r];int i = p - 1;for (int j = p ; j < r ; j ++ ){if ( A[j] <= pivotkey ){i ++ ;Exchange(&A[i],&A[j]);}}Exchange(&A[i+1],&A[r]);return i+1;}int Select(int A[], int p , int r , int i){if (p == r){return A[r];}int pivotkey = Partition(A,p,r);int k = pivotkey - p +1;if (i == k){return A[pivotkey];}else if (i < k){return Select(A,p,pivotkey-1,i);}else{return Select(A,pivotkey+1,r,i-pivotkey);}}void Quick_Sort(int A[], int p, int r){if (p < r){int pivotKey = Partition(A,p,r);Quick_Sort(A,p,pivotKey-1);Quick_Sort(A,pivotKey+1,r);}}int main(void){int A[] = {9,2,8,10,28,67,3};int B[] = {9,2,8,10,28,67,3};Quick_Sort(B,0,6);for(int i = 0 ; i < 7 ; i ++){printf("%5d ",B[i]);}putchar(10);int rank ;while (1){scanf("%d",&rank);if (rank > N){printf("error rank of range !\n");continue;}printf("%5d \n",Select(A,0,6,rank)); }return 0;}
- 线性的时间内选择出rank n的元素
- toj2861_Divisors_线性时间内计算n前约数的总和
- 在O(n)时间内找出最小的k个元素
- 选择算法-在线性时间内选择任意第几个小(大)的数
- 列举出一段时间内内占用的cpu最多的n个进程
- 通过划分的方式在线性时间内找出一个序列中第K大的元素
- 线性时间内从一个数组中找出第K个最小的元素
- 检索出一段时间内的所有节假日
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 在O(n)时间内找到数组中的第i小的元素
- O(n)时间内查找到无序数组当中的第二大元素
- 编写程序,在O(n)时间内从数组x[0..n-1]中找出第k个最小的元素?
- 线性时间内从一个数组中找出第K个最小的元素——编程珠玑
- 返回线性链表的倒数第n个元素
- 最坏情况下为O(N)的线性时间选择
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- BNU16495:Light Bulbs
- 编程之美:二进制中的1
- Linux内核设计艺术笔记(一)
- 弯曲的手指
- JavaIO之Stream
- 线性的时间内选择出rank n的元素
- 数据结构中的表达式求值
- tnsの設定
- JavaIO之管道(二)
- 队列的不同存储结构及JAVA实现
- 突发奇想
- CERC2012 j - Conservation 有条件的维护拓扑序列
- nandflash的操作方法
- mysql用户管理