GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 74bfb5...9dc1ad )
by Xianshun
01:01
created

HuffmanCompressor.decompress_from_binary()   A

Complexity

Conditions 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
1
from pycompressor.priority_queue import MinPQ
2
from pycompressor.queue import Queue
3
4
5
class Node(object):
6
    left = None
7
    right = None
8
    key = None
9
    freq = 0
10
11
    def __init__(self, key=None, freq=None, left=None, right=None):
12
        if key is not None:
13
            self.key = key
14
        if freq is not None:
15
            self.freq = freq
16
        if left is not None:
17
            self.left = left
18
        if right is not None:
19
            self.right = right
20
21
    def is_leaf(self):
22
        return self.left is None and self.right is None
23
24
25
def char_at(text, i):
26
    if len(text) - 1 < i:
27
        return -1
28
    return ord(text[i])
29
30
31
def write_char(char, bit_stream):
32
    for i in range(8):
33
        bit = char % 2
34
        bit_stream.enqueue(bit)
35
        char = char // 2
36
37
38
def read_char(bit_stream):
39
    a = [0] * 8
40
    for i in range(8):
41
        a[i] = bit_stream.dequeue()
42
43
    char = 0
44
    for i in range(7, -1, -1):
45
        char = char * 2 + a[i]
46
    return char
47
48
49
class HuffmanCompressor(object):
50
    def compress_to_binary(self, text):
51
        trie = self.build_trie(text)
52
        bit_stream = Queue()
53
        code = {}
54
        self.build_code(trie, '', code)
55
        self.write_trie(trie, bit_stream)
56
        self.write_text(code, text, bit_stream)
57
        return bit_stream
58
59
    def decompress_from_binary(self, bit_stream):
60
        trie = self.read_trie(bit_stream)
61
        code = {}
62
        self.build_code(trie, '', code)
63
        rcode = {}
64
        for key in code.keys():
65
            rcode[code[key]] = key
66
        return self.read_text(rcode, bit_stream)
67
68
    def read_text(self, code, bit_stream):
69
        text = ''
70
        cc = ''
71
        while not bit_stream.is_empty():
72
            bit = bit_stream.dequeue()
73
            if bit == 0:
74
                cc = cc + '0'
75
            else:
76
                cc = cc + '1'
77
            if cc in code:
78
                text = text + chr(code[cc])
79
                cc = ''
80
        return text
81
82
    def read_trie(self, bit_stream):
83
        bit = bit_stream.dequeue()
84
        if bit == 1:
85
            return Node(key=read_char(bit_stream))
86
        left = self.read_trie(bit_stream)
87
        right = self.read_trie(bit_stream)
88
        return Node(left=left,right=right)
89
90
    def write_text(self, code, text, bit_stream):
91
        for i in range(len(text)):
92
            cc = code[char_at(text, i)]
93
            for j in range(len(cc)):
94
                if cc[j] == '0':
95
                    bit_stream.enqueue(0)
96
                elif cc[j] == '1':
97
                    bit_stream.enqueue(1)
98
99
100
    def build_code(self, x, prefix, code):
101
        if x.is_leaf():
102
            code[x.key] = prefix
103
            return
104
        self.build_code(x.left, prefix + '0', code)
105
        self.build_code(x.right, prefix + '1', code)
106
107
    def build_trie(self, text):
108
        search_trie = dict()
109
        for i in range(len(text)):
110
            c = char_at(text, i)
111
            if c in search_trie:
112
                search_trie[c].freq += 1
113
            else:
114
                node = Node(key=c, freq=1)
115
                search_trie[c] = node
116
117
        pq = MinPQ(lambda x, y: x.freq - y.freq)
118
        for node in search_trie.values():
119
            pq.enqueue(node)
120
121
        while pq.size() > 1:
122
            node1 = pq.del_min()
123
            node2 = pq.del_min()
124
            freq = node1.freq + node2.freq
125
            node = Node(freq=freq, left=node1, right=node2)
126
            pq.enqueue(node)
127
128
        return pq.del_min()
129
130
    def write_trie(self, x, bit_stream):
131
        if x is None:
132
            return
133
        if x.is_leaf():
134
            bit_stream.enqueue(1)
135
            write_char(x.key, bit_stream)
136
            return
137
138
        bit_stream.enqueue(0)
139
        self.write_trie(x.left, bit_stream)
140
        self.write_trie(x.right, bit_stream)
141