P3 init und Text in Binär und in Blöcke unterteilt

This commit is contained in:
2025-06-25 16:37:06 +02:00
parent ca8e8e9621
commit 0fbfe58fbb
4 changed files with 390 additions and 7 deletions

145
P3/main.py Normal file
View File

@@ -0,0 +1,145 @@
# --- Aus P1 ---
import math
ELEMENTS = []
INTERVALLS = []
N = 32 # länge eines Codeworts
class Element:
id = ""
count = 0
p_x_i = 0
I_x_i = 0
bin = ""
def __init__(self, id):
self.id = id
self.count = 1
def find_element(list, target_it):
for element in list:
if element.id == target_it:
return element
return None
def read_text_file():
path = './text.txt'
with open(path, 'r', encoding='utf-8') as file:
content = file.read()
return content
def Z_statistik(message):
# Ergebnisse mit https://de.planetcalc.com/2476/ prüfbar
# message = read_text_file()
m = len(message)
elements = []
for char in message:
entry = find_element(elements, char)
if entry is not None:
entry.count += 1
else:
elements.append(Element(char))
return calculate(elements, m, message)
def calculate(elements, m, message):
h = 0
for element in elements:
element.p_x_i = element.count / m
element.I_x_i = -1 * math.log2(element.p_x_i)
h += element.p_x_i * element.I_x_i
# Ausgabe
elements.sort(key=lambda element: element.count, reverse=True)
"""for element in elements:
print(f"{element.count:3.0f} | {element.p_x_i:10.7f} | {element.I_x_i:10.7f} | »{element.id}«")
print("Entropie = " + h.__str__() + "\n\n")"""
return elements
# --- Aus P1 ---
def charToBin():
global ELEMENTS
for element in ELEMENTS:
element.bin = format(ord(element.id), 'b')
def calcBitCount(block):
p = 1
for char in block:
element = find_element(ELEMENTS, char)
p *= element.p_x_i
N = round(-math.log(p), 0)
return N
def calcIntervalls():
global INTERVALLS
current_limit = 0
for element in ELEMENTS:
new_limit = current_limit + element.p_x_i
current_limit = new_limit
INTERVALLS.append(new_limit)
def createBlocks(message):
blocks = []
block = []
for char in message:
if len(block) == 0:
block.append(char)
continue
if calcBitCount(block) <= N:
block.append(char)
else:
blocks.append(block)
block = []
return blocks
def createCodeWord(block):
intervall = []
for char in block:
# zeichen für zeichen durch das aktuelle arbeitsintervall wandern und nach jedem Schritt eine Neuberechnung im neuen Teilintervall vornehmen
def AC_Encoder():
global ELEMENTS
global INTERVALLS
message = read_text_file()
l = len(message)
l_bin = l * 8
ELEMENTS = Z_statistik(message)
charToBin()
calcIntervalls()
blocks = createBlocks(message)
print(blocks)
AC_Encoder()