Erlang和C实现O(n)复杂度求中位数

方法类似于快速排序,只是它只处理单侧的情况。

Erlang:这里对于奇数和偶数都是求下中位数

find_median([])  ->error;
find_median(A) ->find_median(A,(len(A)+1) div 2).

find_median([H|T],Idx)  ->Len=len([X||X<-T,X<H]),
                            if Len =:= Idx-1  ->[H];

                               Len  >  Idx-1  ->find_median([X||X<-T,X<H],Idx);

                               Len  <  Idx-1  ->find_median([X||X<-T,X>H],Idx-Len-1)

                            end.
len([]) ->0;
len([_H|T]) ->1+length(T).

c语言版本明天再写…

时间: 2024-10-07 09:07:09

Erlang和C实现O(n)复杂度求中位数的相关文章

Codeforces 558C Amr and Chemistry 全都变相等

 题意:给定一个数列,每次操作仅仅能将某个数乘以2或者除以2(向下取整). 求最小的操作次数使得全部的数都变为同样值. 比赛的时候最后没实现.唉.之后才A掉.開始一直在想二分次数,可是半天想不出怎么推断.后来发现事实上每一个数都能变成的数非常少非常少(最多400个不到).于是想到用数学方法+一点暴力,可惜时间不够了. 也不能全然算是数论题.仅仅是用到了一些数学思想.须要一点预处理,后面的计算中还会用到二分的技巧. 对某个数n,设n = s*2^r(当中s为奇数),则n能变成这样一些数:s*2

后缀数组 DC3构造法 —— 详解

学习了后缀数组,顺便把DC3算法也看了一下,传说中可以O(n)复杂度求出文本串的height,先比较一下倍增算法和DC3算法好辣. DC3 倍增法 时间复杂度 O(n)(但是常数很大)   O(nlogn)(常数较小) 空间复杂度   O(n)    O(n) 编程复杂度    较高   较低 由于在时间复杂度上DC3的常数比较大,再加上编程复杂度比较高,所以在解决问题的时候并不是最优选择.但是学到了后缀数组还是补充一下的好点. DC3算法的实现: 1:先把文本串的后缀串分成两部分,第一部分是后

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B 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)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上

查找第K小的数 BFPRT算法

BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并不了解其细节.本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法. 一 基本思路 关于选择第k小的数有许多方法 将n个数排序(比如快速排序或归并排序),选取排序后的第k个数,时间复杂度为O(nlogn). 维护一个k个元素的最大堆,存储当前遇到的最小的k个数,时间复杂度为O(nlogk).这种方法同样适用于海量数据的处理. 部分的快速排序(快速选择算法)

2015-11-3-Training(for 2014th)

A:(hdu1081) 题意: 求和最大的子矩阵 解决: 先考虑一维数组,可以O(n)复杂度求出 和值最大的连续子序列. 同理,对每一行维护前缀和,然后枚举从 l 列到 r 列,每行的 l 列到 r 列可以通过前缀和O(1)求出,然后对每行的 l 列和r 列之间的和值作为一维数组的元素,O(n)求出答案. 总复杂度 :O(n3) 1 #include <bits/stdc++.h> 2 3 const int MAXN = 133; 4 5 int n; 6 int ma[MAXN][MAXN

lightoj Basic Math 数论基础

这里是除去Beginners Problems后的部分 1020 - A Childhood Game 巴什博奕(Bash Game) #include<bits/stdc++.h> using namespace std; int main(void) { int t,Case=0; int n; char s[10]; scanf("%d",&t); while(t--) { scanf("%d%s",&n,&s); prin

求两个有序数组的中位数

这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下. 首先对leetcode的编译运行吐槽一下:貌似没有超时判断,而且small和large的数据集相差很小.此题一开始我采用最笨的方法去实现,利

LeetCode(3) || Median of Two Sorted Arrays

LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题目内容 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should

循环的角度求均值

为什么会讨论到这么简单的问题? 举几个例子,角度范围为0~360度,0度和360度是重合的,不妨先算法下面角度的均值, [10, 30] = 20 结果正确 [20, 100] = 60 结果正确 [160, 200]= 180 结果正确 [0, 360] = 180 因为360度和0度重合,这个结果貌似不是我们想要的,结果360度才合理 [20, 300] = 160 要能求得均值为340度就好了 不知看出什么问题没有--角度求均值不再是简单的算术均值! 修正的0~360度求均值方案 从上面的