#77 closed ожидается проверка (задача сдана)
HA-2
Reported by: | Волков Даниил | Owned by: | Vladimir Rutsky |
---|---|---|---|
Priority: | проверка | Milestone: | |
Component: | HA#2 huffman | Version: | |
Keywords: | Cc: |
Description
Доброго времени суток!
Папка с решением II дз в репозитории ~/ha2
C уважением, Волков Д.В.
Attachments (1)
Change History (14)
comment:1 Changed 7 years ago by
comment:2 Changed 7 years ago by
Component: | HA#1 matrices → HA#2 huffman |
---|
Сейчас заметил, что указал неверный компонент к тикету. Исправил
comment:3 Changed 7 years ago by
Milestone: | ha2-milestone2 → ha2-deadline |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Замечания:
- Принимайте аргументы, которые не планируете менять, по константной ссылке:
static bool sortByFreq(const Node & a, const Node & b);
- Не стоит указывать константной возвращаемых примитивных типов (в этом ну совсем нет смысла, в отличие от константных примитивных типов в аргументах функций). Плюс
const void
в качестве возвращаемого значения выглядит совсем странно.
- В выводимой статистике размер доп. данных на 4 байт меньше фактического размера доп. данных.
Выводимая статистика распаковки не соответствует условию задачи.
- Используйте более подходящую структуру данных для нахождения минимальных по частоте элементов дерева, чем сортируемый на каждой итерации массив. Например
std::priotity_queue
(но учтите, чтоstd::priotity_queue
не гарантирует порядок извлечения элементов с одинаковым приоритетом, поэтому вам нужно будет сделать свой компаратор явно стабильным).
Исправьте, пожалуйста, в ближайшее время.
comment:5 Changed 7 years ago by
Даниил, при сжатии aaaaaaab0x0A.2.in
вы выводите, что сжатых данных 3 байта, а должно быть два.
Changed 7 years ago by
Attachment: | aaaaaaab0x0A.2.in added |
---|
comment:7 Changed 7 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:8 Changed 7 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
При сжатии файла 0D0A0A0A0B.in
вы выводите:
5 1 19
хотя результирующий файл размером 21 != 1 + 19.
comment:9 Changed 7 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Написал в slack'e про случай
aaaaaaab0x0A.2.in
comment:10 Changed 7 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Вы написали в Slack, что для файла aaaaaaab0x0A.2.in
у вас получаются следующие коды:
10 ("\n") - "1" 98 ("b") - "01" 97 ("a") - "00"
а встречаются они:
10 ("\n") - 1 98 ("b") - 1 97 ("a") - 7
Символ перевода строки, который встретился один раз, имеет более короткий код, чем символ "a", встретившийся семь раз. Вам не кажется такой результат странным?
comment:11 Changed 7 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Исправил компаратор
В связи с тем, что работа не была ещё проверена, а изменения в программе произведены довольно существенные по сравнению с первоначально выложенной версией - выявлены и исправлены утечки памяти и улучшена архитектура - отправляю свежий релиз.
Что исправлено.
Асимптотику построения дерева улучшать до O(N) вместо O(N logN) я посчитал нецелосообразным вследствие малости
вклада этого времени по результатам профилирования. Больше всего времени уходит на функции STL типа _M_assign,
fstream::write.
break
->return
. До этого на каждом уровне вложенности цикла проверялось условие, что байты не кончились.if (tree.freqsVector.size() == 1)
блок перемещен на 308.pos, и в случае его выполнения не производятся лишние операции.HuffMagicNumbers
, для избавления от магических констант. Теперь все константы задаются в одном месте.for
... ->write(..., count)
. Вместо цикла записи по одномубайту можно сразу писать единственным вызовом функции
write
блока байт (хотя результаты бенчмарков не поменялись - в STL все равно циклическая запись).так как при подсовывании программе пустого файла для раскодирования в таком случае ошибка доступа к памяти с падением.
unordered_map
, основанные на хэш-таблицах, а не бывшие до этогоmap
(на деревьях поиска) дают небольшой прирост производительности.pop_back
для массива char (утечка памяти? Неопределенное поведение?).const
там, где это уместно.Текущее состояние
Решение проходит smoketest с включенным valgrind'ом. Также я тестировал сжатие небольших файлов музыки и изображений, и разжатие обратно.
Вопросы
valgrind --leak-check=full --show-leak-kinds=all
распаковки некоторых файлов (в данном случае, пустого) получаем сообщения о каких-то утечках, суть которых осталась мне неясна.Запуск с более либеральными параметрами говорит, что проблем вроде бы нет.
#DEFINE MAGIC_NUMBER 42
. Мой способ решения кажется мне довольно неуклюжим. Хранить же константы как приватные поля структуры дерева вроде тоже не очень (?).Что планируется сделать