中值统计

这篇主要来讨论下下面这个问题的解法:

无序的整数序列,找出其中值,或者第 K 小的元素!

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

期望为O(n)的算法

沿着 “将正确的元素放置到第k小的位置上” 这个思路,注意到 “位置” 这个关键词,是可以联想到在 排序算法 中讲到的一个随机划分的算法的,即任何一个元素通过对数组一次遍历操作都可以将其放置到正确的位置上。似乎看到了希望,那我们就使用这个子算法呗。当随机划分子算法的返回值恰好等于k时,我们就找对了元素,如果不相等时,那么就是用递归继续往下找,因为有一部分元素里面肯定是不会再存在我们想找的元素了!下面是算法的示意图:

下面是该算法的C语言实现!

int partition(int *A, int p, int q)
{
    int tmp = A[p];
    int r = p;
    int i;

    for (i = p + 1; i < q + 1; i++)
    {
        if (A[i] < tmp)
        {
            r += 1;
            swap(A[r], A[i]);
        }
    }

    swap(A[p], A[r]);
    return r;
}

int findKthElement(int *A, int p, int q, int k)
{
    if (p == q)
        return A[p];

    r = partition(A, p, q);
    if (r == k)
        return A[k];

    else if (r > k)
        return findKthElement(A, p, r, k);

    else
        return findKthElement(A, r, q, k-r+1);
}

简单的来分析下算法: 这个算法具有很大的随机性,如果足够幸运的话,每次划分正好是中值,那么算法就结束了。复杂度为O(n). 但是如果不那么幸运,每次划分的元素移动的步长为1, 即 T(n) = T(n - 1) + O(n), 那么该算法复杂度就为O(n^2). 但是就平均意义而言,该算法的时间复杂度期望值为O(n)。 证明可以参考算法导论。

O(n) 算法

那么在理论上有没有就是 O(n) 复杂度的算法呢? 还真是被一群 大师级 的人物给发明出来了。想要获取 O(n) 复杂度的关键在于 随机元素的选取,如果能够选到合适的随机元素,那么这个问题就 迎刃而解了! 下面是该算法选取随机元素的示意图:

下面计算这个算法的复杂度,T(n) = T(a · n) + T(n / 5) + O(n). 只要这个系数 a 小于4/5,那么这个算法就是线性的复杂度。这种划分方式到底有没有起到这个效果呢? 通过示意图来看,利用比较的传递性,最终取出来的中值是介于图中两块棕色区域内元素之间的。那么就可以计算这个取出来的中值大概在整个序列的哪个范围之内。当n足够大时,这样的划分方法至少能取得 7/10 的效果。所以从分析上来看,这个算法是线性复杂度。

中值编程实例

下面是一条摘自 LeetCode 上有关中值的练习题

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

关键在于 O(log(m+n)) 的算法复杂度要求,但其实并不难,下面是我的一种解法。

+code
时间: 2024-08-04 00:27:12

中值统计的相关文章

顺序统计中值

问题描述:无序找第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 =

中值滤波与图像锐化

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

在Elasticsearch中实现统计异常检测器——第一部分

Implementing a Statistical Anomaly Detector in Elasticsearch - Part 1 该图显示了4500万个数据点的最小/最大/平均值(超过600小时的75,000个单独时间序列).这个图表中有八个大型的模拟中断,你能发现吗? 没有? 没关系,我也不行.当你将所有数据汇总到一个图表中时,你所有的数据变化往往可以平滑表示,除了最明显的变化.相比之下,这是从组成第一个图形的75,000系列中随机选择的: 这些单独的图表明确的显示可能发生中断的地方

平均值mean,众数mode,中值median 和 标准差stddev

平均值mean,众数mode,中值median 和 标准差stddev 均值,众数,中位数,标称差: 均值是就全部数据计算的,它具有优良的数学性质,是实际中应用最广泛的集中趋势测度值.其主要缺点是易受数据极端值的影响,对于偏态分布的数据,均值的代表性较差.作为均值变形的调和平均数和几何平均数,是适用于特殊数据的代表值,调和平均数主要用于不能直接计算均值的数据,几何平均数则主要用于计算比率数据的平均数,这两个测度值与均值一样易受极端值的影响. 一般代表算术平均值.也就是:比如 众数是一组数据分布的

数字图像处理------中值滤波

一 中值滤波概念 中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1]: 如:以3*3的领域为例求中值滤波中像素5的值 图1 1)int pixel[9]中存储像素1,像素2...像素9的值: 2)对数组pixel[9]进行排序操作: 3)像素5的值即为数组pixel[9]的中值pixel[4]. 中值滤波对处理椒盐噪声非常有效. 二 中值滤波代码实现 项目工程:https://github.com/ranjiewwen/Everyday_Prac

中值滤波的快速算法

我想学过图像处理的人没有人会不知道中值滤波的,最早的时候我是在冈萨雷斯的图像处理课本[1]中学到的,后来在看Sonka的书[2]的时候又看到了中值滤波的介绍,下面我试着结合课本所学和网上的资料自己整理一篇中值滤波的介绍. Jeremy Lin 中值滤波器是一种统计排序滤波器,由Tukey于1971年在文献[3]中提出.所谓的统计排序滤波器是一种非线性的空间滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后用统计排序结果决定的值代替中心像素的值.除了中值滤波器外,最大值滤波器和最小值滤

周期噪声频域滤除、散粒噪声中值滤波

对周期噪声,使用频域方式滤波.使用FFT将其变换到频谱域对恒定频率的信号滤除. 对散粒噪声,使用中值滤波.设定5x5的模板统计排序,选取其中值替代模板的中心位置的值. I=imread('D:\文件及下载相关\图片\child.jpg'); G = rgb2gray(I); [M,N]=size(G); F = fft2(G); F1 = fftshift(F); F2 = log(1+abs(F1)); x = 0:(M-1); y = 0:(N-1); [Y,X] = meshgrid(y,

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

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

最快的3x3中值模糊

10.1国庆后,知名博主:laviewpbt  http://www.cnblogs.com/Imageshop/ 发起了一个优化3x3中值模糊的小活动. 俺也参加其中,今天博主laviewpbt  共享了一份不错的CLAHE代码. free精神,真心为其点赞. 故俺也分享这份最快的3x3中值模糊的代码. /// 编写者: laviewpbt, 编写时间: 2015.10.16, 联系QQ: 33184777 /// <summary> /// 快速的实现3*3大小的中值模糊,边缘1像素未做处