hiện em đang code một chương trình có thể mã hóa huffman động sử dụng python. Nhưng hiện code của em gặp trục trặc trong điều kiện phần “for x in oldtree”.
Khi chạy chương trình, Ở terminal em đang có kết quả sau mã hóa:
Ky tu:
[0, ' ']
[0, ' ', 1]
[0, ' ', 1, 's']
[1, 's']
[0, ' ', 1, 's', 2]
[0, ' ', 1, 's', 2, 'i']
[0, ' ', 1, 's', 2, 'i', 'h']
[0, ' ', 1, 's', 2, 'i', 'h', 'T']
['h', 'T']
[0, ' ', 1, 's', 2, 'i', 'h', 'T', 2]
['h', 'T']
[0, ' ', 1, 's', 2, 'i', 'h', 'T', 2, 2]
[0, ' ', 1, 's', 'i', 'h', 'T', 2, 3, 3]
[0, ' ', 1, 's']
thỏa mãn điều kiện if len(newtree) % 2 == 0:block = newtree[len(newtree) - 2:]
nên sẽ có kết quả block [1, 's']
( trong block = [0, x]
) nhưng khi xét đến [0, ' ', 1, 's', 2, 'i']
thì dù nó thỏa mãn điều kiện đầu nhưng lại không trả về kết quả block là [2, 'i']
mà lại tiếp tục xét đến chữ cái tiếp theo là h và T. Mọi người xem giúp em đoạn này em lỗi ở đâu ạ
phần code:
text = 'This '
print(f"Text: {text}\n")
textArr = []
textNumber = []
numberArr = []
treeText = []
oldtree = []
newtree = []
#Change to ASCII function
def ascii(symbol):
ASCII = format(ord(symbol), '08b')
return ASCII
#Tree Fix Function
def nodeUpdate(block):
blockValue = []
for x in block:
if isinstance(x, int):
blockValue.append(x)
else:
blockValue.append(textNumber[textArr.index(x)])
return sum(blockValue)
def sapXep(a):
treeNumber = [x if isinstance(x, int) else textNumber[textArr.index(x)] for x in a ]
sortedNumber = sorted(range(len(treeNumber)), key=lambda i: treeNumber[i])
a = [a[i] for i in sortedNumber]
b = []
oldA = [a[i : i+2] for i in range(0, len(a), 2)]
blk = a[:2]
b.extend(blk)
if oldtree:
for item in oldA:
if oldA.index(item) >= 1:
for y in item:
if isinstance(y, str):
b.append(y)
else:
b.append(nodeUpdate(blk))
blk.clear()
blk += b[len(b) - 2: ]
return b
#TreeDraw
for x in text:
print(f"Ky tu: {x}")
if x not in textArr:
block = [0, x]
textArr.append(x)
textNumber.append(1)
newtree.extend(block)
for x in oldtree:
if isinstance(x, str):
newtree.append(x)
if len(newtree) % 2 == 0:
block = newtree[len(newtree) - 2:]
else:
print(block)
newtree.append(nodeUpdate(block))
if len(newtree) % 2 == 0:
block = newtree[len(newtree) - 2:]
print(newtree)
newtree = sapXep(newtree)
print(newtree)
oldtree = list(newtree)
newtree.clear()
print(' ')