问题:对于一个包含n个元素的集合来说,k分为数就是指能把有序集合分成k个等大小集合的“k-1个顺序统计量”,给出一个能找出某一集合的k分位数的O(nlogk)的算法。
首先k要整除n,这样才可以分为k个等大小的集合。若将一个大小为n的集合按照顺序排好,我们所要求的这k-1个数就是要把这个集合平均分为k个集合。例如集合A= { 8, 4,0, -89, -12, 0, 36, 789, 21},将集合排序后A={-89,-12,0,0,4,8,21,36,789};若k=3,则将集合分为{-89,-12,0},{0,4,8},{21,36,789}那么2个顺序统计量为0,8
设d=n/k,于是这k-1个数是集合A中第d,2d....(k-1)d小的数。我们知道利用Select算法(选择的O(n)算法)找出第i小的数算法复杂度为O(n),那么逐一的找出这k-1个数时间为O(nk),而题目给出的时间是O(nlogk).于是需要结合二分的思想。 首先将第(k/2)*d小的数找出来放在A中正确的位置(数组A[0...n-1],则它正确的位置下标为(k/2)*d-1)),然后数组A[o..n-1

本文介绍了一种高效的O(nlogk)算法来找出一个包含n个元素的集合的k分位数。该算法通过利用Select算法并结合二分思想,能够快速找到将集合平均分为k个子集所需的k-1个顺序统计量。
最低0.47元/天 解锁文章
7571

被折叠的 条评论
为什么被折叠?



