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

Адаптивное арифметическое кодирование на Python

15.10.2023, 10:58. Показов 1105. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня такой вопрос: считается ли эта реализация кода "адаптивным арифметическим кодированием"? Если нет, то как нужно исправить? Заранее спасибо за ответ!

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import pickle
 
class ArithmeticCoding:
    def __init__(self, AlphPower, FirstCode, CodingLength):
        self.AlphPower = AlphPower
        self.FirstCode = FirstCode
        self.CodingLength = CodingLength
 
    def count_file_symbols(self, filename):
        symbol_count = 0
        ents = [0] * (self.AlphPower + 1)
        input_file = open(filename, 'r')
        for line in input_file:
            for char in line:
                char_code = ord(char)
                if char_code < self.AlphPower:
                    ents[char_code] = ents[char_code] + 1
                else:
 
                    ents.append(0)
                    self.AlphPower += 1
                    ents[char_code] = ents[char_code] + 1
                symbol_count = symbol_count + 1
        input_file.close()
        return symbol_count, ents
 
    def init_model(self, inputFilename, outputFilename):
        (symbol_count, ents) = self.count_file_symbols(inputFilename)
        for char_code in range(self.FirstCode, self.AlphPower):
            ents[char_code] = 1.0 * ents[char_code] / symbol_count
        low = 0.0
        dic = {}
        for char_code in range(self.FirstCode, self.AlphPower):
            if ents[char_code] > 0:
                high = low + ents[char_code]
                dic[char_code] = (low, high)
                low = high
        model_file = open(outputFilename, 'wb')
        pickle.dump(dic, model_file)
        model_file.close()
 
    def read_model(self, modelFilename):
        input_file = open(modelFilename, 'rb')
        dic = pickle.load(input_file)
        input_file.close()
        return dic
 
    def char_low_high(self, char, dic):
        char_code = ord(char)
        (low, high) = dic[char_code]
        return (low, high)
 
    def add_symbol_to_coding_sequence(self, seq_low, seq_high, dic, symbol):
        (symbol_low, symbol_high) = self.char_low_high(symbol, dic)
        return (seq_low + (seq_high - seq_low) * symbol_low,
                seq_low + (seq_high - seq_low) * symbol_high)
 
    def AriphCoding(self, input_filename, dic, outputfilename):
        input_file = open(input_filename, 'r')
        output_file = open(outputfilename, 'wb')
        coding_result = []
        count = self.CodingLength + 1
        for line in input_file:
            for char in line:
                if count >= self.CodingLength:
                    (low, high) = self.char_low_high(char, dic)
                    count = 1
                else:
                    (low, high) = self.add_symbol_to_coding_sequence(low, high, dic, char)
                    count = count + 1
                if count >= self.CodingLength:
                    coding_result.append((count, low+(high-low)/2))
        if count != 0:
            coding_result.append((count, low + (high - low) / 2))
        pickle.dump(coding_result, output_file)
        input_file.close()
        output_file.close()
 
    def reverse_map(self, char_to_range):
        range_to_char = {}
        for key in char_to_range:
            ranger = char_to_range[key]
            range_to_char[ranger] = key
        return range_to_char
 
    def get_first_char_range(self, value, range_to_char):
        for key in range_to_char:
            ranger = key
            if ranger[0] <= value <= ranger[1]:
                return ranger
        return [-1, -1]
 
    def AriphDecoding(self, input_filename, range_to_char, outputfilename):
        input_file = open(input_filename, 'rb')
        codes = pickle.load(input_file)
        input_file.close()
        output_file = open(outputfilename, 'w')
        for (length, code) in codes:
            for number in range(length):
                char_range = self.get_first_char_range(code, range_to_char)
                char = range_to_char[char_range]
                output_file.write(chr(char))
                (low, high) = char_range
                code = (code-low)/(high-low)
        output_file.close()
 
coding = ArithmeticCoding(255, 0, 5)
choice = int(input("Do you want to encode(0) or decode(1): "))
if choice == 0:
    file_1 = input("Enter the file you want to encode: ")
    file_2 = input("Enter the file you want to write this to: ")
    coding.init_model(file_1, 'ents.txt')
    char_to_range = coding.read_model('ents.txt')
    range_to_char = coding.reverse_map(char_to_range)
    coding.AriphCoding(file_1, char_to_range, file_2)
else:
    file_1 = input("Enter the file you want to decode: ")
    file_2 = input("Enter the file you want to write this to: ")
    char_to_range = coding.read_model('ents.txt')
    range_to_char = coding.reverse_map(char_to_range)
    coding.AriphDecoding(file_1, range_to_char, file_2)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2023, 10:58
Ответы с готовыми решениями:

Арифметическое кодирование на Python
Нужно написать код на Python используя целочисленное арифметику при арифметическом кодировании, плюс чтобы пользователь мог выбрать...

Адаптивное кодирование Хаффмана
Задали курсовую &quot;Реализация кодирования текста адаптивным алгоритмом Хаффмана&quot;. Разобрался с обычным кодированием (ну вроде бы всё...

адаптивное кодирование Хаффмана
помогите разобраться!на фото задание№3 читал википедию,потом по форуму лазил то же тему нашёл про кодирование.И так вот сам...

1
Нарушитель
110 / 86 / 32
Регистрация: 10.05.2023
Сообщений: 323
16.10.2023, 23:12
Да наверное, но можно улучшить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2023, 23:12
Помогаю со студенческими работами здесь

Адаптивное(динамическое) кодирование Хаффмана. Пожалуйста, может у кого-то есть реализация, очень нужен код =(
Адаптивное (динамическое) кодирования Хаффмана, не могу никак реализовать именно адаптивное кодирование.

Арифметическое кодирование.
Арифметическое кодирование динамическое. Слово-вычисление

Арифметическое кодирование.
у меня тоже проблема с арифметическим кодированием. Программу делал соответственно алгоритму, описаному здесь: ...

Арифметическое кодирование
Сразу скажу что тема для меня не новая, 25 лет назад читал про это и даже что-то с преподом обсуждали, но не понял тогда не понимаю и...

Арифметическое кодирование
Написал прогу должна выполнять кодирование Но она только находит интервал для 1-й кодируеммой буквы, и сужает правильно для 2-й, а для...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru