File tree Expand file tree Collapse file tree 3 files changed +86
-0
lines changed
pydatastructs/miscellaneous_data_structures Expand file tree Collapse file tree 3 files changed +86
-0
lines changed Original file line number Diff line number Diff line change 45
45
RangeQueryDynamic
46
46
)
47
47
__all__ .extend (algorithms .__all__ )
48
+
49
+ from .multiset import (
50
+ Multiset
51
+ )
52
+ __all__ .extend (multiset .__all__ )
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments