python堆排序实现TOPK问题】的更多相关文章

# 构建小顶堆跳转def sift(li, low, higt): tmp = li[low] i = low j = 2 * i + 1 while j <= higt: # 情况2:i已经是最后一层 if j + 1 <= higt and li[j + 1] < li[j]: # 右孩子存在并且小于左孩子 j += 1 if tmp > li[j]: li[i] = li[j] i = j j = 2 * i + 1 else: break # 情况1:j位置比tmp小 li…
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前者称为小顶堆(最小堆,堆顶为最小值),后者为大顶堆(最大堆,堆顶为最大值).然而更加特殊的是,通常使用数组去存储堆,而不是二叉树.关于完全二叉树,可以参见另一篇博文http://www.cnblogs.com/eudiwffe/p/6207196.html // Heap is a sepcial…
问题描述 topK算法,简而言之,就是求n个数据里的前m大个数据,一般而言,m<<n,也就是说,n可能有几千万,而m只是10或者20这样的两位数. 思路 最简单的思路,当然是使用要先对这n个数据进行排序,因为只有排序以后,才能按照顺序来找出排在前面的,或者排在后面的数据. 假如说我们用快拍,那么时间复杂度是O(nlogn),但是仔细看题目,会发现实际上不要要将所有的数据就进行排序,因为我们找的是前m个数据,所以对所有数据排序实际上有些浪费了.所以可以想到,只维护一个大小为m的数组,然后扫一遍原…
堆排序就是把堆顶的最大数取出, 将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现 剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束 dataset = [16,9,21,3,13,14,23,6,4,11,3,15,99,8,22] for i in range(len(dataset)-1,0,-1): print("-------",dataset[0:i+1],len(dataset),i) #for in…
堆是完全二叉树 子树是不相交的 度 节点拥有子树的个数 满二叉树: 每个节点上都有子节点(除了叶子节点) 完全二叉树: 叶子结点在倒数第一层和第二层,最下层的叶子结点集中在树的左部 ,在右边的话,左子树不能为空 二叉搜索树: 左边子节点小于父节点,右边子节点大于父节点 堆: 也叫队列,在堆尾插入,在堆头取出 最大堆: 最上边比下边的两个数都大,所有的节点都满足这个规则 最小堆: 父节点一定比两个子节点要小 特征: 堆起始坐标从1开始 如果用列表表示一个堆: 堆的坐标从1开始算 当前坐标是i 左节…
一.topK python实现   def topk(k, lst): top = [0 for i in range(k)] #生成一个长度为K 的有序列表 for item in lst: #循环将要取 排行榜的列表 for i in range(k-1,-1, -1): if item > top[i]: #在top 表中找到他的位置并插入 top.insert(i+1,item) top.pop(0) #删除值最小 索引为0的元素 break #找到了就打断 print(top) ret…
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同算法之间的优劣呢? 主要还是从算法所占用的时间和空间两个维度取考量. 时间维度:是指执行当前算法所消耗的时间,我们通常使用时间复杂度来描述. 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用空间复杂度来描述 因此,评价一个算法的效率主要是看它的时间复杂度…
快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 循环第二步骤直到左索引和右索引碰头,标志值和当期左索引(右)交换,这样一个循环下,就得出一个标志值左边都比它小,右边都比大的数据样本 利用递归,对数据进行上述过程的最终标志值索引分割,分割到递归底层只有两个数,那么上述过程排序就一定有序了 实现要点:随机取标志值,循环右取小.左取大,利用左右索引碰头…
排序NB三人组 快速排序,堆排序,归并排序 1.快速排序 方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”.先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们. 这里可以用两个变量i和j,分别指向序列最左边和最右边.我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”.刚开始的时候让哨兵i指向序列的最左边(即i=1) 指向数字6.让哨兵j指向序列的最右边(即j=10),指向数字8. 首先哨兵j开始出动.因为此处设置的基准数…
算法(Algorithm):一个计算过程,解决问题的方法 程序 = 数据结构+算法 时间复杂度: 当算法过程中出现循环折半的时候,复杂度式子中会出现 O(logn) 时间复杂度小结: 1. 时间复杂度是用来估计算法运行时间的一个式子(是一个单位) 2. 一般来说,时间复杂度高的算法比复杂度低的算法慢 3. 常见的时间复杂度(按效率排序): O(1)<O(logn)<O(n)<O(nlogn)<O(n的平方)<O(n的平方logn)<O(n的立方) 4. 复杂问题的时间复…