Skip to content

Commit d1cf579

Browse files
committed
Update bloomFilter, cantor, redblackTrue,matrix_chain_multiply
1 parent 0c08851 commit d1cf579

14 files changed

Lines changed: 922 additions & 300 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.*
22
*.o
33
*.exe
4-
__pycache__/**
4+
__pycache__
55
!.gitignore
6+
*.out

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Algorithm and Data Structures
1+
# Algorithm
22
>Notes and codes for learning algorithm and data structures :smiley:
33
44
Some pictures and ideas are from `<<Introduction to Algotithm>>

dataStructure/intervalTree.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from redBlackTree import redBlackTree
2+
3+
from functools import total_ordering
4+
5+
@total_ordering
6+
class node:
7+
def __init__(self,low,high,left=None,right=None,isBlack=False):
8+
self.val = low # self.val is the low
9+
self.high = high
10+
self.max = high
11+
self.left = left
12+
self.right = right
13+
self.parent=None
14+
self.isBlack = isBlack
15+
def __lt__(self,nd):
16+
return self.val < nd.val
17+
def __eq__(self,nd):
18+
return nd is not None and self.val == nd.val
19+
def setChild(self,nd,isLeft = True):
20+
if isLeft: self.left = nd
21+
else: self.right = nd
22+
if nd is not None: nd.parent = self
23+
def getChild(self,isLeft):
24+
if isLeft: return self.left
25+
else: return self.right
26+
def __bool__(self):
27+
return self.val is not None
28+
def __str__(self):
29+
color = 'B' if self.isBlack else 'R'
30+
return f'{color}[{self.val},{self.high}]-{self.max}'
31+
def __repr__(self):
32+
return f'intervalNode({self.val},{self.high},{self.max},isBlack={self.isBlack})'
33+
def overlap(self,low,high):
34+
return self.val<=high and self.high>=low
35+
def setMax(self):
36+
l = 0 if self.left is None else self.left.max
37+
r = 0 if self.right is None else self.right.max
38+
self.max = max(self.high, l, r)
39+
return self.max
40+
41+
class intervalTree(redBlackTree):
42+
def search(self,low,high):
43+
nd = self.root
44+
while nd is not None and not nd.overlap(low,high):
45+
if nd.left is not None and nd.left.max>=low:
46+
nd = nd.left
47+
else:nd = nd.right
48+
return nd
49+
def insert(self,nd):
50+
super(intervalTree,self).insert(nd)
51+
while nd is not None:
52+
nd.setMax()
53+
nd = nd.parent
54+
def delete(self,val):
55+
nd = self.find(val)
56+
if nd is not None:
57+
nd.max = 0
58+
tmp = nd.parent
59+
while tmp is not None:
60+
tmp.setMax()
61+
tmp = tmp.parent
62+
super(intervalTree,self).delete(val)
63+
def rotate(self,prt,chd):
64+
'''rotate prt, and return new prt, namyly the original chd'''
65+
super(intervalTree,self).rotate(prt,chd)
66+
prt.setMax()
67+
chd.setMax()
68+
def copyNode(self,src,des):
69+
des.val = src.val
70+
des.high = src.high
71+
des.setMax()
72+
73+
74+
75+
from random import randint, shuffle
76+
def genNum(n =10,upper=10):
77+
nums ={}
78+
for i in range(n):
79+
while 1:
80+
d = randint(0,100)
81+
if d not in nums:
82+
nums[d] = (d,randint(d,d+upper))
83+
break
84+
return nums.values()
85+
86+
def buildTree(n=10,nums=None,visitor=None):
87+
if nums is None or nums ==[]: nums = genNum(n)
88+
tree = intervalTree()
89+
print(f'build a red-black tree using {nums}')
90+
for i in nums:
91+
tree.insert(node(*i))
92+
if visitor:
93+
visitor(tree,i)
94+
return tree,nums
95+
def testInsert(nums=None):
96+
def visitor(t,val):
97+
print('inserting', val)
98+
print(t)
99+
tree,nums = buildTree(visitor = visitor,nums=nums)
100+
print('-'*5+ 'in-order visit' + '-'*5)
101+
for i,j in enumerate(tree.sort()):
102+
print(f'{i+1}: {j}')
103+
104+
def testSuc(nums=None):
105+
tree,nums = buildTree(nums=nums)
106+
for i in tree.sort():
107+
print(f'{i}\'s suc is {tree.getSuccessor(i)}')
108+
109+
def testDelete(nums=None):
110+
tree,nums = buildTree(nums = nums)
111+
print(tree)
112+
for i in nums:
113+
print(f'deleting {i}')
114+
tree.delete(i[0])
115+
print(tree)
116+
117+
if __name__=='__main__':
118+
lst = [(0,3),(5,8),(6,10),(26,26),(25,30),(8,9),(19,20),(15,23),(16,21),(17,19)]
119+
lst = None
120+
#testSuc(lst)
121+
#testInsert(lst)
122+
testDelete(lst)

0 commit comments

Comments
 (0)