mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-10 19:10:57 +00:00
deploy
This commit is contained in:
@@ -4269,45 +4269,45 @@
|
||||
<h1 id="11">1.1 Алгоритмы повсюду<a class="headerlink" href="#11" title="Permanent link">¶</a></h1>
|
||||
<p>Говоря об алгоритмах, естественно вспомнить о математике. Однако на самом деле многие алгоритмы не связаны со сложной математикой, а больше полагаются на базовую логику, которая повсеместно встречается в нашей повседневной жизни.</p>
|
||||
<p>Прежде чем углубиться в обсуждение алгоритмов, стоит упомянуть интересный факт: <strong>вы уже точно освоили множество алгоритмов и привыкли применять их в повседневной жизни</strong>. Далее приведем несколько конкретных примеров, чтобы подтвердить этот факт.</p>
|
||||
<p><strong>Пример 1: поиск в словаре</strong>. В словаре все слова упорядочены по алфавиту. Предположим, нам нужно найти слово, начинающееся на букву <span class="arithmatex">\(r\)</span>; обычно для этого нужно выполнить следующие действия.</p>
|
||||
<p><strong>Пример 1: поиск в словаре</strong>. В словаре все слова упорядочены по алфавиту. Предположим, нам нужно найти слово, начинающееся на букву <span class="arithmatex">\(r\)</span>. Обычно это делают так, как показано на рисунке 1-1.</p>
|
||||
<ol>
|
||||
<li>Откройте словарь примерно на половине страниц и посмотрите, какая буква является первой на этой странице; предположим, это буква <span class="arithmatex">\(m\)</span>.</li>
|
||||
<li>Откройте словарь примерно на половине страниц и посмотрите, какая буква является первой на этой странице. Предположим, это буква <span class="arithmatex">\(m\)</span>.</li>
|
||||
<li>Поскольку в алфавите буква <span class="arithmatex">\(r\)</span> идет после <span class="arithmatex">\(m\)</span>, исключаем первую половину словаря, и область поиска сужается до второй половины.</li>
|
||||
<li>Продолжайте повторять шаги <code>1.</code> и <code>2.</code> , пока не найдете страницу, где первой буквой слов будет <span class="arithmatex">\(r\)</span>.</li>
|
||||
</ol>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1"><1></label><label for="__tabbed_1_2"><2></label><label for="__tabbed_1_3"><3></label><label for="__tabbed_1_4"><4></label><label for="__tabbed_1_5"><5></label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
<p><img alt="Этапы поиска в словаре. Шаг 1" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step1.png" /></p>
|
||||
<p><img alt="Этапы поиска в словаре" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step1.png" /></p>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<p><img alt="Этапы поиска в словаре. Шаг 2" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step2.png" /></p>
|
||||
<p><img alt="binary_search_dictionary_step2" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step2.png" /></p>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<p><img alt="Этапы поиска в словаре. Шаг 3" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step3.png" /></p>
|
||||
<p><img alt="binary_search_dictionary_step3" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step3.png" /></p>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<p><img alt="Этапы поиска в словаре. Шаг 4" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step4.png" /></p>
|
||||
<p><img alt="binary_search_dictionary_step4" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step4.png" /></p>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<p><img alt="Этапы поиска в словаре. Шаг 5" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step5.png" /></p>
|
||||
<p><img alt="binary_search_dictionary_step5" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step5.png" /></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p align="center"> Рисунок 1-1 Этапы поиска в словаре. Шаг 1 </p>
|
||||
<p align="center"> Рисунок 1-1 Этапы поиска в словаре </p>
|
||||
|
||||
<p>Навык поиска в словаре, которым владеет каждый школьник, на самом деле является известным алгоритмом двоичного поиска. С точки зрения структуры данных словарь можно рассматривать как отсортированный массив; с точки зрения алгоритма последовательность операций по поиску в словаре можно считать двоичным поиском.</p>
|
||||
<p><strong>Пример 2: упорядочивание карт</strong>. Во время игры в карты необходимо каждый раз упорядочивать карты в руке от меньшего к большему. Для этого нужно выполнить следующие действия.</p>
|
||||
<p>Навык поиска в словаре, которым владеет каждый школьник, на самом деле является известным алгоритмом двоичного поиска. С точки зрения структуры данных словарь можно рассматривать как отсортированный массив. С точки зрения алгоритма последовательность операций по поиску в словаре можно считать двоичным поиском.</p>
|
||||
<p><strong>Пример 2: упорядочивание карт</strong>. Во время игры в карты необходимо каждый раз упорядочивать карты в руке от меньшего к большему. Обычно это делают так, как показано на рисунке 1-2.</p>
|
||||
<ol>
|
||||
<li>Разделите карты на упорядоченную и неупорядоченную части, предполагая, что изначально самая левая карта уже упорядочена.</li>
|
||||
<li>Из неупорядоченной части извлеките одну карту и вставьте ее в правильное место в упорядоченной части; после этого две самые левые карты станут упорядоченными.</li>
|
||||
<li>Из неупорядоченной части извлеките одну карту и вставьте ее в правильное место в упорядоченной части. После этого две самые левые карты станут упорядоченными.</li>
|
||||
<li>Повторяйте шаг <code>2.</code> , каждый раз перемещая одну карту из неупорядоченной части в упорядоченную, пока все карты не станут упорядоченными.</li>
|
||||
</ol>
|
||||
<p><img alt="Этапы упорядочивания карт" class="animation-figure" src="../algorithms_are_everywhere.assets/playing_cards_sorting.png" /></p>
|
||||
<p align="center"> Рисунок 1-2 Этапы упорядочивания карт </p>
|
||||
|
||||
<p>Метод упорядочивания карт по своей сути является алгоритмом сортировки вставками, который весьма эффективен при обработке небольших наборов данных. Многие функции сортировки в библиотеках программирования используют именно этот алгоритм.</p>
|
||||
<p><strong>Пример 3: сдача</strong>. Предположим, что в супермаркете мы купили товар стоимостью <span class="arithmatex">\(69\)</span> руб. и дали кассиру купюру в <span class="arithmatex">\(100\)</span> руб. Кассир должен вернуть нам <span class="arithmatex">\(31\)</span> руб. Для этого ему нужно выполнить следующие действия.</p>
|
||||
<p><strong>Пример 3: сдача</strong>. Предположим, что в супермаркете мы купили товар стоимостью <span class="arithmatex">\(69\)</span> руб. и дали кассиру купюру в <span class="arithmatex">\(100\)</span> руб. Кассир должен вернуть нам <span class="arithmatex">\(31\)</span> руб. Обычно он рассуждает так, как показано на рисунке 1-3.</p>
|
||||
<ol>
|
||||
<li>Варианты выбора - это купюры номиналом меньше <span class="arithmatex">\(31\)</span> руб. Пусть у нас имеются номиналы <span class="arithmatex">\(1\)</span> , <span class="arithmatex">\(5\)</span> , <span class="arithmatex">\(10\)</span> и <span class="arithmatex">\(20\)</span> руб.</li>
|
||||
<li>Возьмем самую крупную доступную купюру в <span class="arithmatex">\(20\)</span> руб. Остаток сдачи составит <span class="arithmatex">\(31 - 20 = 11\)</span> руб.</li>
|
||||
|
||||
@@ -4360,7 +4360,7 @@
|
||||
<h3 id="1">1. Ключевые выводы<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<ul>
|
||||
<li>Алгоритмы повсеместно присутствуют в нашей повседневной жизни и не являются недосягаемыми сложными знаниями. На самом деле мы уже освоили множество алгоритмов, которые помогают решать различные жизненные задачи.</li>
|
||||
<li>Принцип поиска в словаре соответствует алгоритму двоичного поиска. Двоичный поиск иллюстрирует важную идею алгоритмов "разделяй и властвуй".</li>
|
||||
<li>Принцип поиска в словаре соответствует алгоритму двоичного поиска. Двоичный поиск иллюстрирует важную идею алгоритмов «разделяй и властвуй».</li>
|
||||
<li>Процесс сортировки карт в колоде очень похож на алгоритм сортировки вставками, который хорошо подходит для сортировки небольших наборов данных.</li>
|
||||
<li>Процесс размена по своей сути является жадным алгоритмом, в котором на каждом этапе принимается наилучшее на данный момент решение.</li>
|
||||
<li>Алгоритм представляет собой набор инструкций или шагов, предназначенных для решения конкретной задачи в ограниченное время, а структура данных - это способ организации и хранения данных в компьютере.</li>
|
||||
@@ -4369,13 +4369,13 @@
|
||||
</ul>
|
||||
<h3 id="2-q-a">2. Q & A<a class="headerlink" href="#2-q-a" title="Permanent link">¶</a></h3>
|
||||
<p><strong>Q</strong>: Я программист и в повседневной работе никогда не использовал алгоритмы для решения задач, поскольку часто используемые алгоритмы уже встроены в языки программирования и ими можно пользоваться напрямую. Значит ли это, что рабочие задачи еще не требуют применения алгоритмов?</p>
|
||||
<p>Если сравнить конкретные профессиональные навыки с приемами в боевых искусствах, то базовые дисциплины скорее напоминают "внутреннюю силу".</p>
|
||||
<p>Если сравнить конкретные профессиональные навыки с приемами в боевых искусствах, то базовые дисциплины скорее напоминают «внутреннюю силу».</p>
|
||||
<p>Я считаю, что изучение алгоритмов и других базовых дисциплин важно не для того, чтобы реализовывать их с нуля в работе, а для того, чтобы на основе полученных знаний принимать профессиональные решения и оценки при решении задач, тем самым повышая общее качество работы. Простой пример: каждый язык программирования имеет встроенные функции сортировки.</p>
|
||||
<ul>
|
||||
<li>Если бы мы не изучали структуры данных и алгоритмы, то, получив любые данные, возможно, просто передали бы их этой функции сортировки. Все работает гладко, производительность хорошая, и на первый взгляд проблем нет.</li>
|
||||
<li>Однако если мы изучили алгоритмы, то знаем, что временная сложность встроенной функции сортировки составляет <span class="arithmatex">\(O(n \log n)\)</span> ; если же данные представлены целыми числами фиксированной разрядности, например номерами студентов, то можно использовать более эффективный метод поразрядной сортировки, снизив временную сложность до <span class="arithmatex">\(O(nk)\)</span> , где <span class="arithmatex">\(k\)</span> - это количество разрядов, а при больших объемах данных выиграть во времени, затратах и пользовательском опыте.</li>
|
||||
<li>Однако если мы изучили алгоритмы, то знаем, что временная сложность встроенной функции сортировки составляет <span class="arithmatex">\(O(n \log n)\)</span>. Если же данные представлены целыми числами фиксированной разрядности, например номерами студентов, то можно использовать более эффективный метод поразрядной сортировки, снизив временную сложность до <span class="arithmatex">\(O(nk)\)</span> , где <span class="arithmatex">\(k\)</span> - это количество разрядов, а при больших объемах данных выиграть во времени, затратах и пользовательском опыте.</li>
|
||||
</ul>
|
||||
<p>В инженерной практике множество задач трудно решить оптимальным образом, и многие из них решаются "как-то". Сложность задачи зависит как от ее природы, так и от уровня знаний и опыта человека, который ее анализирует. Чем более полными знаниями и большим опытом обладает человек, тем глубже он может проанализировать проблему и тем изящнее может быть ее решение.</p>
|
||||
<p>В инженерной практике множество задач трудно решить оптимальным образом, и многие из них решаются «как-то». Сложность задачи зависит как от ее природы, так и от уровня знаний и опыта человека, который ее анализирует. Чем более полными знаниями и большим опытом обладает человек, тем глубже он может проанализировать проблему и тем изящнее может быть ее решение.</p>
|
||||
|
||||
<!-- Source file information -->
|
||||
|
||||
|
||||
@@ -4446,7 +4446,7 @@
|
||||
<p>Стоит отметить, что структуры данных и алгоритмы не зависят от языка программирования. Именно поэтому данная книга предлагает их реализации на различных языках.</p>
|
||||
<div class="admonition tip">
|
||||
<p class="admonition-title">Принятое сокращение</p>
|
||||
<p>В реальных обсуждениях выражение "структуры данных и алгоритмы" обычно сокращают до просто "алгоритмы". Например, хорошо известные задачи LeetCode на деле одновременно проверяют знания и по структурам данных, и по алгоритмам.</p>
|
||||
<p>В реальных обсуждениях выражение «структуры данных и алгоритмы» обычно сокращают до просто «алгоритмы». Например, хорошо известные задачи LeetCode на деле одновременно проверяют знания и по структурам данных, и по алгоритмам.</p>
|
||||
</div>
|
||||
|
||||
<!-- Source file information -->
|
||||
|
||||
Reference in New Issue
Block a user