Skip to content

Commit 35d409d

Browse files
committed
Wavelet tree
1 parent 27d7ebe commit 35d409d

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

concepts/temp.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
3+
4+
5+
def ans():
6+
A = [1, 2, 2, 2, 4, 5, 6]
7+
B = [3, 5]
8+
9+
def binarysearch(A, low, high, target):
10+
if low <= high:
11+
mid = (low + high) // 2
12+
13+
if target == A[mid]:
14+
return mid
15+
elif target < A[mid]:
16+
return binarysearch(A, low, mid - 1, target)
17+
else:
18+
if target > A[mid - 1] and target < A[mid]:
19+
return mid + 1
20+
elif target <= A[mid - 1]:
21+
return binarysearch(A, low, mid - 1, target)
22+
else:
23+
return binarysearch(A, mid + 1, high, target)
24+
return 0
25+
26+
lenA = len(A)
27+
28+
A = sorted(A)
29+
B = sorted(B)
30+
31+
for item in B:
32+
if item >= A[-1]:
33+
yield lenA
34+
elif item < A[0]:
35+
yield 0
36+
elif item == A[0]:
37+
yield 1
38+
else:
39+
index = binarysearch(A, 0, len(A)-1, item)
40+
yield len(A) - index
41+
42+
43+
for i in ans():
44+
print(i)

concepts/walvet_tree.py

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from collections import defaultdict
2+
3+
class WaveletTree:
4+
def __init__(self):
5+
self.list = []
6+
self.rank = []
7+
self.left = None
8+
self.right = None
9+
10+
def assign_ranks(self):
11+
if not self.list:
12+
return []
13+
maxi = max(self.list)
14+
mini = min(self.list)
15+
mid = (maxi + mini) / 2
16+
return [0 if item <= mid else 1 for item in self.list]
17+
18+
def create_walvet_tree(_list):
19+
_root = WaveletTree()
20+
_root.list = _list
21+
if len(_list) <= 1:
22+
return _root
23+
24+
_root.rank = _root.assign_ranks()
25+
26+
right = []
27+
left = []
28+
29+
for index in range(0, len(_root.rank)):
30+
if _root.rank[index] == 1:
31+
right.append(_root.list[index])
32+
else:
33+
left.append(_root.list[index])
34+
35+
_root.left = create_walvet_tree(left)
36+
_root.right = create_walvet_tree(right)
37+
return _root
38+
39+
40+
def inorder(_root):
41+
if _root:
42+
print(_root.list, _root.rank, _root.left, _root.right)
43+
inorder(_root.left)
44+
inorder(_root.right)
45+
46+
47+
def level_order(_root):
48+
49+
if not _root:
50+
print("Empty tree")
51+
return
52+
53+
dicto = defaultdict(lambda : [])
54+
55+
queue = [(_root, 0)]
56+
57+
while queue:
58+
item, lvl = queue.pop(0)
59+
if item == 'X':
60+
continue
61+
dicto[lvl].append(
62+
"".join([str(item) for item in item.rank]) if item.rank else 'X'
63+
)
64+
queue.append((item.left if item.left else 'X', lvl + 1))
65+
queue.append((item.right if item.left else 'X', lvl + 1))
66+
return dicto
67+
68+
69+
def rqq(ksmallest, left, right):
70+
71+
pass
72+
73+
74+
print("Enter input list:")
75+
# input_list = list(set(map(int, input().split())))
76+
input_list = [6 , 2, 0 ,7 , 9, 3, 1 , 8 , 5, 4]
77+
root = create_walvet_tree(input_list)
78+
inorder(root)
79+
dicto = level_order(root)
80+
print(dicto)
81+
# print("RQQ inputs:")
82+
# k, l, r = list(map(int, input().split()))
83+
# rqq(k, l, r)
84+
85+
86+
87+

0 commit comments

Comments
 (0)