Pentru a comprimi un șir de biți folosind reprezentarea binară în arborele Calkin-Wilf, putem urma acești pași:
- Construim arborele Calkin-Wilf pentru șirul de biți.
- Parcurgem arborele în ordine inversă, de la frunze la rădăcină.
- Pentru fiecare nod, adăugăm un 1 dacă valoarea nodului este 1 și un 0 dacă valoarea nodului este 0.
Construirea arborelui Calkin-Wilf este un proces recursiv. Pentru a construi un nod cu valoarea 1, adăugăm doi subnoduri cu valorile 0 și 1. Pentru a construi un nod cu valoarea 0, adăugăm un singur subnod cu valoarea 0.
Parcurgerea arborelui în ordine inversă este simplă. Pur și simplu începem cu frunze și urcăm în sus prin arbore, adăugând un 1 sau un 0 pentru fiecare nod.
De exemplu, să presupunem că avem următorul șir de biți:
Construirea arborelui Calkin-Wilf pentru acest șir va da următorul arbore:
0
/ \
1 0
/ \ / \
1 1 0 0
Parcurgerea arborelui în ordine inversă va da următorul șir de biți comprimat:
Acest șir comprimat este mai scurt decât șirul original cu 2 biți.
Iată un exemplu de implementare a acestei metode în Python:
Python
def calkin_wilf_compression(bits):
"""
Comprima un șir de biți folosind reprezentarea binară în arborele Calkin-Wilf.
Args:
bits: Șirul de biți care trebuie comprimat.
Returns:
Șirul de biți comprimat.
"""
tree = build_calkin_wilf_tree(bits)
compressed_bits = ""
for node in reversed(tree.nodes):
if node.value == 1:
compressed_bits += "1"
else:
compressed_bits += "0"
return compressed_bits
def build_calkin_wilf_tree(bits):
"""
Construiește arborele Calkin-Wilf pentru un șir de biți.
Args:
bits: Șirul de biți pentru care se construiește arborele.
Returns:
Arborele Calkin-Wilf pentru șirul de biți dat.
"""
if not bits:
return TreeNode(value=0)
if len(bits) == 1:
return TreeNode(value=bits[0])
left_tree = build_calkin_wilf_tree(bits[:len(bits) // 2])
right_tree = build_calkin_wilf_tree(bits[len(bits) // 2:])
return TreeNode(value=bits[0], left=left_tree, right=right_tree)
Această implementare folosește o structură de date numită TreeNode pentru a reprezenta nodurile arborelui Calkin-Wilf. Structura TreeNode are două câmpuri:
- value: Valoarea nodului.
- left: Subnodul stâng al nodului.
- right: Subnodul drept al nodului.
Funcția build_calkin_wilf_tree construiește arborele Calkin-Wilf recursiv. Funcția calkin_wilf_compression folosește funcția build_calkin_wilf_tree pentru a construi arborele și apoi parcurge arborele în ordine inversă pentru a genera șirul de biți comprimat.