算法 - 乞讨n中位数(C++)】的更多相关文章

//**************************************************************************************************** // // 求n个数的中位数 - C++ - by Chimomo // // 对于一组有限个数的数据来说,它们的中位数是这种一种数:这群数据里的一半的数据比它大,而另外一半数据比它小. // 计算有限个数的数据的中位数的方法是:把全部的同类数据依照大小的顺序排列. 假设数据的个数是奇数,则中…
出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并不了解其细节.本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法. 一 基本思路 关于选择第k小的数有许多方法 将n个数排序(比如快速排序或归并排序),选取排序后的第k个数,时间复杂度为O(nlogn). 维护一个k个元素的最大堆,存储当前遇…
简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.时间复杂度为O(nlogn) 一.<data structure and algorithm analysis in c>中的实现,测试过,觉得该说明的已经注释  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18…
原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提出,并以他们的名字命名.参考维基上的介绍Median of medians. 算法的思想是修改快速选择算法的主元选取方法,提高算法在最坏情况下的时间复杂度.其主要步骤为: 首先把数组按5个数为一组进行分组,最后不足5个的忽略.对每组数进行排序(如插入排序)求取其中位数. 把上一步的所有中位数移到数组…
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护一个有k个数的大根堆,这个堆代表目前选出的k个最小的数.在堆的k个元素中堆顶元素是最小的k个数中最大的那个. 接下来要遍历整个数组,遍历的过程中看当前数是否比堆顶元素小.如果是,就把堆顶元素替换成当前数,然后调整堆.如果不是,则不做任何操作,继续遍历下一个数.在遍历完成后,堆中的k个数就是所有数组中…
BFPRT算法: 1.介绍: BFPRT算法又叫中位数的中位数算法,主要用于在无序数组中寻找第K大或第K小的数,它的最坏时间复杂度为O(n),它是由Blum,Floyd,Pratt,Rivest,Tarjan提出,它的思想是修改快速选择算法(快排)的主元选取方法,提高在最坏情况下的时间复杂度. 2.具体方法: BFPRT算法主要由两部分组成:快排和基准选取函数.基准选取函数就是中位数的中位数算法的实现,具体来说--就是讲快排的基准选取策略进行了优化,改为每次尽可能的选择中位数作为基准. 所以说算…
题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想,求出第k大的数,然后遍历数组,如果a[i]<a[k],那么a[i]就是前k小的元素之一. 求第k大的元素时间是o(n),求前k小元素时间是o(n),所以总时间是o(n) 代码: /* 求数组最小的k个数,参考算法导论求中位数的k个临近值,首先求出第k小的数,然后o(n)遍历,若<,则是前k小的数…
Lettcode Kth Largest Element in an Array 题意:在无序数组中,寻找第k大的数字,注意这里考虑是重复的. 一直只会简单的O(nlogn)的做法,听说这题有O(n)的算法,于是赶紧找了个博客学习了一波,受益匪浅啊. 以下内容出处http://www.cnblogs.com/informatics/p/5092741.html 查找第K小的数 BFPRT算法 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并不了解其细节.本文…
LeetCode0004 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 思路: 时间复杂度若为O(m+n)的话,先确定nums1和nums2是增序还是倒序: 增序的让指针指向头从头到尾读数据,倒序的话让指针指向末尾,从后往前读: 比较当前读到的两个数值,总是优先将小的那个压入临时数组temp: 判断temp个数是奇数还是偶数,返…
目录 1.TwoSum 2.AddTwoNumbers 4.FindMedianSortedArrays 1.TwoSum 给定一个整数数组nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例:给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回:[0, 1]. 遍历一…