亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bst.py

?? Harvestman-最新版本
?? PY
字號:
"""bst.py - Basic binary search tree in Python with automated disk caching atthe nodes. This is not a full-fledged implementation since it does notimplement node deletion, tree balancing etc.Created Anand B Pillai <abpillai at gmail dot com> Feb 13 2008Copyright (C) 2008, Anand B Pillai."""import cPickleimport mathimport sysimport osimport shutilimport weakreffrom dictcache import DictCacheclass BSTNode(dict):    """ Node class for a BST """        def __init__(self, key, val, left=None, right=None, tree=None):        self.key = key        self[key] = val        self['left'] = left        self['right'] = right        # Mode flag        # 0 => mem        # 1 => disk        self.mode = 0        # Number of gets        self.cgets = 0        # Number of loads        self.cloads = 0        # Link back to the tree        self.tree = weakref.proxy(tree)            def __getitem__(self, key):        try:            return super(BSTNode, self).__getitem__(key)        except KeyError:            return None            def set(self, value):        self[self.key] = value        if self.mode == 1:            # Already dumped            self.mode = 0            self.dump()                def get(self):                if self.mode==0:            self.cgets += 1            return self[self.key]        else:            self.cloads += 1                        self.load()            return self[self.key]    def is_balanced(self, level=1):        # Return if this node is balanced        # The node balance check is done per        # level. Default is 1 which means we        # check whether this node has both left        # and right children. If level is 2, this        # is done at one more level, i.e for the        # child nodes also...        # Leaf node is not balanced...        if self['left']==None and self['right']==None:            return False        while level>0:            level -= 1                        if self['left'] !=None and self['right'] != None:                if level:                    return self['left'].is_balanced(level) and \                           self['right'].is_balanced(level)                else:                    return True            else:                return False        return False            def load(self, recursive=False):        # Load values from disk        try:            # Don't load if mode is 0 and value is not None            if self.mode==1 and self[self.key] == None:                self[self.key] = self.tree.from_cache(self.key)                self.mode = 0                        if recursive:                left = self['left']                if left: left.load(True)                right = self['right']                if right: right.load(True)                        except Exception, e:            raise            def dump(self, recursive=False):        try:            if self.mode==0 and self[self.key] != None:                self.tree.to_cache(self.key, self[self.key])                self[self.key]=None                self.mode = 1            else:                # Dont do anything                pass                        if recursive:                left = self['left']                if left: left.dump(True)                right = self['right']                if right: right.dump(True)                        except Exception, e:            raise    def clear(self):        # Clear removes the data from memory as well as from disk        try:            del self[self.key]        except KeyError:            pass        left = self['left']        right = self['right']                        if left:            left.clear()        if right:            right.clear()        super(BSTNode, self).clear()class BST(object):    """ BST class with automated disk caching of node values """    # Increase the recursion limit for large trees    sys.setrecursionlimit(20000)            def __init__(self, key=None, val=None):        # Size of tree        self.size = 0        # Height of tree        self.height = 0        # 'Hardened' flag - if the data structure        # is dumped to disk fully, the flag hard        # is set to True        self.hard = False        # Autocommit mode        self.auto = False        # Autocommit mode level        self.autolevel = 0        # Current auto left node for autocommit        self.autocurr_l = None        # Current auto right node for autocommit        self.autocurr_r = None                # For stats        # Total number of lookups        self.nlookups = 0        # Total number of in-mem lookups        self.ngets = 0        # Total number of disk loads        self.nloads = 0        self.root = None        if key:            self.root = self.insert(key, val)        self.bdir = ''        self.diskcache = None    def __del__(self):        self.clear()    def to_cache(self, key, val):        self.diskcache[key] = val    def from_cache(self, key):        return self.diskcache[key]        def addNode(self, key, val):        self.size += 1        self.height = int(math.ceil(math.log(self.size+1, 2)))        node = BSTNode(key, val, tree=self)        if self.auto and self.autolevel and self.size>1:            # print 'Auto-dumping...', self.size            if self.size % self.autolevel==0:                self.dump(self.autocurr_l)                # Set autocurr to this node                self.autocurr_l = node                        #if self.autocurr_l and self.autocurr_l.is_balanced(self.autolevel):            #    print 'Auto-dumping...', self.autocurr_l.key            #    self.dump(self.autocurr_l)            #    curr = self.autocurr_l            #    # Set autocurr to the children of this node            #    self.autocurr_l = curr.left            #    self.autocurr_r = curr.right            #    print 'Left=>',self.autocurr_l            #    print 'Right=>',self.autocurr_r                            #    print 'Root=>',self.root.key                            #if self.autocurr_r == self.autocurr_l:            #    return node                        #if self.autocurr_r and self.autocurr_r.is_balanced(self.autolevel):            #    print 'Auto-dumping...', self.autocurr_r.key            #    self.dump(self.autocurr_r)            #    curr = autocurr_r            #    # Set autocurr to the children of this node            #    self.autocurr_l = curr.left            #    self.autocurr_r = curr.right                                                        return node        def __insert(self, root, key, val):                if root==None:            return self.addNode(key, val)        else:            if key<=root.key:                # Goes to left subtree                # print 'Inserting on left subtree...', key                root['left'] = self.__insert(root['left'], key, val)            else:                # Goes to right subtree                # print 'Inserting on right subtree...', key                root['right'] = self.__insert(root['right'], key, val)            return root            def __lookup(self, root, key):        if root == None:            return None        else:            if key==root.key:                # Note we are returning the value                return root.get()            else:                if key < root.key:                    return self.__lookup(root['left'], key)                else:                    return self.__lookup(root['right'], key)    def __update(self, root, key, newval):        if root == None:            return None        else:            if key==root.key:                root.set(newval)            else:                if key < root.key:                    return self.__update(root['left'], key, newval)                else:                    return self.__update(root['right'], key, newval)                                    def insert(self, key, val):        node = self.__insert(self.root, key, val)        if self.root == None:            self.root = node            # Set auto node            self.autocurr_l = self.autocurr_r = self.root        # If node is added to left of current autocurrent node..                return node    def lookup(self, key):        return self.__lookup(self.root, key)    def update(self, key, newval):        self.__update(self.root, key, newval)            def __inorder(self, root):        if root != None:            for node in self.__inorder(root['left']):                yield node            yield root            for node in self.__inorder(root['right']):                yield node                def inorder(self):        # Inorder traversal, yielding the nodes                return self.__inorder(self.root)    def __preorder(self, root):        if root != None:            yield root            for node in self.__preorder(root['left']):                yield node            for node in self.__preorder(root['right']):                yield node                            def preorder(self):        # Inorder traversal, yielding the nodes        return self.__preorder(self.root)    def __postorder(self, root):        if root != None:            for node in self.__postorder(root['left']):                yield node            for node in self.__postorder(root['right']):                yield node                        yield root                def postorder(self):        # Inorder traversal, yielding the nodes        return self.__postorder(self.root)                    def minnode(self):        # Node with the minimum key value        root = self.root        while (root['left'] != None):            root = root['left']        return root        def minkey(self):        node = self.minnode()        return node.key    def maxnode(self):        # Node with the maximum key value        root = self.root        while (root['right'] != None):            root = root['right']        return root        def maxkey(self):        node = self.maxnode()        return node.key    def size_lhs(self):        # Traverse pre-order and increment counts        if self.root == None:            return 0                root_left = self.root['left']        count = 0        for node in self.__preorder(root_left):            count += 1        return count        def size_rhs(self):        if self.root == None:            return 0        # Traverse pre-order and increment counts        root_right = self.root['right']        count = 0        for node in self.__preorder(root_right):            count += 1        return count        def size(self):        return self.count    def stats(self):        d = {'gets': 0, 'loads': 0}        self.__stats(self.root, d)        return d    def __stats(self, root, d):        if root != None:            d['gets'] += root.cgets            d['loads'] += root.cloads            self.__stats(root['left'], d)            self.__stats(root['right'], d)                def dump(self, startnode=None):        if startnode==None:            startnode = self.root                    if startnode==None:            return None        else:            startnode.dump(True)        self.hard = True    def load(self):        if self.root==None:            return None        if self.hard:            self.root.load(True)            self.hard = False    def reset(self):        self.size = 0        self.height = 0        self.hard = False        # Autocommit mode        self.auto = False        self.autolevel = 0        self.autocurr_l = None        self.autocurr_r = None                self.nlookups = 0        self.ngets = 0        self.nloads = 0        self.root = None            def clear(self):        if self.root:            self.root.clear()        self.reset()        if self.diskcache:            self.diskcache.clear()        # Remvoe the directory        if self.bdir and os.path.isdir(self.bdir):            try:                shutil.rmtree(self.bdir)            except Exception, e:                print e    def set_auto(self, level):        # Enable auto commit and set level        # If auto commit is set to true, the tree        # is flushed to disk after the existing        # autocommit node is balanced at the        # level 'level'. The starting autocommit        # node is root by default.        self.auto = True        self.autolevel = level        # Directory for file representation        self.bdir = '.bidx' + str(hash(self))                if not os.path.isdir(self.bdir):            try:                os.makedirs(self.bdir)            except Exception, e:                raise        self.diskcache = DictCache(10, self.bdir)        self.diskcache.freq = self.autolevel        if __name__ == "__main__":    b = BST()    b.set_auto(3)    print b.root    b.insert(4,[4])    b.insert(3,[2])    b.insert(2,[6])    b.insert(1, [3])    b.insert(5,[5])    b.insert(6,[7])    b.insert(0,[8])            print b.size    print b.height    print b.lookup(4)    b.dump()    # Now try to lookup item 3    print b.lookup(3)    print b.lookup(3)    print b.lookup(3)        # Load all    b.load()    print b.size, b.height        # Do inorder    print 'Inorder...'    for node in b.inorder():        print node.key,'=>',node[node.key]    # Do preorder    print 'Preorder...'        for node in b.preorder():        print node.key,'=>',node[node.key]    # Do postorder    print 'Postorder...'            for node in b.postorder():        print node.key,'=>',node[node.key]    print 'LHS=>',b.size_lhs()    print 'RHS=>',b.size_rhs()            # b.clear()    print b.stats()    root = b.root    print root.is_balanced()        print root.is_balanced(2)        del b    b= BST()    b.insert(10,[4])    b.insert(5,[2])    b.insert(2,[6])    b.insert(7, [3])    b.insert(14,[5])    b.insert(12,[7])    b.insert(15,[8])    root = b.root        print root.is_balanced(1)    print root.is_balanced(2)    print root.is_balanced(3)    print 'LHS=>',b.size_lhs()    print 'RHS=>',b.size_rhs()        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本到三区不卡视频| 久久伊99综合婷婷久久伊| 884aa四虎影成人精品一区| 精品成人私密视频| 中文字幕一区二区三区不卡| 日韩不卡一二三区| 国产电影精品久久禁18| 久久综合久色欧美综合狠狠| 亚洲精品免费一二三区| 麻豆免费精品视频| 91论坛在线播放| 欧美精品一区二区三区蜜桃视频 | www.一区二区| 日韩一区和二区| 亚洲午夜av在线| 成人av在线资源网站| 日韩精品在线一区| 亚洲成a人v欧美综合天堂| 国产91精品一区二区麻豆网站 | 一区二区三区不卡视频| 国产一区二区伦理片| 91精品中文字幕一区二区三区| 成人免费一区二区三区视频| 国产精品99久| 精品久久久网站| 免费在线观看日韩欧美| 色狠狠av一区二区三区| 国产精品欧美极品| 国产很黄免费观看久久| 欧美精品一区二区三区视频| 美女在线一区二区| 3d成人动漫网站| 午夜免费欧美电影| 欧美综合天天夜夜久久| 亚洲精品伦理在线| 91毛片在线观看| 亚洲男同性视频| 色综合天天综合在线视频| 中文字幕一区二区三| 成人app在线观看| 国产精品久久久久久久久免费丝袜 | 在线观看91精品国产入口| 亚洲日本在线天堂| 91蜜桃免费观看视频| 亚洲四区在线观看| 欧洲精品中文字幕| 亚洲国产精品一区二区www | 国产精品一卡二卡| 国产三区在线成人av| 高清成人免费视频| 国产精品人妖ts系列视频 | 蜜臀av在线播放一区二区三区 | 日韩不卡一二三区| 精品久久久影院| 成人免费观看男女羞羞视频| 亚洲天堂免费在线观看视频| 日本乱人伦aⅴ精品| 午夜免费久久看| 久久一区二区三区国产精品| 99久久综合国产精品| 亚洲一区中文在线| 日韩欧美一级精品久久| 国产另类ts人妖一区二区| 国产精品卡一卡二| 欧美视频在线一区二区三区 | 激情综合一区二区三区| 亚洲国产精品精华液2区45| 99re这里都是精品| 水蜜桃久久夜色精品一区的特点| 欧美va天堂va视频va在线| 欧美日精品一区视频| 日韩av不卡在线观看| 国产人妖乱国产精品人妖| 色综合中文字幕国产| 亚洲国产日韩a在线播放性色| 欧美一级欧美一级在线播放| 成人午夜视频免费看| 亚洲国产精品人人做人人爽| 久久综合色天天久久综合图片| 99re成人精品视频| 美女网站一区二区| 中文字幕一区二区在线播放| 日韩欧美资源站| 91视频在线看| 国产精品一区三区| 亚洲国产中文字幕| 国产精品每日更新在线播放网址 | 成人黄色免费短视频| 天堂一区二区在线| 国产精品免费久久久久| 欧美成人精精品一区二区频| 在线观看亚洲专区| 国产精品99久久久久久有的能看 | 亚洲欧美日韩精品久久久久| 久久亚洲二区三区| 欧美日本精品一区二区三区| 99re热视频这里只精品| 国产精品亚洲专一区二区三区 | 久久99久久99小草精品免视看| 亚洲小说春色综合另类电影| 国产精品婷婷午夜在线观看| 精品日韩欧美在线| 欧美丝袜丝nylons| 99久久99久久精品国产片果冻 | 在线不卡一区二区| 91麻豆产精品久久久久久| 国产99久久久国产精品潘金 | 国产午夜亚洲精品午夜鲁丝片 | 波多野结衣在线一区| 久热成人在线视频| 日韩中文字幕不卡| 亚洲成人黄色小说| 一区二区欧美视频| 亚洲女性喷水在线观看一区| 亚洲欧洲国产日本综合| 国产欧美一区视频| 国产女主播一区| 久久精品视频一区| 久久久久久久久久久99999| 精品免费99久久| 久久天堂av综合合色蜜桃网| 精品久久久久香蕉网| 精品国产乱码久久久久久久久| 日韩一区二区三区在线| 欧美高清视频不卡网| 欧美精品一二三区| 欧美一区国产二区| 日韩一级在线观看| 精品奇米国产一区二区三区| 久久久久国产免费免费| 久久亚洲精华国产精华液| 国产偷v国产偷v亚洲高清| 国产欧美日韩综合| 中文字幕一区二区三| 玉米视频成人免费看| 亚洲.国产.中文慕字在线| 日韩精品午夜视频| 裸体健美xxxx欧美裸体表演| 国产一区二区三区四| 懂色av一区二区三区免费看| 色综合天天综合| 欧美日韩mp4| 精品99一区二区| 国产精品久久久久久久久晋中| 亚洲欧美激情视频在线观看一区二区三区| 尤物视频一区二区| 奇米色一区二区三区四区| 国产成人在线看| 色偷偷88欧美精品久久久| 日本一区二区三区视频视频| 日韩理论电影院| 日本欧美一区二区| 国产精品亚洲午夜一区二区三区| 一本久久a久久精品亚洲| 91精品国产手机| 中文字幕第一区综合| 一区二区三区加勒比av| 麻豆成人av在线| 91在线免费看| 26uuu另类欧美亚洲曰本| 亚洲女人小视频在线观看| 免费欧美日韩国产三级电影| 波多野洁衣一区| 欧美一级二级在线观看| 国产精品福利一区二区| 视频一区欧美日韩| 北岛玲一区二区三区四区| 欧美日韩国产综合视频在线观看| 26uuu亚洲婷婷狠狠天堂| 亚洲自拍另类综合| 国产成人免费视频一区| 欧美精选午夜久久久乱码6080| 国产精品福利一区二区| 蜜臀国产一区二区三区在线播放 | 中文字幕一区二区视频| 美女久久久精品| 欧美三级日韩三级国产三级| 国产女主播一区| 理论片日本一区| 欧美日韩1234| 亚洲黄一区二区三区| 高清beeg欧美| 精品处破学生在线二十三| 亚洲一区二区不卡免费| a美女胸又www黄视频久久| 26uuu国产在线精品一区二区| 午夜影视日本亚洲欧洲精品| 色婷婷香蕉在线一区二区| 国产欧美精品一区| 国精产品一区一区三区mba桃花 | 99国产精品国产精品久久| 日韩欧美一区在线| 日韩成人免费看| 欧美精品vⅰdeose4hd| 亚洲综合小说图片| 色哟哟一区二区| 亚洲女人的天堂| 一本久久a久久精品亚洲| 亚洲美女一区二区三区| 播五月开心婷婷综合|