mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-17 14:10:57 +00:00
deploy
This commit is contained in:
@@ -4396,7 +4396,7 @@
|
||||
<p align="center"> Рисунок 15-4 Ценность предмета на единицу веса </p>
|
||||
|
||||
<h3 id="1">1. Определение жадной стратегии<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p>Максимизация общей ценности предметов в рюкзаке <strong>по сути равносильна максимизации ценности на единицу веса</strong>. Отсюда естественно выводится следующая жадная стратегия.</p>
|
||||
<p>Максимизация общей ценности предметов в рюкзаке <strong>по сути равносильна максимизации ценности на единицу веса</strong>. Отсюда естественно выводится жадная стратегия, показанная на рисунке 15-5.</p>
|
||||
<ol>
|
||||
<li>Отсортировать предметы по убыванию удельной ценности.</li>
|
||||
<li>Перебирать все предметы и <strong>на каждом шаге жадно выбирать предмет с наибольшей удельной ценностью</strong>.</li>
|
||||
|
||||
@@ -4708,7 +4708,7 @@
|
||||
<p>У вас может невольно вырваться: «Эврика!» Жадный алгоритм решает задачу размена монет всего примерно десятью строками кода.</p>
|
||||
<h2 id="1511">15.1.1 Преимущества и ограничения жадного алгоритма<a class="headerlink" href="#1511" title="Permanent link">¶</a></h2>
|
||||
<p><strong>Жадный алгоритм не только прост в реализации, но и обычно очень эффективен</strong>. В приведенном выше коде обозначим минимальный номинал монеты через <span class="arithmatex">\(\min(coins)\)</span>, тогда жадный выбор выполняется не более чем <span class="arithmatex">\(amt / \min(coins)\)</span> раз, а временная сложность равна <span class="arithmatex">\(O(amt / \min(coins))\)</span>. Это на порядок меньше, чем временная сложность решения через динамическое программирование <span class="arithmatex">\(O(n \times amt)\)</span>.</p>
|
||||
<p>Однако <strong>для некоторых наборов номиналов монет жадный алгоритм не может найти оптимальный ответ</strong>. Ниже показаны два примера.</p>
|
||||
<p>Однако <strong>для некоторых наборов номиналов монет жадный алгоритм не может найти оптимальный ответ</strong>. На рисунке 15-2 показаны два примера.</p>
|
||||
<ul>
|
||||
<li><strong>Положительный пример <span class="arithmatex">\(coins = [1, 5, 10, 20, 50, 100]\)</span></strong>: для такого набора монет при любом <span class="arithmatex">\(amt\)</span> жадный алгоритм находит оптимальное решение.</li>
|
||||
<li><strong>Отрицательный пример <span class="arithmatex">\(coins = [1, 20, 50]\)</span></strong>: пусть <span class="arithmatex">\(amt = 60\)</span>. Жадный алгоритм найдет только комбинацию <span class="arithmatex">\(50 + 1 \times 10\)</span>, то есть всего <span class="arithmatex">\(11\)</span> монет, тогда как динамическое программирование находит оптимум <span class="arithmatex">\(20 + 20 + 20\)</span>, где требуется лишь <span class="arithmatex">\(3\)</span> монеты.</li>
|
||||
|
||||
@@ -4409,7 +4409,7 @@ cap[i, j] = \min(ht[i], ht[j]) \times (j - i)
|
||||
<p align="center"> Рисунок 15-10 Состояние после перемещения короткой перегородки внутрь </p>
|
||||
|
||||
<p>Отсюда и выводится жадная стратегия для этой задачи: инициализировать два указателя по краям контейнера и на каждом шаге сдвигать внутрь указатель, соответствующий короткой перегородке, пока указатели не встретятся.</p>
|
||||
<p>На рисунках ниже показан процесс выполнения этой жадной стратегии.</p>
|
||||
<p>На рисунке 15-11 показан процесс выполнения этой жадной стратегии.</p>
|
||||
<ol>
|
||||
<li>В начальном состоянии указатели <span class="arithmatex">\(i\)</span> и <span class="arithmatex">\(j\)</span> стоят на двух концах массива.</li>
|
||||
<li>Вычислить вместимость текущего состояния <span class="arithmatex">\(cap[i, j]\)</span> и обновить максимальную вместимость.</li>
|
||||
|
||||
Reference in New Issue
Block a user