P3 init und Text in Binär und in Blöcke unterteilt
This commit is contained in:
145
P3/main.py
Normal file
145
P3/main.py
Normal 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()
|
||||
Reference in New Issue
Block a user