class SplayedHashBucket(collections.MutableMapping): ''' A hash bucket is used to hold objects that hash to the same value in a hash table. This is hash bucket using a splay tree. This masquerades as a python dict in code where it is used. Since splat tree is used lookups on avg take Olog(n) Note: HASHBUCKET ITERATION YIELDS KEYS. not the key value pairs in the bucket. ''' def __init__(self): self._st = SplayTree() def __len__(self): return self._st.node_count def get(self, key, default = None): ''' Get object associated with a key and on key miss return specified default. This is there in Python dict and this class masquerades as dict, we implement it. ''' try: value = self[key] return value except KeyError: return default def __getitem__(self, key): value = self._st.find(key) if value == None: raise KeyError('Key Error: %s ' % repr(key)) return value def __delitem__(self, key): if key in self._st: self._st.remove(key) else: raise KeyError('Key Error: %s ' % repr(key)) def __setitem__(self, key, obj): if key in self._st: self._st.replace(key, obj) else: self._st.insert(key, obj) def __iter__(self): for key, value in self._st.inorder_traversal_with_stack(): yield key
traversed.append((key, value)) print('Tree inorder traversal (key, value) pairs:') print(traversed) if __name__ == '__main__': bst = SplayTree() print('Node count is %s' % str(bst.node_count)) print('Adding key value pairs (1, 1), (2, 2), .... (6, 6)') kvpairs = [(5, 5), (2, 2), (7, 7), (1, 1), (3, 3), (9, 9), (8, 8), (4, 4), (6, 6)] for kvpair in kvpairs: bst.insert(key=kvpair[0], obj=kvpair[1]) print_tree_inorder(bst) print_tree_preorder(bst) print_tree_postorder(bst) #remove element_to_remove = 9 print('removing element %s' % str(element_to_remove)) bst.remove(key=element_to_remove) print_tree_inorder_using_stack(bst) #replace obj for a key key_to_replace = 1 new_object_for_Key = 111 bst.replace(key=key_to_replace, obj=new_object_for_Key) print_tree_inorder_using_stack(bst)