Code Duplication    Length = 79-79 lines in 2 locations

pyalgs/data_structures/commons/priority_queue.py 2 locations

@@ 85-163 (lines=79) @@
82
    def create():
83
        return MinPQ()
84
85
86
class MaxPQ(object):
87
    pq = None
88
    N = 0
89
90
    def __init__(self, capacity=None):
91
        if capacity is None:
92
            capacity = 10
93
        self.pq = [0] * capacity
94
95
    def enqueue(self, key):
96
        if self.N == len(self.pq):
97
            self.resize(len(self.pq) * 2)
98
        self.N += 1
99
        self.pq[self.N] = key
100
        self.swim(self.N)
101
102
    def swim(self, k):
103
        while k > 1:
104
            parent = k // 2
105
            if greater(self.pq[k], self.pq[parent]):
106
                exchange(self.pq, k, parent)
107
                k = parent
108
            else:
109
                break
110
111
    def del_max(self):
112
        if self.is_empty():
113
            return None
114
115
        key = self.pq[1]
116
        exchange(self.pq, 1, self.N)
117
        self.N -= 1
118
        if self.N == len(self.pq) // 4:
119
            self.resize(len(self.pq) // 2)
120
121
        self.sink(self.pq, 1, self.N)
122
        return key
123
124
    @staticmethod
125
    def sink(tmp, k, n):
126
127
        while k * 2 <= n:
128
            child = k * 2
129
            if child < n and greater(tmp[child + 1], tmp[child]):
130
                child = child + 1
131
            if greater(tmp[child], tmp[k]):
132
                exchange(tmp, child, k)
133
                k = child
134
            else:
135
                break
136
137
    def resize(self, new_size):
138
        tmp = [0] * new_size
139
        for k in range(min(new_size, len(self.pq))):
140
            tmp[k] = self.pq[k]
141
        self.pq = tmp
142
143
    def is_empty(self):
144
        return self.N == 0
145
146
    def size(self):
147
        return self.N
148
149
    def iterate(self):
150
        tmp = [0] * (self.N + 1)
151
        for k in range(self.N + 1):
152
            tmp[k] = self.pq[k]
153
154
        n = self.N
155
        while n >= 1:
156
            key = tmp[1]
157
            exchange(tmp, 1, n)
158
            n -= 1
159
            self.sink(tmp, 1, n)
160
            yield key
161
162
    @staticmethod
163
    def create():
164
        return MaxPQ()
165
166
@@ 4-82 (lines=79) @@
1
from pyalgs.algorithms.commons.util import less, exchange, greater
2
3
4
class MinPQ(object):
5
    pq = None
6
    N = 0
7
8
    def __init__(self, capacity=None):
9
        if capacity is None:
10
            capacity = 10
11
        self.pq = [0] * capacity
12
13
    def enqueue(self, key):
14
        self.N += 1
15
        if self.N == len(self.pq):
16
            self.resize(len(self.pq) * 2)
17
18
        self.pq[self.N] = key
19
        self.swim(self.N)
20
21
    def swim(self, k):
22
        while k > 1:
23
            parent = k // 2
24
            if less(self.pq[k], self.pq[parent]):
25
                exchange(self.pq, k, parent)
26
                k = parent
27
            else:
28
                break
29
30
    def del_min(self):
31
        if self.is_empty():
32
            return None
33
34
        key = self.pq[1]
35
        exchange(self.pq, 1, self.N)
36
        self.N -= 1
37
        if self.N == len(self.pq) // 4:
38
            self.resize(len(self.pq) // 2)
39
40
        self.sink(self.pq, 1, self.N)
41
        return key
42
43
    @staticmethod
44
    def sink(tmp, k, n):
45
46
        while k * 2 <= n:
47
            child = k * 2
48
            if child < n and less(tmp[child + 1], tmp[child]):
49
                child = child + 1
50
            if less(tmp[child], tmp[k]):
51
                exchange(tmp, child, k)
52
                k = child
53
            else:
54
                break
55
56
    def resize(self, new_size):
57
        tmp = [0] * new_size
58
        for k in range(min(new_size, len(self.pq))):
59
            tmp[k] = self.pq[k]
60
        self.pq = tmp
61
62
    def is_empty(self):
63
        return self.N == 0
64
65
    def size(self):
66
        return self.N
67
68
    def iterate(self):
69
        tmp = [0] * (self.N + 1)
70
        for k in range(self.N + 1):
71
            tmp[k] = self.pq[k]
72
73
        n = self.N
74
        while n >= 1:
75
            key = tmp[1]
76
            exchange(tmp, 1, n)
77
            n -= 1
78
            self.sink(tmp, 1, n)
79
            yield key
80
81
    @staticmethod
82
    def create():
83
        return MinPQ()
84
85