国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

[碩.Love Python] BinomialHeap(B堆 & 二項堆)

2019-11-08 19:43:35
字體:
來源:轉載
供稿:網友
class Node(object):    def __init__(self, data):        self.data = data        self.child = None        self.left = None        self.right = None        self.degree = 0    def __str__(self):        return str(self.data)    __rePR__ = __str__class BinomialHeap(object):    MAX_DEGREE = 20    def __init__(self):        self.root = None    def combine(self, heap):        self._dlistCombine(self.root, heap.root)        if heap.root.data < self.root.data:            self.root = heap.root    def insert(self, data):        node = Node(data)        if self.root is None:            self.root = node            self._initSiblingList(node)        else:            self._addSibling(self.root, node)            if data < self.root.data:                self.root = node    def pop(self):        if self.root is None:            raise ValueError('pop from empty heap.')        res = self.root.data        children = self.root.child        siblings = self._dlistDelete(self.root)        self.root = self._rebuild(children, siblings)        return res    def _rebuild(self, children, siblings):        if children is None and siblings is None:            return None        treeArr = [None] * BinomialHeap.MAX_DEGREE        self._combineTrees(treeArr, children)        self._combineTrees(treeArr, siblings)        head = None        treeIterator = iter(treeArr)        for node in treeIterator:            if node:                break        root = head = prev = node        for node in treeIterator:            if node:                prev.right = node                node.left = prev                prev = node                if node.data < root.data:                    root = node        head.left = prev        prev.right = head        return root    def _combineTrees(self, treeArr, head):        if head is None:            return                 node = head        while True:            tmp = node            node = node.right            for i in xrange(tmp.degree, len(treeArr)):                if treeArr[i] is None:                    break                tmp = self._joinTree(tmp, treeArr[i])                treeArr[i] = None            else:                raise Exception('max degree')            treeArr[i] = tmp            if node is head:                break    def _joinTree(self, tree1, tree2):        if tree2.data < tree1.data:            tree1, tree2 = tree2, tree1        self._addChild(tree1, tree2)        return tree1    def _dlistInit(self, head):        head.left = head.right = head    def _dlistCombine(self, head1, head2):        r1 = head1.right        l2 = head2.left        head1.right = head2        head2.left = head1        r1.left = l2        l2.right = r1    def _dlistInsert(self, head, node):        node.left = head        node.right = head.right         node.right.left = node        head.right = node    def _dlistDelete(self, node):        if node.left is node:            newHead = None        else:            node.left.right = node.right            node.right.left = node.left            newHead = node.right        return newHead    _initSiblingList = _dlistInit    _addSibling = _dlistInsert    def _addChild(self, parent, child):        if parent.child is None:            parent.child = child            self._initSiblingList(child)        else:            self._addSibling(parent.child, child)        parent.degree += 1if __name__ == '__main__':    from random import sample    data = range(1, 100000)    data1 = sample(data, 1000)    data2 = sample(data, 20000)    heap1 = BinomialHeap()    map(heap1.insert, data1)    for _ in xrange(100):        print heap1.pop(),    print    heap2 = BinomialHeap()    map(heap2.insert, data2)    heap1.combine(heap2)    print '-' * 80    for _ in xrange(200):

        print heap1.pop(),

劉碩老師Python精品課程:

《Python高級編程技巧實戰》:

http://coding.imooc.com/class/62.html

 

《Python算法實戰視頻課程》:

http://edu.csdn.net/combo/detail/174

 

《Python科學計算—NumPy實戰課程》:

http://edu.51cto.com/course/course_id-5046.html

 

熊貓TV直播間:

http://www.panda.tv/671023


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博野县| 定兴县| 衡南县| 建阳市| 利津县| 昌平区| 广元市| 兰州市| 九寨沟县| 邻水| 海城市| 孟津县| 黔西| 河曲县| 抚顺市| 富蕴县| 迁安市| 金秀| 钟山县| 鹿邑县| 静海县| 靖西县| 萨嘎县| 黑山县| 独山县| 泰来县| 铜鼓县| 鹤庆县| 时尚| 富民县| 桂平市| 正安县| 伊川县| 太谷县| 卓尼县| 郸城县| 巴东县| 乌苏市| 全南县| 兰考县| 安徽省|