This commit is contained in:
krahets
2026-03-30 08:17:41 +08:00
parent 68cafe99dd
commit 46bccf0065
484 changed files with 60193 additions and 20315 deletions
@@ -65,8 +65,8 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Noto Sans";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"PT Sans";--md-code-font:"JetBrains Mono"}</style>
@@ -574,7 +574,7 @@
<span class="md-ellipsis">
Глава 1. Знакомство с алгоритмами
Глава 1. Введение в алгоритмы
@@ -596,7 +596,7 @@
<span class="md-nav__icon md-icon"></span>
Глава 1. Знакомство с алгоритмами
Глава 1. Введение в алгоритмы
</label>
@@ -646,7 +646,7 @@
<span class="md-ellipsis">
1.2 Что такое структуры данных и алгоритмы
1.2 Что такое алгоритм
@@ -1253,7 +1253,7 @@
<span class="md-ellipsis">
Глава 4. Массив и связный список
Глава 4. Массивы и списки
@@ -1275,7 +1275,7 @@
<span class="md-nav__icon md-icon"></span>
Глава 4. Массив и связный список
Глава 4. Массивы и списки
</label>
@@ -1381,7 +1381,7 @@
<span class="md-ellipsis">
4.4 Память и кеш *
4.4 Оперативная память и кэш *
@@ -1663,7 +1663,7 @@
<span class="md-ellipsis">
Глава 6. Хеширование
Глава 6. Хеш-таблицы
@@ -1685,7 +1685,7 @@
<span class="md-nav__icon md-icon"></span>
Глава 6. Хеширование
Глава 6. Хеш-таблицы
</label>
@@ -1763,7 +1763,7 @@
<span class="md-ellipsis">
6.3 Хеш-алгоритмы
6.3 Алгоритмы хеширования
@@ -1858,7 +1858,7 @@
<span class="md-ellipsis">
Глава 7. Дерево
Глава 7. Деревья
@@ -1880,7 +1880,7 @@
<span class="md-nav__icon md-icon"></span>
Глава 7. Дерево
Глава 7. Деревья
</label>
@@ -1958,7 +1958,7 @@
<span class="md-ellipsis">
7.3 Представление дерева массивом
7.3 Представление двоичного дерева массивом
@@ -2042,7 +2042,7 @@
<span class="md-ellipsis">
7.6 Резюме
7.6 Краткие итоги
@@ -2205,7 +2205,7 @@
<span class="md-ellipsis">
8.3 Задача Top-K
8.3 Задача Top-k
@@ -2296,7 +2296,7 @@
<span class="md-ellipsis">
Глава 9. Граф
Глава 9. Графы
@@ -2318,7 +2318,7 @@
<span class="md-nav__icon md-icon"></span>
Глава 9. Граф
Глава 9. Графы
</label>
@@ -2368,7 +2368,7 @@
<span class="md-ellipsis">
9.2 Базовые операции над графами
9.2 Базовые операции графа
@@ -2424,7 +2424,7 @@
<span class="md-ellipsis">
9.4 Резюме
9.4 Краткие итоги
@@ -2563,7 +2563,7 @@
<span class="md-ellipsis">
10.2 Точка вставки двоичного поиска
10.2 Двоичный поиск точки вставки
@@ -2591,7 +2591,7 @@
<span class="md-ellipsis">
10.3 Граничные случаи двоичного поиска
10.3 Двоичный поиск границ
@@ -2619,7 +2619,7 @@
<span class="md-ellipsis">
10.4 Стратегия оптимизации через хеширование
10.4 Стратегии оптимизации хеширования
@@ -2647,7 +2647,7 @@
<span class="md-ellipsis">
10.5 Алгоритмы поиска: новый взгляд
10.5 Переосмысление алгоритмов поиска
@@ -2852,7 +2852,7 @@
<span class="md-ellipsis">
11.3 Пузырьковая сортировка
11.3 Сортировка пузырьком
@@ -2880,7 +2880,7 @@
<span class="md-ellipsis">
11.4 Сортировка вставкой
11.4 Сортировка вставками
@@ -3185,7 +3185,7 @@
<span class="md-ellipsis">
12.1 Алгоритмы разделяй и властвуй
12.1 Стратегия разделяй и властвуй
@@ -3213,7 +3213,7 @@
<span class="md-ellipsis">
12.2 Стратегия поиска разделяй и властвуй
12.2 Поисковая стратегия разделяй и властвуй
@@ -3490,7 +3490,7 @@
<span class="md-ellipsis">
13.4 Задача о $n$ ферзях
13.4 Задача о n ферзях
@@ -3631,7 +3631,7 @@
<span class="md-ellipsis">
14.1 Введение в динамическое программирование
14.1 Первое знакомство с динамическим программированием
@@ -3743,7 +3743,7 @@
<span class="md-ellipsis">
14.5 Задача о неограниченном рюкзаке
14.5 Задача о полном рюкзаке
@@ -4355,25 +4355,25 @@
<!-- Page content -->
<h1 id="31">3.1 &nbsp; Классификация структур данных<a class="headerlink" href="#31" title="Permanent link">&para;</a></h1>
<p>К распространенным структурам данных относятся массивы, связные списки, стеки, очереди, хеш-таблицы, деревья, кучи и графы; их можно классифицировать по двум измерениям: "логическая структура" и "физическая структура".</p>
<p>К распространенным структурам данных относятся массивы, связные списки, стеки, очереди, хеш-таблицы, деревья, кучи и графы. Их можно классифицировать по двум измерениям: логической структуре и физической структуре.</p>
<h2 id="311">3.1.1 &nbsp; Логическая структура: линейная и нелинейная<a class="headerlink" href="#311" title="Permanent link">&para;</a></h2>
<p><strong>Логическая структура раскрывает логические связи между элементами данных</strong>. В массивах и связных списках данные располагаются в определенном порядке, отражая линейные отношения между элементами; в деревьях данные иерархически располагаются сверху вниз, проявляя производные отношения между "предками" и "потомками"; графы состоят из вершин и ребер и отражают сложные сетевые связи.</p>
<p>Как показано на рисунке 3-1, логические структуры можно разделить на два больших класса: "линейные" и "нелинейные". Линейные структуры более интуитивны и означают, что данные логически выстроены в линию; нелинейные структуры, напротив, располагаются нелинейно.</p>
<p><strong>Логическая структура раскрывает логические отношения между элементами данных</strong>. В массивах и связных списках данные расположены в определенном порядке, что отражает линейные отношения между элементами. В деревьях данные расположены по уровням сверху вниз, что демонстрирует отношения "предок" и "потомок". Графы состоят из вершин и ребер, отражая сложные сетевые отношения.</p>
<p>Как показано на рисунке 3-1, логические структуры делятся на две большие категории: линейные и нелинейные. Линейные структуры более интуитивны, поскольку в них данные расположены линейно и логически связаны. Нелинейные структуры, напротив, представляют собой нелинейное расположение элементов данных.</p>
<ul>
<li><strong>Линейные структуры данных</strong>: массивы, связные списки, стеки, очереди, хеш-таблицы; между элементами существует отношение "один к одному".</li>
<li><strong>Линейные структуры данных</strong>: массивы, связные списки, стеки, очереди, хеш-таблицы, в которых элементы связаны отношением "один к одному".</li>
<li><strong>Нелинейные структуры данных</strong>: деревья, кучи, графы, хеш-таблицы.</li>
</ul>
<p>Нелинейные структуры данных можно дополнительно разделить на древовидные и сетевые.</p>
<ul>
<li><strong>Древовидные структуры</strong>: деревья, кучи, хеш-таблицы; между элементами существует отношение "один ко многим".</li>
<li><strong>Сетевые структуры</strong>: графы; между элементами существует отношение "многие ко многим".</li>
<li><strong>Древовидные структуры</strong>: деревья, кучи, хеш-таблицы, в которых элементы связаны отношением "один ко многим".</li>
<li><strong>Сетевые структуры</strong>: графы, в которых элементы связаны отношением "многие ко многим".</li>
</ul>
<p><img alt="Линейные и нелинейные структуры данных" class="animation-figure" src="../classification_of_data_structure.assets/classification_logic_structure.png" /></p>
<p align="center"> Рисунок 3-1 &nbsp; Линейные и нелинейные структуры данных </p>
<h2 id="312">3.1.2 &nbsp; Физическая структура: непрерывная и разрозненная<a class="headerlink" href="#312" title="Permanent link">&para;</a></h2>
<p><strong>Во время выполнения алгоритма обрабатываемые данные в основном хранятся в памяти</strong>. На рисунке 3-2 показана планка памяти компьютера, где каждый черный блок содержит некоторый участок памяти. Мы можем представить память как огромную таблицу Excel, в которой каждая ячейка способна хранить данные определенного размера.</p>
<p><strong>Система обращается к данным по адресу памяти соответствующей позиции</strong>. Как показано на рисунке 3-2, компьютер по определенному правилу присваивает каждой ячейке в этой таблице номер, чтобы у каждого участка памяти был уникальный адрес. Имея эти адреса, программа может получать доступ к данным, находящимся в памяти.</p>
<p><strong>Во время выполнения программы обрабатываемые данные в основном хранятся в памяти</strong>. На рисунке 3-2 показан модуль оперативной памяти компьютера, где каждый черный блок содержит определенный участок памяти. Память можно представить как огромную таблицу Excel, в которой каждая ячейка способна хранить данные определенного размера.</p>
<p><strong>Система обращается к данным по адресам памяти соответствующих позиций</strong>. Как показано на рисунке 3-2, компьютер по определенным правилам присваивает каждой ячейке в этой таблице номер, чтобы каждый участок памяти имел уникальный адрес. Благодаря этим адресам программа получает доступ к данным, находящимся в памяти.</p>
<p><img alt="Планка памяти, участок памяти и адрес памяти" class="animation-figure" src="../classification_of_data_structure.assets/computer_memory_location.png" /></p>
<p align="center"> Рисунок 3-2 &nbsp; Планка памяти, участок памяти и адрес памяти </p>
@@ -4381,17 +4381,17 @@
<p class="admonition-title">Tip</p>
<p>Стоит отметить, что сравнение памяти с таблицей Excel - это упрощенная аналогия; реальный механизм работы памяти гораздо сложнее и включает такие понятия, как адресное пространство, управление памятью, кэш-механизмы, виртуальная и физическая память.</p>
</div>
<p>Память - общий ресурс для всех программ. Когда некоторый участок памяти занят одной программой, другие программы обычно не могут использовать его одновременно. <strong>Поэтому при проектировании структур данных и алгоритмов память является важным фактором</strong>. Например, пиковое потребление памяти алгоритмом не должно превышать доступную свободную память системы; если непрерывного крупного блока памяти недостаточно, выбранная структура данных должна уметь храниться в разрозненных областях памяти.</p>
<p>Как показано на рисунке 3-3, <strong>физическая структура отражает способ хранения данных в памяти компьютера</strong>; ее можно разделить на хранение в непрерывном пространстве (массивы) и хранение в разрозненном пространстве (связные списки). Физическая структура на нижнем уровне определяет способы доступа к данным, их обновления, вставки и удаления; эти два типа физических структур взаимно дополняют друг друга по временной и пространственной эффективности.</p>
<p>Память - общий ресурс для всех программ. Когда некоторый участок памяти занят одной программой, другие программы обычно не могут использовать его одновременно. <strong>Поэтому при проектировании структур данных и алгоритмов память занимает важное место</strong>. Например, пиковое потребление памяти алгоритмом не должно превышать объем доступной свободной памяти системы; если не хватает непрерывных крупных участков памяти, выбранная структура данных должна уметь размещаться в разрозненных областях памяти.</p>
<p>Как показано на рисунке 3-3, <strong>физическая структура отражает способ хранения данных в памяти компьютера</strong>. Ее можно разделить на хранение в непрерывном пространстве (массивы) и хранение в разрозненном пространстве (связные списки). Физическая структура на низком уровне определяет способы доступа к данным, их обновления, вставки и удаления. Эти два типа физических структур взаимно дополняют друг друга по временной и пространственной эффективности.</p>
<p><img alt="Хранение в непрерывном и разрозненном пространстве" class="animation-figure" src="../classification_of_data_structure.assets/classification_phisical_structure.png" /></p>
<p align="center"> Рисунок 3-3 &nbsp; Хранение в непрерывном и разрозненном пространстве </p>
<p>Стоит отметить, что <strong>все структуры данных реализуются на основе массивов, связных списков или их комбинации</strong>. Например, стеки и очереди можно реализовать как с помощью массивов, так и с помощью связных списков; а реализация хеш-таблицы может одновременно содержать массивы и связные списки.</p>
<p>Стоит отметить, что <strong>все структуры данных реализуются на основе массивов, связных списков или их комбинации</strong>. Например, стек и очередь можно реализовать как с помощью массивов, так и с помощью связных списков; реализация хеш-таблицы также может одновременно включать массивы и связные списки.</p>
<ul>
<li><strong>Можно реализовать на основе массивов</strong>: стеки, очереди, хеш-таблицы, деревья, кучи, графы, матрицы, тензоры (массивы размерности <span class="arithmatex">\(\geq 3\)</span> ) и т.д.</li>
<li><strong>Можно реализовать на основе связных списков</strong>: стеки, очереди, хеш-таблицы, деревья, кучи, графы и т.д.</li>
</ul>
<p>После инициализации длину связного списка все еще можно изменять во время выполнения программы, поэтому его также называют "динамической структурой данных". Длина массива после инициализации неизменна, поэтому его также называют "статической структурой данных". Стоит заметить, что массив может менять длину за счет повторного выделения памяти, тем самым приобретая определенную "динамичность".</p>
<p>После инициализации длину связного списка все еще можно изменять во время выполнения программы, поэтому его также называют "динамической структурой данных". Длина массива после инициализации неизменна, поэтому его также называют "статической структурой данных". Стоит отметить, что массив может изменять длину за счет повторного выделения памяти, тем самым приобретая определенную "динамичность".</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Если тебе пока трудно понять физическую структуру, рекомендуется сначала прочитать следующую главу, а затем вернуться к этому разделу.</p>