k阶最小堆的python实现
来源:互联网 发布:移动软件开发定义 编辑:程序博客网 时间:2024/06/17 05:27
最小堆从结构上讲是一棵完全树,所谓k阶最小堆,指的是树的阶数为k。最小堆,指的是树中父结点的值均不大于其叶子节点,在使用堆排序时我们进行n(n为结点个数)次就可得到一个有序序列。以下实现了一个k阶最小堆(当k为1时,构建完毕后就已经是有序序列)。
#!/usr/bin/python# -*- coding: utf-8 -*-#ecoding=utf-8class KHeap: def __init__(self, lst=[], k=int(2)): """ uses a Python list to store a heap and an integer to store an order :param lst: a list to store the heap :param k: an integer to store an order,order means the number of nodes with the largest number of children nodes :return: None """ self.list = lst self.size = int(len(lst)) self.order = int(k) self.build(self.list) # self.list.sort() # i = len(src_list) / 2 # # self.size = len(src_list) # # self.list.extend(src_list) # while i > 0 : # self.down(i) # i -= 1 pass def up(self, i) : """ if the child node is smaller than the parent node, the location of the parent and child nodes is exchanged :param i: the index of child node :return: """ i = i - 1 while (i - 1)//self.order >= 0 : if self.list[(i - 1)//self.order] > self.list[i]: self.list[(i - 1)//self.order] , self.list[i] = self.list[i],self.list[(i - 1)//self.order] i = (i - 1)//self.order pass def down(self, i) : """ initialize the time from the beginning of the first node to add :param i: the value of node :return: """ for i_add in range(1,self.order+1): if (i*self.order+i_add) <= self.size - 1: if self.list[int(i)] > self.list[int(i*self.order+i_add)]: # print 'exchange:',self.list[i],self.list[i*self.order+i_add] self.list[int(i)],self.list[int(i*self.order+i_add)] = self.list[int(i*self.order+i_add)],self.list[int(i)] pass def insert(self, v='unkonwn'): """ inserts a new node with value v :param v: the value to insert :return: """ # print ('insert_list:'),(self.list) # print ('value_insert:'),(v) # print type(v) # if type(v) == str: # return None # else: self.list.append(v) self.size = self.size + 1 # self.list.sort() # temp_list = self.list # temp_list.sort() # self.list = temp_list # the default is inserted into the tail node # if the child node is smaller than the parent node, then the up operation is performed self.up(self.size) pass def build(self, src_list) : """ Build a heap :param src_list: :return: """ self.size = len(src_list) self.list = src_list #The last index of a non-leaf node j = (len(self.list) - 1 - 1) // self.order while j >= 0: i = (len(self.list) - 1 - 1) // self.order while i >= 0 : self.down(i) # i = (i - 1)/self.order i = i - 1 j = (j-1)//self.order def remove_min(self): if len(self.list) == 0: return None else: # temp_list = self.list # temp_list.sort() # # self.list = temp_list[1:] #print (self.list[:20]) a = self.list[0] self.list = self.list[1:] self.size = self.size - 1 self.list[0],self.list[self.size-1] = self.list[self.size-1],self.list[0] print self.list i = 0 while i*self.order <= self.size-1: for i_add in range(1,self.order+1): if self.list[int(i)] > self.list[int(i*self.order+i_add)]: print self.list[i] self.list[int(i)],self.list[int(i*self.order+i_add)] = self.list[int(i*self.order+i_add)],self.list[int(i)] i = i*self.order+i_add else: return a return a def check_condition(self, someKey): """ Detects whether all nodes and their child nodes meet the conditions :param someKey:someKey condition :return: """ flag = True i = (len(self.list) - 1 - 1) // self.order flag = True while i >= 0: for i_add in range(1,self.order+1): if (i*self.order+i_add) <= self.size - 1: value_parent = someKey(self.list[int(i)]) value_child = self.list[int(i*self.order+i_add)] if value_parent > value_child: flag = False i = i -1 return flag def __str__(self): """ computes the string representation of the KHeap object :return: tree structure of the heap """ return str(self.list) passdef someKey(n): if n % 2 == 1: return 3*n else: return 8*nmh = KHeap([20,15,9,10,25,26,90,40,200,19,100,70,170,12,27])print mhprint mh.remove_min()print mh.remove_min()print mh.remove_min()print mh.remove_min()## print mh.remove_min(),mh# print mh.remove_min(),mh# print mh.remove_min(),mh# print mh.remove_min(),mh# print mh.remove_min(),mh# for i in range(100000):# print mh.insert(i)# print mh# mh.insert(5)# mh.insert(4)# mh.insert(5)# print mh.remove_min()# print mh
1 0
- k阶最小堆的python实现
- 寻找最小的K个数 python实现
- 用堆排序实现查找最小的K个元素
- 最小的K个数 (最小堆)
- python 算法实现 - 最小堆
- 最小堆的实现
- 最小堆的实现
- 最小堆的实现
- Python 技巧(二) 最小堆实现以及维护一个大小为100的最小堆
- 【算法——Python实现】最小索引堆,最小堆的优化
- 堆排序(最小的K个数)
- 【java】堆排序 最小的k个数
- 堆应用(最小的K个数)
- Python:最小的 k 个数
- 查找最小的k个元素-堆的实现方法(下)
- 寻找数组中最小的k个数 "最小堆方法"
- 最小的K个数 (冒泡和最小堆)
- 求最小的K个数 O(N) 一种实现-基于堆排序
- Web前端复习——Javascript(字符串)
- phpmyadmin导入数据库提示:超出 PHP 限制
- 组件化App配置
- freemaker生成代码
- 寄存器、存储器、内存的区别
- k阶最小堆的python实现
- linux中基于shell脚本的开机自启动
- ubuntu kylin设置共享文件夹
- jsp输出xml保留格式化
- 代理技术简介(三):CGlib动态代理
- IntelliJ IDEA破解方法
- codeforces 118D 记忆搜索
- 仿美团炫酷动画效果的A-Z字母排序侧边库
- Ring Buffer (circular Buffer)环形缓冲区简介(C++版本)