Skip to content

Commit 119653a

Browse files
authored
Add Multiset data structure (#538)
1 parent b1c3159 commit 119653a

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

pydatastructs/miscellaneous_data_structures/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,8 @@
4545
RangeQueryDynamic
4646
)
4747
__all__.extend(algorithms.__all__)
48+
49+
from .multiset import (
50+
Multiset
51+
)
52+
__all__.extend(multiset.__all__)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
__all__ = [
2+
'Multiset'
3+
]
4+
5+
6+
class Multiset:
7+
def __init__(self, *args):
8+
# TODO: Implement dict in pydatastructs
9+
self.counter = dict()
10+
from pydatastructs.trees import RedBlackTree
11+
self.tree = RedBlackTree()
12+
self._n = 0
13+
for arg in args:
14+
self.add(arg)
15+
16+
def add(self, element):
17+
self.counter[element] = self.counter.get(element, 0) + 1
18+
self._n += 1
19+
if self.counter[element] == 1:
20+
self.tree.insert(element)
21+
22+
def remove(self, element):
23+
if self.counter[element] == 1:
24+
self.tree.delete(element)
25+
if self.counter.get(element, 0) > 0:
26+
self._n -= 1
27+
self.counter[element] -= 1
28+
29+
def lower_bound(self, element):
30+
return self.tree.lower_bound(element)
31+
32+
def upper_bound(self, element):
33+
return self.tree.upper_bound(element)
34+
35+
def __contains__(self, element):
36+
return self.counter.get(element, 0) > 0
37+
38+
def __len__(self):
39+
return self._n
40+
41+
def count(self, element):
42+
return self.counter.get(element, 0)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from pydatastructs.miscellaneous_data_structures import Multiset
2+
3+
def test_Multiset():
4+
5+
ms = Multiset()
6+
ms.add(5)
7+
ms.add(5)
8+
ms.add(3)
9+
ms.add(7)
10+
assert len(ms) == 4
11+
assert 5 in ms
12+
assert ms.count(5) == 2
13+
assert ms.count(3) == 1
14+
assert ms.count(-3) == 0
15+
assert not 4 in ms
16+
ms.remove(5)
17+
assert 5 in ms
18+
assert ms.lower_bound(5) == 5
19+
assert ms.upper_bound(5) == 7
20+
21+
ms = Multiset(5, 3, 7, 2)
22+
23+
assert len(ms) == 4
24+
assert 5 in ms
25+
assert ms.count(7) == 1
26+
assert not 4 in ms
27+
assert ms.lower_bound(3) == 3
28+
assert ms.upper_bound(3) == 5
29+
assert ms.upper_bound(7) is None
30+
31+
ms.remove(5)
32+
33+
assert len(ms) == 3
34+
assert not 5 in ms
35+
36+
ms.add(4)
37+
38+
assert 4 in ms
39+
assert len(ms) == 4

0 commit comments

Comments
 (0)