У меня преподаватель спрашивает, почему алгоритм Шеннона-Фано делит алфавит на лево и право, а не лево и право, и середину, например. Я говорю, что это традиционно так устоялось, в связи с бинарным кодированием, этот метод наиболее эффективен для вычислительных машин. Он говорит: "и что, так, а почему именно так". Помогите пожалуйста, я немного не понимаю что от меня требуется
Также он сказал, что в коде у меня это есть, поэтому вот код:
def generirovat_kody(self, uzly):
# проверяем, состоит ли список узлов более чем из одного элемента
if len(uzly) > 1:
# суммируем вероятности всех узлов, чтобы найти общую вероятность
vsego_veroyatnostey = sum(uzel.veroyatnost for uzel in uzly)
# инициализируем переменную для хранения наилучшего отклонения (разницы сумм вероятностей групп после разделения)
luchshee_otkloenenie = vsego_veroyatnostey
# инициализируем переменную для хранения индекса, при котором достигается наилучшее разделение
luchshiy_indeks = 0
# для подсчета текущей суммы вер.
tekushchaya_summa = 0
# ищем место для разделения списка
for i, uzel in enumerate(uzly):
# прибавляем вероятность текущего узла к текущей сумме
tekushchaya_summa += uzel.veroyatnost
# вычисляем разницу между суммами вероятностей двух групп после разделения
razlichie = abs((vsego_veroyatnostey - tekushchaya_summa) - tekushchaya_summa)
# если найденное различие меньше текущего наилучшего, обновляем наилучшее отклонение и индекс
if razlichie < luchshee_otkloenenie:
luchshee_otkloenenie = razlichie
luchshiy_indeks = i + 1
# разделяем список узлов на две группы по найденному индексу
levo = [uzel for uzel in uzly[:luchshiy_indeks]]
pravo = [uzel for uzel in uzly[luchshiy_indeks:]]
# присваиваем коды узлам в левой группе
for uzel in levo:
uzel.kod += '0'
# присваиваем коды узлам в правой группе
for uzel in pravo:
uzel.kod += '1'
# применение функции к обеим группам
self.generirovat_kody(levo)
self.generirovat_kody(pravo)