顺序统计中值

问题描述:无序找第k小的数?

1、解法一

先排好序,再找第k小个数;返回A[k-1];此解法的时间复杂度为:O(nlogn);

2、解法二

情况一:k = 1 和 k = n 就是找数组的最小值和最大值;

情况二:找出中位数

3、找中位数(随机选择算法)

利用快速排序的原理,一轮排序,有2种情况:

if i = k-1;返回a[i];

if i != k-1;左边/右边递归查找,时间复杂度为:O(n);

具体思想:

分析:在大多数情况下的时间复杂度是:O(n);但是最坏情况,完全顺序下找第k = n-1大数,此时的时间复杂度是:O(n^2);

代码实现

4、线性算法

(1)、划分为5个一组的元素,在找出每一组的中值(对这5个数进行排序,找出中值),时间复杂度:O(n)

(2)、用递归去找这些中值中的那一个中值(中值中的中值);

(3)、此时用这个最中值的下标和k作比较,之后和上面的随机选择算法一样!!!

具体模型如下:

算法分析

找中值和第k小数时间复杂度均为:O(n);比较好的解决了上述最坏时间复杂度为O(n^2)的情况;

  3个元素一组的话,结果不成立;

  5是这个算法能成功的最小数字,7个元素为一组算法也能成立,但是性能不会有所提高;


时间: 2024-10-12 20:26:01

顺序统计中值的相关文章

顺序统计:寻找序列中第k小的数

最直观的解法,排序之后取下标为k的值即可. 但是此处采取的方法为类似快速排序分块的方法,利用一个支点将序列分为两个子序列(支点左边的值小于支点的值,支点右边大于等于支点的值). 如果支点下标等于k,则支点就是查找的值,如果支点的下标大于k,则在左子序列里继续寻找,如果支点下标小于k,则继续在支点右子序列里面继续寻找第(k-支点下标)小的值. c#实现算法如下: public class FindSpecialOrderElement<T> where T : IComparable<T&

顺序统计:寻找序列中的最大最小数

查找输入序列中的最大最小数值,要求时间复杂度为1.5n C#实现如下: public class MinMaxFinder<T> where T : IComparable<T> { public void FindMinMax(T[] array, int startIndex, int endIndex, out T minValue, out T maxValue) { maxValue = array[startIndex]; minValue = array[startI

中值统计

这篇主要来讨论下下面这个问题的解法: 无序的整数序列,找出其中值,或者第 K 小的元素! 思考一会,可能这是最快想到的解法,先对数组排序一趟,然后直接取出第k小的元素.这个算法最低的时间复杂度为 O(nlog(n)). 那有没有更加快的算法呢? 先来简单分析下上面这个算法,显然是多做了无用功.因为只要找到第k小的元素,即只要把第k小的位置上的元素找对就可以.而该方法把所有的元素都放在了正确的位置上,这显示是多做了无用功.那么这个问题肯定也是存在更优的解法的. 期望为O(n)的算法 沿着 “将正确

PHP中数组的foreach遍历顺序跟键值的关系

近两天,在做一个项目,遇到一个该用数据存储ID做键值还是用数据排序SORT_NO做数组键值的问题,考虑到如果使用数据存储ID作为键值放入数组遍历数组时会不会影响排序的问题,经过查询与验证,得到答案:foreach遍历数组的顺序是按照值存入数组的先后顺序进行遍历的,此为线性遍历,不受数组键值的大小顺序影响. 下面写个简单的例子描述一下问题: 数据库存储user:   自增ID 排序号SORT_NO 值VALUE 1 3 张三 2 2 李四 3 1 王五 通过sql语句:“select ID,SOR

顺序统计树

/* * 顺序统计树 */ public class OrderStatisticTree { public static final OsTreeNode NIL = new OsTreeNode(RbColor.BLACK,0); private OsTreeNode root = null; public static void main(String[] args) { OrderStatisticTree ost = new OrderStatisticTree(); //测试插入 o

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

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

基于记忆性的中值滤波O(r)与O(1)复杂度的算法实现

本文参考博客:https://www.cnblogs.com/Imageshop/archive/2013/04/26/3045672.html 原生的中值滤波是基于排序算法的,这样的算法复杂度基本在O(r2)左右,当滤波半径较大时,排序算法就显得很慢.对此有多种改进算法,这里介绍经典 的Huang算法与O(1)算法,两者都是基于记忆性的算法,只是后者记性更强. 排序算法明显的一个不足之处就是无记忆性.当核向右移动一列后,只是核的最左和最右列数据发生了变化,中间不变的数据应当被存储起来,而排序算

中值滤波与图像锐化

本文主要包括以下内容 中值滤波及其改进算法 图像锐化, 包括梯度算子.拉普拉斯算子.高提升滤波和高斯-拉普拉斯变换 本章的典型囊例分析 对椒盐噪声的平滑效果比较 Laplacian与LoG算子的锐化效果比较 中值滤波 中值滤波本质上是一种统计排序滤波器. 对于原图像中某点(i,j), 中值滤波以该点为中 心的邻域内的所有像素的统计排序中值作为(i, j) 点的响应. 中值不同于均值, 是指排序队列中位于中间位置的元素的值,例如=采用3x3 中值滤披 器, 某点.(i,j) 的8 个邻域的一系列像

数字图像处理之快速中值滤波算法

快速中值滤波算法 中值滤波算法: 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪.中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声.这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能.观察窗口中的数值进行排序,位于观察窗中间的中值作为输出.然后,丢弃最早的值,取得新的采样,重复上面的计算过程.中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用.保存边缘的特性使它在不希