中位数和顺序统计,以线性期望时间做选择

找出一个数组的最大值和最小值是比较容易的,我们只需遍历一次数组即可。但是寻找一个数组的第i小或者第i大,就需要一些技巧使得查找的时间尽可能小。随机化划分选择算法是一个时间复杂度为O(n)的算法。


int fIndmax(int a[],int p,int r,int i)
{
if(p==r)
return a[p];
int q = RandPartition(a, p, r); // A[q]作为主元将A[p...r]进行划分。
int k = q - p + 1; //假设k是要查找的第i小的元素
if(i==k) //如果K=i则主元就是目标元素,如果i<k,则递归地求解左边的序列,如果i>k则递归求解右边的序列
return a[q];
else if(i<k)
{
return fIndmax(a, p, q-1, i);
}
else
return fIndmax(a, q+1, r, i-k);
}

这个算法的缺点是:如果一个数组中又重复元素,那么得到的结果不是我们期望的结果。解决方法是先删除数组中重复的元素,再利用本算法。
应该还有更好地方法!

时间: 2024-12-23 00:59:36

中位数和顺序统计,以线性期望时间做选择的相关文章

算法导论9.2以期望线性时间做选择

#include <stdint.h> #include <time.h> #include <iostream> #ifdef __linux #include <stdio.h> #include <stdlib.h> #endif void swap(int64_t* A, uint64_t i, uint64_t j) { int64_t tmp = A[i]; A[i] = A[j]; A[j] = tmp; } int64_t par

算法导论-顺序统计

目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计量 什么是顺序统计量?及中位数概念 在一个由元素组成的集合里,第i个顺序统计量(order statistic)是该集合第i小的元素.例如,最小值是第1个顺序统计量(i=1),最大值是第n个顺序统计量(i=n).一个中位数(median)是它所在集合的“中点元素”.当n为奇数时,中位数是唯一的:当n

--算法分析与设计--课程作业--【顺序统计】--【采用链表法散列表】--【开放地址法(双重散列)】

本次作业大力感谢以下量 参考信息 经典算法总结之线性时间做选择 http://www.cnblogs.com/javaspring/archive/2012/08/17/2656208.html 11.4 双重散列法 : http://blog.csdn.net/zixiawzm/article/details/6746946 [未完待续]

第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法

package chap09_Medians_and_Order_Statistics; import static org.junit.Assert.*; import java.util.Random; import org.junit.Test; public class SearchAlorithms { /** * 分割(快速排序中对数组的分割) * * @param n * @param start * @param end * @return */ protected static

算法导论 第9章 中位数和顺序统计学

/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */ #include <iostream> #include <ctime> using namespace std; int minimum(int *arr, int len); int randomizedSelect(int *arr, int p, int r, int i); int randomizedPartition(int *arr, int p, int r); void exchange

数据结构与算法 1 :基本概念,线性表顺序结构,线性表链式结构,单向循环链表

[本文谢绝转载] <大纲> 数据结构: 起源: 基本概念 数据结构指数据对象中数据元素之间的关系  逻辑结构 物理结构 数据的运算 算法概念: 概念 算法和数据结构区别 算法特性 算法效率的度量 大O表示法 时间复杂度案例 空间复杂度 时间换空间案例 1)线性表: 线性表初步认识: 线性表顺序结构案例 线性表顺序结构案例,单文件版 线性表的优缺点 企业级线性表链式存储案例:C语言实现 企业级线性表链式存储案例:C语言实现 单文件版 企业级线性表链式存储案例,我的练习  线性表链式存储优点缺点

算法导论--动态顺序统计与区间树

本文的基础是红黑树 算法导论–红黑树 通过在基础的数据结构中添加一些附加信息,来扩张一种标准的数据结构,然后编写新的操作来支持所需要的应用.下面是介绍在红黑树的基础上扩张的数据结构. 1.动态顺序统计 动态顺序统计可以在O(lgn)时间内确定任何的顺序统计量(即在n个元素的集合中,能在O(lgn)的时间内确定第i小的元素),同时也可以在O(lgn)的时间内计算一个元素的秩(即它在中序遍历下的位置顺序). 1 添加附加信息 结点x中加入x.size , size的大小为以x为根的子树(包含x本身)

最大最小值以及前驱后继操作最坏情况都为O(1)的顺序统计树

问题:通过为结点增加指针的方式,试说明如何在扩张的顺序统计树上,支持每一动态集合查询操作MINIMUM,MAXIMUM,SUCCESSOR和PREDECESSOR在最坏时间O(1)内完成.顺序统计树上的其他操作的渐近性能不应受影响. 代码如下: //本程序在原有的红黑树基础上增加了子树结点个数,前驱后继结点以及最大小结点属性. #include <iostream> #include <time.h> using namespace std; #define BLACK 0 #de

《对寻找第i个顺序统计的数》一文的研究。

对于寻找第i个顺序统计的数,可以形式的定义如下: 对于这个问题,最原始的方法就是将1~n个数从小到大排序,然后输出第i个数.用快排的话,时间复杂度就是O(nlogn),但是我们其实可以对快速排序进行优化. 快速排序是以二分的思想,对分出的每边进行排序,然而当我们要求第i个数时,知道在快拍的哪一边的时候,我们还需对快排的另一边排序吗?毋庸置疑,这是不用的,所以这就是优化--只对快排的某一边进行处理. 设对A[L..R]进行划分.首先,按照快排的中心思想,选出(l+r) div 2这个元素作为"支点