2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Алгоритм Шеннона - Фано
Сообщение15.01.2024, 10:44 


15/01/24
1
У меня преподаватель спрашивает, почему алгоритм Шеннона-Фано делит алфавит на лево и право, а не лево и право, и середину, например. Я говорю, что это традиционно так устоялось, в связи с бинарным кодированием, этот метод наиболее эффективен для вычислительных машин. Он говорит: "и что, так, а почему именно так". Помогите пожалуйста, я немного не понимаю что от меня требуется

Также он сказал, что в коде у меня это есть, поэтому вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
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)

 Профиль  
                  
 
 Re: Алгоритм Шеннона - Фано
Сообщение15.01.2024, 13:03 
Заслуженный участник
Аватара пользователя


16/07/14
9304
Цюрих
Странный вопрос. Важно, что делят на две части. Потому что мы строим бинарный префиксный код, а в нём первый символ делит на две группы. Если бы строили троичный код, то делили бы на три части.
Называть эти части можно как угодно. Традиционно называют левой и правой (потому что дерево рисуют по вертикали, и левая ветка соответствует нулю, правая единице), но можно было бы назвать и зеленой и сиреневой, или ботинком и тапочком.

 Профиль  
                  
 
 Re: Алгоритм Шеннона - Фано
Сообщение15.01.2024, 17:56 


17/10/16
5049
Вопрос, видимо, в том, почему именно бинарный код используем, а не троичный, например. Наверное, потому, что бинарный код - это простейшее, предельно возможное "цифровое" представление информации. Троичный и более высокие коды приближаются к аналоговому представлению.

 Профиль  
                  
 
 Re: Алгоритм Шеннона - Фано
Сообщение16.01.2024, 11:01 
Аватара пользователя


05/06/08
479
Где-то в седые 80е ходила мулька, что троичный код - самый оптимальный для вычислений. И что кто-то это даже доказал. Видимо, кто-то из группы создателей троичного процессора на Мехмате.

 Профиль  
                  
 
 Re: Алгоритм Шеннона - Фано
Сообщение16.01.2024, 12:31 
Заслуженный участник
Аватара пользователя


16/07/14
9304
Цюрих
Не для вычислений, а для представления. Если для каждого возможного значения каждого разряда мы заводим по лампочке, то минимальное число лампочек понадобится в троичной системе. Например для чисел от 0 до $2^{20}$ нам понадобится 20 двоичных разрядов (40 лампочек), но только 13 троичных (39 лампочек).

 Профиль  
                  
 
 Re: Алгоритм Шеннона - Фано
Сообщение16.01.2024, 14:07 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
MGM в сообщении #1626033 писал(а):
Где-то в седые 80е ходила мулька, что троичный код - самый оптимальный для вычислений. И что кто-то это даже доказал. Видимо, кто-то из группы создателей троичного процессора на Мехмате.

Если память не изменяет: Горбатов. Основания дискретной математики

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: wrest


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group