Completed
Push — master ( 5fe484...18079e )
by Xianshun
01:26
created

HashedMapWithSeparateChaining.is_empty()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 2
rs 10
1
from abc import ABCMeta, abstractmethod
2
3
from pyalgs.algorithms.commons import util
4
from pyalgs.data_structures.commons.queue import Queue
5
6
7
class HashedMap(object):
8
    __metaclass__ = ABCMeta
9
10
    @abstractmethod
11
    def put(self, key, value):
12
        pass
13
14
    @abstractmethod
15
    def get(self, key):
16
        pass
17
18
    @abstractmethod
19
    def delete(self, key):
20
        pass
21
22
    @abstractmethod
23
    def size(self):
24
        pass
25
26
    @abstractmethod
27
    def is_empty(self):
28
        pass
29
30
    @abstractmethod
31
    def keys(self):
32
        pass
33
34
    @abstractmethod
35
    def contains_key(self, key):
36
        pass
37
38
    @staticmethod
39
    def create():
40
        return HashedMapWithSeparateChaining()
41
42
43
class Node(object):
44
    key = None
45
    value = None
46
    next_node = None
47
48
    def __init__(self, key=None, value=None):
49
        self.key = key
50
        self.value = value
51
52
53
class HashedMapWithSeparateChaining(HashedMap):
54
    M = 97
55
    id = None
56
    N = 0
57
58
    def __init__(self):
59
        self.id = [Node()] * self.M
60
61
    def hash(self, key):
62
        return (hash(key) & 0x7fffffff) % self.M
63
64
    def is_empty(self):
65
        return self.N == 0
66
67
    def contains_key(self, key):
68
        return self.get(key) is not None
69
70
    def keys(self):
71
        queue = Queue.create()
72
        for i in range(self.M):
73
            self.collect_keys(i, queue)
74
        return queue.iterate()
75
76
    def collect_keys(self, i, queue):
77
        x = self.id[i]
78
        while x is not None:
79
            queue.enqueue(x.key)
80
            x = x.next_node
81
82
    def size(self):
83
        return self.N
84
85
    def get(self, key):
86
        i = self.hash(key)
87
        x = self.id[i]
88
        while x is not None:
89
            if util.cmp(x.key, key) == 0:
90
                return x.value
91
            x = x.next_node
92
        return None
93
94
    def delete(self, key):
95
        i = self.hash(key)
96
        x = self.id[i]
97
        prev_node = None
98
        while x is not None:
99
            if util.cmp(x.key, key) == 0:
100
                value = x.value
101
                next_node = x.next_node
102
                self.N -= 1
103
                if prev_node is not None:
104
                    prev_node.next_node = next_node
105
                if self.id[i] == x:
106
                    self.id[i] = None
107
                return value
108
            prev_node = x
109
            x = x.next_node
110
        return None
111
112
    def put(self, key, value):
113
        i = self.hash(key)
114
        x = self.id[i]
115
        while x is not None:
116
            if util.cmp(x.key, key) == 0:
117
                x.value = value
118
                return
119
            x = x.next_node
120
        old_first = self.id[i]
121
        self.id[i] = Node(key, value)
122
        self.id[i].next_node = old_first
123
        self.N += 1
124