Часть 1. Пишем алгоритм Хаффмана на C++

  Рет қаралды 10,014

Daria Emacs

Daria Emacs

Күн бұрын

Пікірлер: 67
@Rafael_Santi
@Rafael_Santi 4 жыл бұрын
Я абсолютно далёк от всего, что тут показано. Но я необычайно впечатлён вашими знаниями и умениями! Приятно и положительно удивлён ) Вот и отличный пример - девушка-программист. Продолжайте вдохновлять и разрушать стереотипы 👍😃
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Спасибо за хороший комментарий), редко можно встретить такое доброжелательное отношение к девушкам-программистам)).
@singletonpersonally4341
@singletonpersonally4341 3 жыл бұрын
Спасибо большое за видео) Очень интересно смотреть, как вы круто используете этот инструмент, посмотрев это видео, увидел то что я костылил, а вы пишете одной строчкой) Спасибо вам большое)
@timoraivonen1848
@timoraivonen1848 4 жыл бұрын
Я .net + js разраб, но меня такие видео подбивают идти учить плюсы :))
@influence3015
@influence3015 4 жыл бұрын
Вообще бы классно было курс по алгоритмам и структурам данных от вас)
@victorkrasnov5576
@victorkrasnov5576 4 жыл бұрын
Проверка на признак конца файла, eof(), приводит у меня как бы к двойному "считыванию" последнего символа - на самом деле, просто к одной лишней итерации. Дело в том, что eof выставляется в true уже после неудачной попытки чтения. То есть мы прочитали последний символ, но eof всё ещё false, и тогда мы заходим в тело цикла лишний раз. Пытаемся снова прочитать символ (безуспешно), и при этом eof наконец-то выставляется в true (а значит, следующей итерации уже не будет), а текущее значение ch (а оно у нас всё ещё равно последнему символу), не изменяется. И вот на следующей строке мы учитываем этот последний символ повторно, чуть искажая статистику. То есть eof(), наверное, не совсем актуален для этого примера, раз он запаздывает на один шаг. Поскольку read() возвращает этот же поток, актуальное состояние которого легко сразу же проверить преобразованием к bool, я бы предложил такой вариант цикла: char ch; while(file.read(&ch, 1)) { frequency[static_cast(ch)]++; // всякие там логи } Проверил у себя, такой цикл выполняется ровно filesize раз, без лишней итерации.
@Shantykoff
@Shantykoff 4 жыл бұрын
Как всегда, подробно и интересно :)
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Спасибо)).
@avraamlin7022
@avraamlin7022 4 жыл бұрын
Да ладно, Дария рад что ты вернулась)
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Спасибо).
@ajaymansur4769
@ajaymansur4769 4 жыл бұрын
Вот черт. Ничего не понял. Либо я дурак, либо с++ для меня очень хорош. А может и то, и другое. Автор как всегда молодчина. Чертовски познавательно
@DariaEmacs
@DariaEmacs 4 жыл бұрын
🤦🏻‍♀️🤦🏻‍♀️🤦🏻‍♀️ жалко.. Спасибо!
@fillon_smith
@fillon_smith 4 жыл бұрын
Вроде все понятно. И полезно для меня. В видео есть заморочки нижнего уровня с signed/unsigned, побайтным чтением файла, это отдельная тема. Для десктопных систем это выглядит излишне. Но учитывая, что плюсы часто применяются для программирования embedded (микроконтроллерной техники) (и денег там больше платят, чем за десктоп имхо), там это все необходимо знать.
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Да, я взяла один из самых простых алгоритмов для того, чтобы можно было посмотреть разные видео с объяснениями. Это всегда помогает лучше понять, что происходит.
@asdffewfew
@asdffewfew 4 жыл бұрын
коммент для поддержания канала. не пропадайте
@user-qm2cb6qr3n
@user-qm2cb6qr3n 4 жыл бұрын
Спасибо за познавательное видео. Хотел спросить, в условии на проверку открыт файл или нет, не лучше ли было еще добавить return с отличным от 0 значением и добавить вывод названия файла. Сейчас же программа просто продолжит выполнение и в логах можно не найти строчку о том что файл не открылся. Почему бы не сделать переменную названия файла константной? Зачем мы завели вектор есть же std::array он выделяется на стеке что избавляет нас от прыжков по памяти? Почему нельзя было сразу завести unsigned char вместо char?
@Rafael_Santi
@Rafael_Santi 4 жыл бұрын
Концовка - бомба! 😂
@ЭдуардАксенов-и4п
@ЭдуардАксенов-и4п 3 жыл бұрын
Такой вопрос, а почему вы в main не используете using namespace std, удобно же? По личным соображениям или так не приветствуется?
@DariaEmacs
@DariaEmacs 3 жыл бұрын
Обычно запрещено правилами code style в команде.
@vlaih0
@vlaih0 4 жыл бұрын
Какая ты зайка))))
@alexey-art-studio
@alexey-art-studio 4 жыл бұрын
Крутяк. Недавно тоже нечто подобное изучал) интересная тема сжатие)
@alexey-art-studio
@alexey-art-studio 4 жыл бұрын
было б интересно про написание драйверов под линукс или винду)
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Да-а-а)). Спасибо, Алексей.
@IExSet
@IExSet 3 жыл бұрын
зачем мы сделали вектор вместо массива ? :-)
@vitprof
@vitprof 4 жыл бұрын
Даша, ты можешь еще игру змейку запрограммировать. Тоже будет хорошим проектом. Как у тебя дела? Чем сейчас занимаешься? Лучше в личку.
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Привет, Виталий. Спасибо. Змеек на С++ очень много)). Вот эта мне нравится. kzbin.info/www/bejne/mXa6f4OCqaeHd68 А личку тут убрали.
@vitprof
@vitprof 4 жыл бұрын
@@DariaEmacs Даш, я тебе на ФБ написал.
@avazart614
@avazart614 4 жыл бұрын
@@vitprof Интересно что у не указан на ютюбе FB только VK , Insta ...
@Ронин-и7е
@Ронин-и7е 4 жыл бұрын
+Daria Emacs как в "зеленом фургоне" - Просю раскрыть тему двоичной системы счисления! не понятны следующие вещи. 1) как это? можно и с минусом получать число из нулей и единиц и не с минусом? как система это узнаёт (нужно минусить или нет), и как это можно особо указать. 2) что за мантисса такая в дробях при двоичной системе счисления? В общем думаю на восьмую и девятую часть рассказов хватит)
@Acid31337
@Acid31337 4 жыл бұрын
Первый бит зарезервирован для знака числа. числа с плавающей точкой преставлены как 0.1234 × 2^(-5678) 1234 - мантисса, -5678 - экспонента (записываются подряд как целые числа в двоичной системе, разумеется) А вообще не запаривайся, считай что это абстракция, детали реализации от тебя скрыты. Ты же не лезешь в исходники операционной системы чтобы узнать как работает printf. И не надо этого делать, а то плохая привычка появится полагаться на детали реализации.
@Ронин-и7е
@Ронин-и7е 4 жыл бұрын
@@Acid31337 именно 0.10101 откуда точка после нуля?! (точнее зачем?) можно же 123 * 2 ^ n зачем огород городить? и почему в мантиссе встречаются огромные цифры? можно же просто увеличить степени двойки (и почему степень с "-" ?) и используются ли в экспоненте дробные степени?)))
@Acid31337
@Acid31337 4 жыл бұрын
@@Ронин-и7е то что проще сделать бывает не проще объяснить как оно работает, и наоборот. Минус я для примера поставил, там может быть как отрицательное, так и положительное число. Мантисса отвечает за точность. Ну это опять же детали реализации, смысла их знать или обсуждать почему так, а не эдак никакого нет.
@victorkrasnov5576
@victorkrasnov5576 4 жыл бұрын
Мне кажется, в код вкралась небольшая очепятка: int value = (i + filesize%20) * 100.0 / filesize; Тут filesize%20 - постоянная величина и её прибавление к счётчику не имеет смысла, а просто даёт некоторую неточность, разве нет? Я бы написал так: int value = i * 100.0 / filesize;
@holy-del
@holy-del 3 жыл бұрын
Это нужно только для того, чтобы в консоли не осталось 99% при завершении работы программы. Допустим, у нас 110 байт в файле. Мы выставляем процент каждый двадцатый байт, начиная с первого. 0,20,40,60,80,100. Сотая итерация - последняя, которая пройдет в условие i%20 == 0. Некрасиво получится.
@programer8
@programer8 4 жыл бұрын
Дарья, как учить школьную математику самостоятельно, есть ли какие-то книги с объяснениями?
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Конечно, есть. Всё зависит от того, какой раздел математики нужно вспомнить.
@programer8
@programer8 4 жыл бұрын
@@DariaEmacs в первую очередь алгебру, а потом и геометрию
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Ларри Гоник: "Алгебра. Естественная наука в комиксах" не подойдет?
@programer8
@programer8 4 жыл бұрын
@@DariaEmacs спасибо, посмотрю. Математику учить самостоятельно непросто, из за того что не предусмотрено такая возможность
@0day694
@0day694 4 жыл бұрын
Вай пэрсиг!
@Ruslan-kk4pf
@Ruslan-kk4pf 4 жыл бұрын
127 лайк, ещё один и юбилей))
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Да, будет красивое число 10000000 ))
@Ruslan-kk4pf
@Ruslan-kk4pf 4 жыл бұрын
@@DariaEmacs жаль не в десятичной :D
@kosiak10851
@kosiak10851 4 жыл бұрын
Алгоритм известный, я б его и без подсказок написал. Мне кажется, начинающим программистам было б очень полезно узнать побольше про баш, команды, утилиты, редакторы и.т.д. Потому что обычно начинают программировать под виндоус в вижуал студии, где все эти битики легко посмотреть прямо из окна. И далее учатся языку, алгоритмам и.т.д. А вот как в баше не то что редактором пользоваться, а тупо файл пустой создать - нигде не объясняют. Вот это xxd -b взрывает мозг в 100 раз больше, чем сам Хаффман.
@mistergrinch7342
@mistergrinch7342 4 жыл бұрын
блин ,вы правы ! пойду убьюсь. :-)
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Ни в коем случае, умные и благородные люди нужны человечеству! :))
@avazart614
@avazart614 4 жыл бұрын
1. Зачем читать через read() когда есть get() ? char ch; while(ifs.get(ch)) // так лаконичнее и очевиднее чем через eof() & read() { // use ch } 2. Если уже используешь вектор и вычисляешь размер файла то разумно сразу делать reserve() 3. Думаю объяснение ввода прогресса с трюком через был лишним для начинающих. И думаю стоит начинать все же с изучения предметной области(что пишем, для чего пишем) а не с кода. 4. Интересно как Вы в следующих видео решите проблему с кодировками файла UTF-8/Window1251 учитывая что текст взят на русском.
@avazart614
@avazart614 4 жыл бұрын
А еще __PRETTY_FUNCTION__ не стандарт, а значит скорее всего не будет работать в MSVC под виндой.
@mistergrinch7342
@mistergrinch7342 4 жыл бұрын
спасибо.а разве (-128 )не вверху числовой окружности.
@DariaEmacs
@DariaEmacs 4 жыл бұрын
В C++ char вот так устроен. Если у Вас есть char ch = -128, и Вы вычтите из него 1, то будет: -128 - 1 = 127. И в результате, ch = 127.
@mistergrinch7342
@mistergrinch7342 4 жыл бұрын
11111111=(-127) 10000000= (-0),никак( -128) 01111111+1=переполнение=10000000=0.восьмой разряд это знак. -128-1=-129,а это переполнение и ответ будет (+1)
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Немного не так. 11111111 = -1, а -127 = 10000001. Для того, чтобы перейти от положительного числа к отрицательному нужно инвертировать все биты и прибавить 1. Пример: 127 (0111 1111) хотим получить -127. Инвертируем: 1000 0000, а теперь прибавляем 1: 1000 0001. Это и будет битовое представление -127. А -128 = 10000000. И получается 10000001 + 1 = 10000000, то есть 127 + 1 = -128.
@VeloVetal
@VeloVetal 3 жыл бұрын
@@DariaEmacs не char так устроен, а процессор и называется такое представление отрицательных чисел -- дополнительный код, самый распространенный способ.
@fill_v1
@fill_v1 3 жыл бұрын
Кто писал код? у всех не открывает файл? и обработка ошибок уже такими способами не пишется
@DariaEmacs
@DariaEmacs 3 жыл бұрын
Напишите, как вам удобно
@Ронин-и7е
@Ронин-и7е 4 жыл бұрын
говорят в недрах линухи лежат 2 словаря (англицкий и русский) никто не знает где они?
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Раньше лежали /usr/share/dict/ или в либреофисе? Хотя у меня лично был установлен stardict и к нему пришлось скачивать файлы отдельно.
@BobiBobObana
@BobiBobObana 4 жыл бұрын
xxd с русским языком не работает?
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Работает и сам алгоритм работает, но каждая русская буква занимает больше одного байта.
@BobiBobObana
@BobiBobObana 4 жыл бұрын
@@DariaEmacs спасибо за ответ. Но у меня ( linux ubuntu) символ занимает 4 байта. Например номер символа 'ф' можно получить только с помощью int a = int (L'ф'); и значение равно 1092. Но! как же мне число 1092 назад привести к 'ф'? wchar_t не работает выдает число, но не символ. И кстати xxd русские буквы не показывает. unicode-table.com/ru/ засада и это тоже не работает: decltype ( L 'ы' ) d = 1092; cout
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Почему "но"? wchar_t и занимает 4 байта). Вы же не читаете русские буквы, Вы читаете байты, поэтому алгоритму всё равно, что там внутри и как это потом интерпретирует язык. Английские буквы я использовала только для наглядности, чтобы было понятно, как это работает. Кстати, у нас с Вами разные понятия слово "работает", у меня "работает", значит, показывает байты в бинарном формате.
@BobiBobObana
@BobiBobObana 4 жыл бұрын
@@DariaEmacs у нас с Вами разные понятия слово "работает", у меня "работает", значит, показывает байты в бинарном формате. Если не сложно объясните вывод программы. На вход подаю текстовый файл с одной буквой 'ф' а xxd выдает 00000000: 11010001 10000100 00001010 Я ну не как не могу понять что он мне выдал? (0 х d184 0a никак не похож на (0х444 - значение буквы ф). Проблема была у меня в том, что не могу число привести к буквенному выражению. (не поверите и в сети тоже я этого не могу найти). Что бы у нас программа была юзерфрендли... Как завещал Страуструп... не должно быть у нас магических чисел.
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Потому что у Вас кодировка utf-8. Там как раз значение буквы "ф" и есть d184. www.utf8-chartable.de/unicode-utf8-table.pl?start=1024 (Смотрите: CYRILLIC SMALL LETTER EF).
@reosfire
@reosfire 4 жыл бұрын
да нафиг это все. я вот уже пол часа пытаюсь разгадать ребус в шапке канала(
@DariaEmacs
@DariaEmacs 4 жыл бұрын
Аха-ха)))).
Покодим? Смотрю Ваш код. Тетрис
19:34
Daria Emacs
Рет қаралды 16 М.
Why no RONALDO?! 🤔⚽️
00:28
Celine Dept
Рет қаралды 39 МЛН
ТЫ В ДЕТСТВЕ КОГДА ВЫПАЛ ЗУБ😂#shorts
00:59
BATEK_OFFICIAL
Рет қаралды 4,4 МЛН
БУ, ИСПУГАЛСЯ?? #shorts
00:22
Паша Осадчий
Рет қаралды 2,8 МЛН
С++. Указатели. Начало
19:17
Daria Emacs
Рет қаралды 8 М.
Собеседование | Junior C++
57:15
Daria Emacs
Рет қаралды 249 М.
Зачем нужны указатели в C++?
8:14
С++ для начинающих
Рет қаралды 14 М.
«Осень». Самая большая загадка Windows XP
14:36
Девять десятых
Рет қаралды 1,3 МЛН
Покодим? Обсуждаю Ваш код
15:04
Daria Emacs
Рет қаралды 18 М.
Why no RONALDO?! 🤔⚽️
00:28
Celine Dept
Рет қаралды 39 МЛН