![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Servantes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.5.2009 Репутация: нет Всего: нет |
Ве4ер добрый всем. Я реализую программу на Visual Studio - сжатие файлов по лагоритму Хаффмана. Программу написать было не сложно. Но проблемы оказались при проверке. Когда входной файл относительно(по меркам байт) большой - обходы дерева и построение дерева оказываются процессами скажем прямо не быстрыми. Я завел эту тему ,потому что хо4у ,чтобы программа работала быстрее. Ниже приведен код. Надеюсь на вашу помощь.
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
В векторе лучше хранить указатели. Присутствие глобальных переменных говорит о не правильном проектировании. Если в коде используешь векторы, значит это С++. Почему тогда используешь malloc() ? P.S. Половину кода нужно переписать. Качество ужасное. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
ITBL организованна неправильно - нужен массив на 256 элементов и при заполнении массива не нужно искать в нем элемент циклом, адресуйся прямо по индексу.
Собственно алгоритм формирования кода Хафмана вообще понять невозможно, названия рабочих переменных TCD, ITBL,WTBL,DTBL,Temp,CTemp ясности не прибавляет (не говоря уже о полном отсутствии каких либо комментариев) |
|||
|
||||
| vinick |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
удалять что-то из вектора в цикле - плохая идея, он для этого не приспособлен.
Использование at() вместе с проверкой size здесь и в других местах бессмысленно. Лучше что-то одно.
Вектора используются только по 1 разу, так что тут можно передавать по ссылке. |
||||||
|
|||||||
| Servantes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.5.2009 Репутация: нет Всего: нет |
Я не силен в C++. У меня возник вопрос во время удаления 4уши всякой мною же написанной - я читаю файл разом. При чтении ехе этот способ неприемлим ибо нулевых байтов там хоть отбавляй. Как быть??? Вернуться к побайтовому чтению?
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Servantes, Может взять готовый код?
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Servantes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.5.2009 Репутация: нет Всего: нет |
Я бы с удовольствием, но в интернете коды сложные
|
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Твой код замечательно будет читать любые символы, в том числе и нулевые
Кроме того, лучше сначала разобраться с основами языка, и уж тем более с основами stl, что бы не лепить плохо приспособленные контейнеры к месту и не к месту. Изложи алгоритм, простым (можно русским) языком, потом можно будет выбрать наиболее подходящие структуры данных (и stl контейнеры в том числе), и только потом можно будет начинать кодировать алгоритм. Ты пока пытаешься пройти этот путь наоборот - с конца к началу |
||||||||
|
|||||||||
| Servantes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.5.2009 Репутация: нет Всего: нет |
Для начала я считываю файл. И тут изза не знания языка я не могу рационально считать файл - только по байтам, так как при считывынии сразу в char целиком могут встретиться нулевые байты - а они для чара именуют конец строки. Считывая каждый символ, я заношу его в массив из 256 элементов в ячейку с номером кода символа(здесь он не написан, но я переписал). После этого я из таблицы частот которую мы построили начинаю выбирать два самых редких элемента и из них формировать узел, удаляя элементы из таблицы и добавляя в конец сам узел(структура таблицы - символ, число повторении, адрес для узла). И так пока не останется один элемент. Следующий этап - обхожу построенное дерево сначало слева потом справа пока не встре4у символ(изза нулевого символа я сделал проверку на дерево->left == NULL). И вормирую новую таблицу символов и кодов им соответствующих. Затем собираю из кодов выходную строку и блоками по 8 элементов загоняю их в элемент типа char поразрядными сдвигами. в кодированном файле хранится в первых 4-х байтах число кодированных бит(т.к. у нас их может быть и не кратно 8), потом сама строка и потом таблица с кодами- символ и заним в двух байтах число посторений во входном файле. По этой таблице при декодировании строю дерево и восстанавливаю исходный файл. Вот алгоритм действий моих.
|
|||
|
||||
| xvr |
|
||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ты его в самом первом твоем посте вполне нормально считал целиком
Порядок полей несколько неочевиден, я бы сохранил так -
|
||||||||||||||||
|
|||||||||||||||||
| Servantes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.5.2009 Репутация: нет Всего: нет |
Сори за очепятки) - повторений.
записывать то можно и блоками не по 8 , но байт состоит из 8 бит. и лишние нули которые будут сами собой появляться это ненужный мусор |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Посмотрел еще раз исходники - понял. У вас выходной поток накапливается в строке в виде символов '1' и '0'. Наверное сделать медленнее можно, но очень сложно Несколько советов:
|
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |