Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 11.12.2023
Сообщений: 2

Реализация алгоритма Шеннона-Фано

11.12.2023, 23:48. Показов 912. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем привет, достаточно долго вожусь с этими функциями. Да-да, куча кодов есть в интернете, можете не писать об этом, мне интересно, что не так лично в МОЕМ коде. Есть два идейно разных подхода, но ни один пока не сработал как надо . Помогите пожалуйста, подсказка по исправлению любого из этих двух подпрограмм будет очень полезна.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
p=[0.3, 0.2, 0.15, 0.1, 0.08, 0.07, 0.05, 0.04, 0.01]
codes=['']*len(p) 
 
 
#вариант функции №1
def shannon_fano_recursive(p, codes, code_prefix=''):
    if len(p) == 1:
        codes[0] = code_prefix
    else:
        left = []
        right = list(p)
        for i in p:
            if sum(left) < sum(p) / 2:
                left.append(i)
                right.remove(i)
            else:
                break
        shannon_fano_recursive(left, codes, code_prefix + '1')
        shannon_fano_recursive(right, codes, code_prefix + '0')
    return codes
print(shannon_fano_recursive(p, codes))
 
 
codes=['']*len(p)#восстанавливаю массив с кодами символов 
 
 
#вариант функции №2
def alg_ShennonaFano(x,y,p,codes):# на вход подаются индексы массива и сами массивы
    ver=0 # с началом каждого цикла рекурсии вероятность должна обнуляться
    for i in range(x,y):
        if abs(y-x)==2:#особый финальный случай, когда осталось всего два элемента
                codes[x]+='1'
                codes[y-1]+='0'
        else:
            k=abs(ver-sum(p[x:y])/2) #сохраняю разность предыдущей вероятности с суммой половины массива
            ver+=p[i] 
            if k<abs(ver-sum(p[x:y])/2): #ищем значение, наиболее близкое к половине суммы массива
            #разбиваем массив на две части по i, в одной части 1 в другой 0
                for j in range(x,i):
                    codes[j]+='1'
                    alg_ShennonaFano(x,i,p,codes)
                for g in range(i,y):
                    codes[g]+='0'
                alg_ShennonaFano(i,y,p,codes)
 
alg_ShennonaFano(0,9,p,codes)
print(codes)
Добавлено через 7 минут
Небольшое пояснение, массив р содержит в себе вероятности. Сами символы для задачи мне не нужны, поэтому кортежи/словари не вижу смысла использовать. Codes, что следует из названия, содержит коды символов соответственно индексации массива с вероятностями
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2023, 23:48
Ответы с готовыми решениями:

Реализация алгоритма Форда-Беллмана
Задача: Пользователь задает числа N и M, количество вершин и ребер ориентированного графа. Далее пользователь вводит M строк вида u, v, w,...

Реализация расширенного алгоритма Евклида в RSA
Доброго времени суток. Подскажите, пожалуйста, пытаюсь написать код на тему &quot;Вскрытие общего модуля RSA&quot;. В реализации есть момент...

Кодирование методами Шеннона-Фано и Хафманна
Помогите пожалуйста, не знаю уже, как с эти кодом бороться... Задание звучит следующим образом: Используя заданный текст построить...

2
6 / 4 / 2
Регистрация: 14.10.2022
Сообщений: 42
12.12.2023, 00:36
В первом варианте функции вместо передачи всего списка codes, можно как вариант передавать подсписок, который относится к текущей ветке рекурсии, а значит функция должна возвращать codes только один раз в самом конце первоначального вызова, а не на каждом шаге рекурсии.

Добавлено через 21 минуту
Хотя знаете не рассматривайте мой предложенный вариант, я перечитал и как-то понял, что такое мне лишь на сонную голову пришло не подумав
0
0 / 0 / 0
Регистрация: 11.12.2023
Сообщений: 2
12.12.2023, 00:38  [ТС]
Mark_Saionji, все равно спасибо за ответ, вы старались)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2023, 00:38
Помогаю со студенческими работами здесь

Реализация алгоритма
Имеются числа n,l,t,p- целые натуральные. Нужно в цикле выводить значения dec(H*bin(i)) где i от 1 до n, h от 0 до l-1. bin(i)...

Реализация алгоритма
Реализация алгоритма построения Эйлерова цикла для теста: -x^3+12sin(3x )-5x= 0

Реализация алгоритма diamond-square
Относительно недавно наткнулся на алгоритм diamond-square и попытался реализовать его на питоне Использовал информации из этой статьи ...

Реализация алгоритма Apriori на Python 3
HELP!!! Уже который раз я прошу помощи у гуру-программистов, так как самой уже хочется :wall: На этот раз это совершенно...

Реализация алгоритма Левенберга-Маркварда
Здравствуйте Возникла проблемка с реализацией алгоритма Левенберга-Маркварда на Питоне. В чем суть задачи: упрощенно: есть точечный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru