寻找最小的K个数 python实现
2014-11-11 09:25
225 查看
寻找最小的k个数
题目描述:5.查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
思路来自结构之法http://blog.csdn.net/v_july_v/article/details/6370650
方法一:
建K个元素的最大堆,Xmax为堆顶元素,然后遍历余下的n-k个元素,如果大于Xmax,与其交换,更新堆。所以时间复杂度为O(n*logk)
方法二:
类似快速排序。如果主元随机选取或者五化中项的中项,时间复杂度可以达到O(n)。
下面的算法不是找最小的k个值,而是寻找第k大的值,找到了第k大的值,因为之前已经经过了快拍,所以找到最小的k个值也就不难了,时间复杂度可以达到线性的复杂度。详情请参考http://blog.csdn.net/v_july_v/article/details/6403777。
首先利用快速排序将数组A化分为A[0:m],A[m+1,length-1]
题目描述:5.查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
思路来自结构之法http://blog.csdn.net/v_july_v/article/details/6370650
方法一:
建K个元素的最大堆,Xmax为堆顶元素,然后遍历余下的n-k个元素,如果大于Xmax,与其交换,更新堆。所以时间复杂度为O(n*logk)
#!/usr/bin/env python # -*- coding: utf-8 -* #查找最小的k个树 def heapAdjust(A, i, length): pa = i child = 2*i + 1 tmp = A[i] while child < length: if child < length-1 and A[child] < A[child+1]: child += 1 if A[pa] >= A[child]: break else: A[pa],A[child] = A[child],A[pa] pa = child child = 2*pa + 1 def findKmin(A, k, length): for i in range(k/2)[::-1]: heapAdjust(A, i, k) print 'The heap is :', A[:k] for i in xrange(k,length): if A[i] < A[0]: A[i],A[0] = A[0],A[i] heapAdjust(A, 0, k) print 'The result is :', A[:k] if __name__ == '__main__': A = [6,3,7,2,9,1,4,5,11,10,8] lens = len(A) findKmin(A, 10, lens)
方法二:
类似快速排序。如果主元随机选取或者五化中项的中项,时间复杂度可以达到O(n)。
下面的算法不是找最小的k个值,而是寻找第k大的值,找到了第k大的值,因为之前已经经过了快拍,所以找到最小的k个值也就不难了,时间复杂度可以达到线性的复杂度。详情请参考http://blog.csdn.net/v_july_v/article/details/6403777。
首先利用快速排序将数组A化分为A[0:m],A[m+1,length-1]
if par == k-1: return A[par] elif k-1 < par: return findKth(s, 0, par-1, k) else: return findKth(s, par+1, n, k)完整代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*
#利用q_select查找第k大的值
def partition(s, m, n):
#s is a list
key = s[n-1]
l,r = m,n-2
while True:
while l <= n-2 and s[l] <= key:
l += 1
while r>= m and s[r] > key:
r -= 1
if l < r:
s[l],s[r] = s[r],s[l]
else:
break
s[l],s[n-1] = s[n-1],s[l]
return l
def medin3(s, m, n):
md = m + (n-m)/2
if s[m] > s[md]:
s[m],s[md] = s[md],s[m]
if s[m] > s
:
s[m],s
= s
,s[m]
if s[md] > s
:
s[md],s
= s
,s[md]
s[md],s[n-1] = s[n-1],s[md]
return s[n-1]
def findKth(s, m, n, k):
if k-1 > n or k-1 < m:
return False
if m<=n:
medin3(s, m, n)
par = partition(s, m, n)
if par == k-1: return A[par] elif k-1 < par: return findKth(s, 0, par-1, k) else: return findKth(s, par+1, n, k)
if __name__ == '__main__':
A = [6,3,7,2,9,1,4,5,11,10,8]
lens = len(A)
print findKth(A, 0, lens-1, 6)
相关文章推荐
- [转] python实现最小功能的 ftp server
- 编程之美——寻找最大的K个数(最小堆实现)
- 寻找回文数的python的实现
- 最小生成树,克鲁斯卡尔算法(Python实现)
- 最小生成树,普里姆算法(Python实现)
- python实现最小功能的 ftp server
- 最小二乘法 多项式曲线拟合 原理公式理解 Python 实现
- 寻找最小生成树的kruskal算法的java实现
- 用Python实现Dijkstra算法用来寻找两点之间的最短路径 (Implementation of Dijkstra in Python)
- Python实现计算最小编辑距离
- 寻找最小的k个数(采用维护n个元素的最小堆的方法来实现)
- python 实现求和、计数、最大最小值、平均值、中位数、标准偏差、百分比。
- Graph的算法实现: 寻找一幅图的最小生成树(MST)
- 寻找所有的素数的python实现
- Python 实现查找的几种类型 (线性查找,线性有序查找,线性查找最小值,二分查找)
- python实现prim 最小生成树算法
- 寻找前k个最小元素——用最小堆实现…
- python实现获取序列中最小的几个元素
- 最小二乘法 python实现
- Python实现计算最小编辑距离