Главная страница

Зертханалық жұмыс №7(+Помех. код.). Мына дістерді пайдаланып апаратты ысу кодтарыны программасын жазыыз


Скачать 278.42 Kb.
НазваниеМына дістерді пайдаланып апаратты ысу кодтарыны программасын жазыыз
Дата17.05.2022
Размер278.42 Kb.
Формат файлаdocx
Имя файлаЗертханалық жұмыс №7(+Помех. код.).docx
ТипПрограмма
#533501

Зертханалық жұмыс №7

Мына әдістерді пайдаланып ақпаратты қысу кодтарының программасын жазыңыз:

1-нұсқа: Шеннон-Фано

2-нұсқа: Хаффман
Input - хабарламалардың пайда болу ықтималдықтары беріледі, output - энтропияны, қысу кодының орташа ұзындығын шығару керек



Input

Output

1

{0,25; 0,25; 0,25; 025}

H(X) = 2

nср = 2 (Шеннона-Фано)
nср = 2 (Хаффман)



from scipy.stats import entropy

class node :

def __init__(self) -> None:

# for storing symbol

self.sym=''

# for storing probability or frequency

self.pro=0.0

self.arr=[0]*20

self.top=0

p=[node() for _ in range(20)]
# function to find shannon code

def shannon(l, h, p):

pack1 = 0; pack2 = 0; diff1 = 0; diff2 = 0

if ((l + 1) == h or l == h or l > h) :

if (l == h or l > h):

return

p[h].top+=1

p[h].arr[(p[h].top)] = 0

p[l].top+=1

p[l].arr[(p[l].top)] = 1

return

else :

for i in range(l,h):

pack1 = pack1 + p[i].pro

pack2 = pack2 + p[h].pro

diff1 = pack1 - pack2

if (diff1 < 0):

diff1 = diff1 * -1

j = 2

while (j != h - l + 1) :

k = h - j

pack1 = pack2 = 0

for i in range(l, k+1):

pack1 = pack1 + p[i].pro

for i in range(h,k,-1):

pack2 = pack2 + p[i].pro

diff2 = pack1 - pack2

if (diff2 < 0):

diff2 = diff2 * -1

if (diff2 >= diff1):

break

diff1 = diff2

j+=1

k+=1

for i in range(l,k+1):

p[i].top+=1

p[i].arr[(p[i].top)] = 1

for i in range(k + 1,h+1):

p[i].top+=1

p[i].arr[(p[i].top)] = 0

# Invoke shannon function

shannon(l, k, p)

shannon(k + 1, h, p)

# Function to sort the symbols

# based on their probability or frequency

def sortByProbability(n, p):

temp=node()

for j in range(1,n) :

for i in range(n - 1) :

if ((p[i].pro) > (p[i + 1].pro)) :

temp.pro = p[i].pro

temp.sym = p[i].sym

p[i].pro = p[i + 1].pro

p[i].sym = p[i + 1].sym

p[i + 1].pro = temp.pro

p[i + 1].sym = temp.sym

# function to display shannon codes

def display(n, p):

print("\n\n\n\tSymbol\tProbability\tCode",end='')

for i in range(n - 1,-1,-1):

print("\n\t", p[i].sym, "\t\t", p[i].pro,"\t",end='')

for j in range(p[i].top+1):

print(p[i].arr[j],end='')

# Driver code

if __name__ == '__main__':

total = 0

# Input number of symbols

print("Enter number of symbols\t: ",end='')

n = 4

print(n)

i=0

# Input symbols

for i in range(n):

print("Enter symbol", i + 1," : ",end="")

ch = chr(65 + i)

print(ch)

# Insert the symbol to node

p[i].sym += ch

# Input probability of symbols

x = [0.25, 0.25, 0.25, 0.25]

print("\nEntropy:")

e = entropy(x, base=2)

print(e)

for i in range(n):

print("\nEnter probability of", p[i].sym, ": ",end="")

print(x[i])

# Insert the value to node

p[i].pro = x[i]

total = total + p[i].pro

# checking max probability

if (total > 1) :

print("Invalid. Enter new values")

total = total - p[i].pro

i-=1

i+=1

p[i].pro = 1 - total

# Sorting the symbols based on

# their probability or frequency

sortByProbability(n, p)

for i in range(n):

p[i].top = -1

# Find the shannon code

shannon(0, n - 1, p)

# Display the codes

display(n, p)



ЗАДАНИЕ

БИТ ЧЁТНОСТИ

Задача

На вход подается битовая строка - строка, состоящая из 0 и 1. Дополните исходную строку последним битом - битом чётности. Бит чётности равен 0, если в исходной строке чётное число единиц, и равен 1, если нечётное (в получившейся строке должно быть всегда чётное число единиц).

Примеры:



Входные данные

Выходные данные

1

00110010

001100101

Кіріс биттік жол – 0 және 1-ден тұратын жол. Түпнұсқа жолды соңғы бит – паритет биті арқылы толтырыңыз. Түпнұсқа жолдың жұп саны 1-ге ие болса, паритет биті 0-ге, ал тақ болса 1-ге тең болады (нәтижедегі жолда әрқашан 1-дің жұп саны болуы керек).



написать администратору сайта