Сжатие данных алгоритмом Хаффмана
В данной статье я расскажу вам о широко известном алгоритме Хаффмана, и вы наконец разберетесь, как все там устроено изнутри. После прочтения вы сможете своими руками(а главное, головой) написать архиватор, сжимающий реальные, черт подери, данные! Кто знает, быть может именно вам светит стать следующим Ричардом Хендриксом!
Да-да, об этом уже была статья на Хабре, но без практической реализации. Здесь же мы сфокусируемся как на теоретической части, так и на программерской. Итак, все под кат!
Почему для двигателей так важна степень сжатия, и на что она влияет.
Вы наверняка слышали термин «степень сжатия» в двигателях внутреннего сгорания. Но вы когда-нибудь задумывались, что он означает? Итак, пришло время точно объяснить, что же такое коэффициент сжатия (степень) в двигателях автомобиля и почему сегодня все автопроизводители одержимы этим показателем, как будто этот параметр представляет собой Святой Грааль для будущих продаж автоновинок.
Сразу хотим отметить, что разобраться в том, что такое степень сжатия двигателя, не так просто, как кажется на первый взгляд. Вы наверняка заметили в различных рекламных проспектах и каталогах, а также в описании на сайтах автопроизводителей, что автобренды пытаются привлечь наше внимание такой характеристикой, как степень сжатия двигателей. Особенно стараются нам рассказать о степени сжатия менеджеры автосалонов. Мы обычно делаем вид, что понимаем, о чем идет речь, пропуская мимо ушей эту информацию. И причина такого поведения в том, что многие автолюбители просто не представляют, что такое степень сжатия двигателей, равно как и на что она влияет. Но тем не менее мы считаем, что все автолюбители должны знать, что же это за показатель двигателей внутреннего сгорания, о котором недавно вспомнили многие автопроизводители.
Мы знаем, что высокое сжатие двигателя – это хорошо, а низкое – плохо. Мы также знаем, что новый мотор Mazda Skyactiv-X имеет высокую степень сжатия. Не отстает от Mazda и Toyota со своими моторами «Dynamic Force», которые имеют высокую степень сжатия. Эти компании рекламируют новые двигатели с большим коэффициентом сжатия, заявляя, что они не только стали мощнее, но и получили большую экономичность. Но при чем здесь высокая степень сжатия и увеличение мощности с уменьшением расхода топлива? Сейчас объясним.
Мы живем в эпоху, когда инженеры не могут просто дать двигателю больше энергии за счет укрупнения, как, например, это было раньше, когда автопроизводители на многие свои автоновинки устанавливали моторы с увеличенным объемом. К тому же это приводило к неминуемому увеличению расхода топлива и росту уровня вредных выбросов в выхлопе автомобиля. Сегодня в связи с дороговизной топлива по всему миру и сложной экологической обстановкой подобный способ увеличения мощности мотора не подходит. Особенно если учитывать жесткие экологические нормы, предъявляемые автопроизводителям рядом развитых западных стран.
В итоге автопроизводители стали улучшать эффективность нынешних моторов за счет применения турбин и увеличения степени сжатия современных двигателей.
Как рассчитать и изменить степень сжатия двигателя
Одним из главнейших технических показателей автомобильного мотора является коэффициент сжатия. Он показывает соотношение разницы между объёмом свободного участка над цилиндровым поршнем и под ним в крайних его положениях.
Как найти коэффициент жёсткости пружины: формула, определение
Рано или поздно при изучении курса физики ученики и студенты сталкиваются с задачами на силу упругости и закон Гука, в которых фигурирует коэффициент жесткости пружины. Что же это за величина, и как она связана с деформацией тел и законом Гука?
Сила упругости и закон Гука
Для начала определим основные термины, которые будут использоваться в данной статье. Известно, если воздействовать на тело извне, оно либо приобретет ускорение, либо деформируется. Деформация — это изменение размеров или формы тела под влиянием внешних сил. Если объект полностью восстанавливается после прекращения нагрузки, то такая деформация считается упругой; если же тело остается в измененном состоянии (например, согнутом, растянутом, сжатым и т. д. ), то деформация пластическая.
Примерами пластических деформаций являются:
- лепка из глины;
- погнутая алюминиевая ложка.
В свою очередь, упругими деформациями будут считаться:
- резинка (можно растянуть ее, после чего она вернется в исходное состояние);
- пружина (после сжатия снова распрямляется).
В результате упругой деформации тела (в частности, пружины) в нем возникает сила упругости, равная по модулю приложенной силе, но направленная в противоположную сторону. Сила упругости для пружины будет пропорциональна ее удлинению. Математически это можно записать таким образом:
где F — сила упругости, x — расстояние, на которое изменилась длина тела в результате растяжения, k — необходимый для нас коэффициент жесткости. Указанная выше формула также является частным случаем закона Гука для тонкого растяжимого стержня. В общей форме этот закон формулируется так: «Деформация, возникшая в упругом теле, будет пропорциональна силе, которая приложена к данному телу». Он справедлив только в тех случаях, когда речь идет о малых деформациях (растяжение или сжатие намного меньше длины исходного тела).
Реализация
Пришло время унижать мой код писать архиватор. Назовем его Compressor.
Начнем с начала. Первым делом пишем класс Node:
Класс, создающий дерево Хаффмана:
Класс, облегчающий чтение из файла:
Ну, и главный класс:
Файл с инструкциями readme.txt предстоит вам написать самим 🙂
Почему производители стараются увеличить степень сжатия?
Но не все так просто со степенью сжатия. Одно дело – понимать, что такое степень сжатия. И это не менее важно по сравнению с пониманием, почему так важна высокая степень сжатия для современных двигателей. К сожалению, объяснить простыми словами, почему высокая степень сжатия в двигателях современных автомобилей – это отличное решение на ближайшие годы, не получится. Тем не менее мы попытаемся.
Вы знаете, что мощность двигателя появляется в тот момент, когда сгорание топливной смеси оказывает силу на поршень внутри цилиндра двигателя. Эта сила толкает поршень вниз по цилиндру. И чем выше поршень находится в цилиндре в момент сжигания топливно-воздушной смеси, тем больше сил будет приложено на поршень.
Как мы уже сказали, чем больше степень сжатия, тем выше находится поршень в верхней мертвой точке. В итоге это позволяет вырабатывать больше мощности в момент сгорания топлива. Также помимо увеличения мощности для вырабатывания силы, толкающей поршень вниз по цилиндру двигателя, необходимо меньше топлива, что в конечном итоге влияет на топливную эффективность мотора. Это простое объяснение. Но оно неполное, поскольку при увеличении степени сжатия двигателей возникает ряд проблем, для решения которых необходимо в идеале знать термодинамику.
Итак, мы знаем, что высокая степень сжатия означает, что двигатель получает больше силы и мощности из того же количества топлива по сравнению с мотором с меньшим коэффициентом сжатия. Как мы выяснили, это хорошо для динамики автомобиля, а также для достижения хороших показателей его экономичности.
Чтобы объяснить вам точнее, почему более высокая степень сжатия дает больше экономии топлива, мы не будем погружаться слишком глубоко в науку о термодинамике. Тем не менее без нее нам также не объяснить вам в деталях, почему моторы с большой степенью сжатия более экономичные. Да, это нелегко понять. Но все же этот раздел термодинамики очень и очень интересен.
Заключение
Наверное, это все что я хотел сказать. Если у вас есть что сказать по поводу моей некомпетентности улучшений в коде, алгоритме, вообще любой оптимизации, то смело пишите. Если я что-то недообъяснил, тоже пишите. Буду рад услышать вас в комментариях!
Да-да, я все еще здесь, ведь я не забыл про коэффициент. Для строки s1 кодировочная таблица весит 48 байт — намного больше исходного файла, да и про добавочные нули не забыли(количество добавленных нулей равно 7)=> коэффициент сжатия будет меньше единицы: 176/(65 + 48*8 + 7)=0.38. Если вы тоже это заметили, то только не по лицу вы молодец. Да, эта реализация будет крайне неэффективной для малых файлов. Но что же происходит с большими файлами? Размеры файла намного превышают размер кодировочной таблицы. Вот здесь-то алгоритм работает как-надо! Например, для монолога Фауста архиватор выдает реальный (не идеализированный) коэффициент, равный 1.46 — почти в полтора раза! И да, предполагалось, что файл будет на английском языке.
Выпустил upgrade: добавил GUI + изменил алгоритм обработки исходного текста так, чтобы не читать весь файл в память. Короче, кидаю ссылку на git для любознательных: сами всё увидите.
Благодарности
Как и автор каждой хорошей книги, я созидал эту статью не без помощи других людей. Имхо, очень мало людей сделало что-то крутое в одиночку.
Огромное спасибо Исаеву Виталию Вячеславовичу за небходимую теоретическую поддержку.
Также, часть материала этой статьи взята из книги Роберта Лафоре «Data Structures and Algorithms in Java». Если сомневаетесь как или окуда начать свой путь в теории алгоритмов и структур данных — берите, не прогадаете.
Отличие степени сжатия от компрессии
Степень сжатия двигателя не является компрессией. Они полностью различаются, хотя многие их путают. Коэффициент, о котором идёт речь в статье, не раскрывает значение оптимального давления ТВС перед возгоранием. Измеряется ССД лишь относительно, в соотношении к единице объёма камеры.
Под компрессией принято понимать предельное значение сжатия, образуемого в камере сгорания, на конечном этапе давления горючей смеси. Данная величина априори не может быть относительной, поэтому её измеряют в абсолютных значениях — атм, кг/см2, бар.
Степень сжатия и компрессия неразрывно связаны, но не идентичны. Показатель компрессии зависит не только от сжатия. На него оказывает влияние температура ДВС, наличие зазоров в приводных клапанах, состав топлива и многое другое.
Вычисление коэффициента жесткости опытным методом
С помощью несложного опыта можно самостоятельно рассчитать, чему будет равен коэффициент Гука. Для проведения эксперимента понадобятся:
- линейка;
- пружина;
- груз с известной массой.
Последовательность действий для опыта такова:
- Необходимо закрепить пружину вертикально, подвесив ее к любой удобной опоре. Нижний край должен остаться свободным.
- При помощи линейки измеряется ее длина и записывается как величина x1.
- На свободный конец нужно подвесить груз с известной массой m.
- Длина пружины измеряется в нагруженном состоянии. Обозначается величиной x2.
- Подсчитывается абсолютное удлинение: x = x2-x1. Для того чтобы получить результат в международной системе единиц, лучше сразу перевести его из сантиметров или миллиметров в метры.
- Сила, которая вызвала деформацию, — это сила тяжести тела. Формула для ее расчета — F = mg, где m — это масса используемого в эксперименте груза (переводится в кг), а g — величина свободного ускорения, равная приблизительно 9,8.
- После проведенных расчетов остается найти только сам коэффициент жесткости, формула которого была указана выше: k = F/x.
Существуют ли ограничения по увеличению степени сжатия в двигателях
Интересно, почему автопроизводители не стараются сделать степень сжатия своих двигателей еще больше? Почему сегодня коэффициент сжатия 14:1 уже считается много? Неужели нельзя сделать двигатель с еще большим коэффициентом сжатия? Ведь в таком случае автомобили получили бы еще больше мощности и одновременно стали бы еще экономичней.
Например, почему бы не сделать двигатель со степенью сжатия 60:1? Но на самом деле это невозможно в сегодняшнем мире.
Такую степень сжатия не выдержит ни один металл внутри двигателя. Да дело даже не в металле. Даже если бы у нас был такой крепкий дешевый металл, способный выдержать степень сжатия 60:1, все равно бы мы не смогли построить подобный рабочий мотор. Просто такая степень сжатия привела бы к чрезмерно высокой температуре внутри двигателя. В итоге мотор стал бы настолько горячим, что это вызвало бы его самоуничтожение (двигатель взорвался бы от высоких температур).
Также, в принципе, нас не должна так сильно заботить высокая степень сжатия в современных автомобилях, если речь идет, конечно, не о спортивных мощных автомобилях, где каждая лишняя лошадиная сила на вес золота. Сегодня в рамках массового рынка нас больше волнует не мощность, а экономичность обычных повседневных автомобилей. Особенно во времена немалой стоимости топлива, где вопрос экономии топлива напрямую влияет на наши кошельки. Также сегодня более остро стоит вопрос экологии. А мы знаем, что чем менее экономичен автомобиль, тем меньше он загрязняет окружающую среду выхлопными газами. Так что, в принципе, увеличение степени сжатия в современных двигателях необходимо в первую очередь для улучшения экологической обстановки на всей планете. Но для того чтобы этого добиться, нет смысла существенно увеличивать в современных моторах степень сжатия.
Вот мы и подошли к концу темы о степени сжатия двигателей внутреннего сгорания. Надеемся, что теперь вы не просто знаете, что такое степень сжатия силовых агрегатов, но и понимаете, какую важную роль она играет в современных двигателях.
Примеры задач на нахождение жесткости
Задача 1
На пружину длиной 10 см действует сила F = 100 Н. Длина растянутой пружины составила 14 см. Найти коэффициент жесткости.
- Рассчитываем длину абсолютного удлинения: x = 14—10 = 4 см = 0,04 м.
- По формуле находим коэффициент жесткости: k = F/x = 100 / 0,04 = 2500 Н/м.
Ответ: жесткость пружины составит 2500 Н/м.
Задача 2
Груз массой 10 кг при подвешивании на пружину растянул ее на 4 см. Рассчитать, на какую длину растянет ее другой груз массой 25 кг.
Турбированные моторы
На турбомоторах расчёт коэффициента сжатия отличается. Это объясняется наличием наддува воздуха. Поэтому в этом случае величину, полученную в ходе вычислений, умножают на показатель турбокомпрессора.
Кроме того, при вычислении степени сжатия турбированных моторов учитывается не только давление наддува, но и показатель эффективного сжатия, климатические изменения и многое другое. В данном случае процесс значительно усложняется по сравнению с измерениями на атмосферном двигателе.
Пример подсчета
Вот как выглядит общепринятая расчётная формула для автомобильного ДВС: «ССД = (РО+ОКС)/ОКС». Степень сжатия здесь отмечена как «ССД», рабочий объём цилиндра — «РО», а объём камеры сгорания — «ОКС».
Для расчёта «РО» нужно в первую очередь разложить единый объём двигателя или литраж на количество используемых цилиндров. К примеру, литраж мотора «четвёрки» — 1997 см3. Для определения ёмкости одного цилиндра, надо 1997 разделить на 4. Получится около 499 см3.
Для вычисления параметра «ОКС» специалисты пользуются проградуированной в см3 трубкой или пипеткой. Под камерой подразумевается место, где непосредственно происходит возгорание горючего. Камеру заправляют, а затем измеряют объём с помощью жидкостной бюретки. Если нет градуированной трубочки, можно жидкость выкачать с помощью шприца, а затем измерить в мерной посуде или на весах. В этом случае желательно для расчёта использовать не бензин или солярку, а чистую воду, так как её удельный вес более соотносим к объёму в см3.
Внимание! Для точного измерения «ОКС» дополнительно приплюсовывается объём толщины прокладки ГБЦ, учитывается форма днища поршней и другие особенности. Поэтому расчёт этой величины рекомендуется доверить специалистам.
Дефорсирование ДВС: для чего нужно и как осуществить
Иногда бывает необходимо уменьшить показатель сжатия. В этом случае устанавливается дополнительная металлическая прокладка ГБЦ. Можно использовать две прокладки вместо одной, тем самым утолщая промежуток — объём камеры растёт за счёт высоты головки блока. Более сложный способ подразумевает укорочение поршня — удаление верхнего слоя на токарном станке.
Дефорсирование двигателя, как правило, процедура вынужденная. В том числе это делается для снижения налоговых выплат или в целях увеличения ресурса агрегата. Как известно, моторы с низкой степенью сжатия дольше работают, меньше подвержены износу. Однако любой такой процесс усложняется законом, чтобы недобросовестные владельцы искусственно не занижали технические данные.
Что касается снижения показателя сжатия на турбированных моторах, то здесь потребуется модернизация системы электрики с датчиками, всей поршневой группы и форсунок, если это дизельный агрегат.
В отдельных случаях дефорсированию предпочитают свап, когда менее мощный контрактный мотор устанавливают вместо штатного.
ли со статьей или есть что добавить?