0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Изучаем структуры данных: что это?</a></li>
1
<ul><li><a>Изучаем структуры данных: что это?</a></li>
2
<li><a>Изучаем структуры данных: зачем вообще они нужны?</a></li>
2
<li><a>Изучаем структуры данных: зачем вообще они нужны?</a></li>
3
<li><a>Изучаем структуры данных: топ-8</a></li>
3
<li><a>Изучаем структуры данных: топ-8</a></li>
4
<li><a>Массивы</a></li>
4
<li><a>Массивы</a></li>
5
<li><a>Стеки</a></li>
5
<li><a>Стеки</a></li>
6
<li><a>Очереди</a></li>
6
<li><a>Очереди</a></li>
7
<li><a>Связный список</a></li>
7
<li><a>Связный список</a></li>
8
<li><a>Графы</a></li>
8
<li><a>Графы</a></li>
9
<li><a>Деревья</a></li>
9
<li><a>Деревья</a></li>
10
<li><a>Бор</a></li>
10
<li><a>Бор</a></li>
11
<li><a>Хэш-таблица</a></li>
11
<li><a>Хэш-таблица</a></li>
12
</ul><p>В далеком 1976 году швейцарским ученым была написана книга "<em>Алгоритмы + Структуры данных = Программы</em>". Прошло уже более сорока лет, но это утверждение до сих пор актуально. Вы должны знать структуры данных, если учите языки программирования и желаете стать разработчиком. И не только знать, но и уметь их применять. Причем не столь важно, закончили ли вы институт либо просто освоили курсы программирования, - на собеседовании при устройстве на работу у вас в 90 % случаев спросят про структуры данных.</p>
12
</ul><p>В далеком 1976 году швейцарским ученым была написана книга "<em>Алгоритмы + Структуры данных = Программы</em>". Прошло уже более сорока лет, но это утверждение до сих пор актуально. Вы должны знать структуры данных, если учите языки программирования и желаете стать разработчиком. И не только знать, но и уметь их применять. Причем не столь важно, закончили ли вы институт либо просто освоили курсы программирования, - на собеседовании при устройстве на работу у вас в 90 % случаев спросят про структуры данных.</p>
13
<p>Этот материал - адаптированный перевод статьи "<a>The top data structures you should know for your next coding interview</a>". В этом переводе будут вкратце рассмотрены основные структуры данных, которые могут понадобиться при программировании, плюс будут перечислены наиболее популярные вопросы, которые часто задают на собеседованиях.</p>
13
<p>Этот материал - адаптированный перевод статьи "<a>The top data structures you should know for your next coding interview</a>". В этом переводе будут вкратце рассмотрены основные структуры данных, которые могут понадобиться при программировании, плюс будут перечислены наиболее популярные вопросы, которые часто задают на собеседованиях.</p>
14
<h2>Изучаем структуры данных: что это?</h2>
14
<h2>Изучаем структуры данных: что это?</h2>
15
<p>Если говорить простым языком, то структура данных представляет собой контейнер, в котором информация скомпонована специальным образом. Чего удается достичь благодаря такому строению? Для сравнения, скажем, что при выполнении одних операций определенная структура данных будет весьма эффективна, в то время как при выполнении других - не очень. Задача разработчика вне зависимости от языка программирования (language of programming) как раз в том и состоит, чтобы уметь выбирать наиболее подходящую структуру и знать, как сравнить их между собой с учетом поставленной задачи. Но это невозможно без ясного и единого представления о существующих способах организации информации. Именно это единое представление вы и получите в процессе изучения материалов этой статьи. И займет это совсем немного времени.</p>
15
<p>Если говорить простым языком, то структура данных представляет собой контейнер, в котором информация скомпонована специальным образом. Чего удается достичь благодаря такому строению? Для сравнения, скажем, что при выполнении одних операций определенная структура данных будет весьма эффективна, в то время как при выполнении других - не очень. Задача разработчика вне зависимости от языка программирования (language of programming) как раз в том и состоит, чтобы уметь выбирать наиболее подходящую структуру и знать, как сравнить их между собой с учетом поставленной задачи. Но это невозможно без ясного и единого представления о существующих способах организации информации. Именно это единое представление вы и получите в процессе изучения материалов этой статьи. И займет это совсем немного времени.</p>
16
<h2>Изучаем структуры данных: зачем вообще они нужны?</h2>
16
<h2>Изучаем структуры данных: зачем вообще они нужны?</h2>
17
<p>Структура позволяет хранить информацию в упорядоченном виде, а информация - это основополагающий термин информатики, что понятно даже, исходя из словообразования. И не так уж важно, какую конкретно задачу решает программист: таки или иначе он все равно будет иметь дело с обработкой данных, причем хранить их надо будет то в одном формате, то в другом.</p>
17
<p>Структура позволяет хранить информацию в упорядоченном виде, а информация - это основополагающий термин информатики, что понятно даже, исходя из словообразования. И не так уж важно, какую конкретно задачу решает программист: таки или иначе он все равно будет иметь дело с обработкой данных, причем хранить их надо будет то в одном формате, то в другом.</p>
18
<p>Ниже перечислены самые распространенные способы структурирования данных:</p>
18
<p>Ниже перечислены самые распространенные способы структурирования данных:</p>
19
<ol><li>Массивы.</li>
19
<ol><li>Массивы.</li>
20
<li>Очереди.</li>
20
<li>Очереди.</li>
21
<li>Стеки.</li>
21
<li>Стеки.</li>
22
<li>Деревья.</li>
22
<li>Деревья.</li>
23
<li>Связные списки.</li>
23
<li>Связные списки.</li>
24
<li>Графы.</li>
24
<li>Графы.</li>
25
<li>Боры.</li>
25
<li>Боры.</li>
26
<li>Хэш-таблицы.</li>
26
<li>Хэш-таблицы.</li>
27
</ol><h2>Массивы</h2>
27
</ol><h2>Массивы</h2>
28
<p>Самый распространенный способ структуризации. Ниже показан простейший массив из 4-х элементов:</p>
28
<p>Самый распространенный способ структуризации. Ниже показан простейший массив из 4-х элементов:</p>
29
<p>Каждый элемент имеет числовое значение (индекс), которое соответствует положению элемента в массиве. Обычно в языках программирования нумерация начинается не с единицы, а с нуля.</p>
29
<p>Каждый элемент имеет числовое значение (индекс), которое соответствует положению элемента в массиве. Обычно в языках программирования нумерация начинается не с единицы, а с нуля.</p>
30
<p><strong>Массивы бывают:</strong></p>
30
<p><strong>Массивы бывают:</strong></p>
31
<p>- одномерные (как на картинке);</p>
31
<p>- одномерные (как на картинке);</p>
32
<p>- многомерные.</p>
32
<p>- многомерные.</p>
33
<p><strong>Простейшие операции:</strong></p>
33
<p><strong>Простейшие операции:</strong></p>
34
<ul><li>Insert - вставка элемента на позицию с заданным индексом;</li>
34
<ul><li>Insert - вставка элемента на позицию с заданным индексом;</li>
35
<li>Get - возвращение элемента, занимающего позицию с заданным индексом;</li>
35
<li>Get - возвращение элемента, занимающего позицию с заданным индексом;</li>
36
<li>Delete - удаление;</li>
36
<li>Delete - удаление;</li>
37
<li>Size - получение общего числа элементов.</li>
37
<li>Size - получение общего числа элементов.</li>
38
</ul><p><strong>Какие вопросы, связанные с массивам, часто задают на собеседовании:</strong></p>
38
</ul><p><strong>Какие вопросы, связанные с массивам, часто задают на собеседовании:</strong></p>
39
<ul><li>найдите 2-й минимальный элемент;</li>
39
<ul><li>найдите 2-й минимальный элемент;</li>
40
<li>найдите неповторяющиеся целые числа;</li>
40
<li>найдите неповторяющиеся целые числа;</li>
41
<li>выполните объединение двух отсортированных массивов;</li>
41
<li>выполните объединение двух отсортированных массивов;</li>
42
<li>выполните упорядочение положительных и отрицательных значений.</li>
42
<li>выполните упорядочение положительных и отрицательных значений.</li>
43
</ul><h2>Стеки</h2>
43
</ul><h2>Стеки</h2>
44
<p>Стек обычно сравнивают со стопкой книг. Когда нужно взять какую-либо книгу, к примеру, лежащую в центре стопки, вам надо сначала снять те книги, которые лежат выше. Это известный принцип LIFO (кто последний пришел, тот первый выйдет).</p>
44
<p>Стек обычно сравнивают со стопкой книг. Когда нужно взять какую-либо книгу, к примеру, лежащую в центре стопки, вам надо сначала снять те книги, которые лежат выше. Это известный принцип LIFO (кто последний пришел, тот первый выйдет).</p>
45
<p>На картинке ниже - стек, который содержит 3 элемента:</p>
45
<p>На картинке ниже - стек, который содержит 3 элемента:</p>
46
<p><strong>Простейшие операции:</strong></p>
46
<p><strong>Простейшие операции:</strong></p>
47
<ul><li>Push - вставка элемента в стек сверху;</li>
47
<ul><li>Push - вставка элемента в стек сверху;</li>
48
<li>Pop - возвращение верхнего компонента в стек после удаления;</li>
48
<li>Pop - возвращение верхнего компонента в стек после удаления;</li>
49
<li>isEmpty - возвращение true, когда стек пуст;</li>
49
<li>isEmpty - возвращение true, когда стек пуст;</li>
50
<li>Top - возвращение верхнего компонента без удаления его из стека.</li>
50
<li>Top - возвращение верхнего компонента без удаления его из стека.</li>
51
</ul><p><strong>Вопросы о стеке:</strong></p>
51
</ul><p><strong>Вопросы о стеке:</strong></p>
52
<ul><li>вычислите постфиксное выражение посредством стека;</li>
52
<ul><li>вычислите постфиксное выражение посредством стека;</li>
53
<li>отсортируйте значения;</li>
53
<li>отсортируйте значения;</li>
54
<li>проверьте сбалансированные скобки в выражении.</li>
54
<li>проверьте сбалансированные скобки в выражении.</li>
55
</ul><h2>Очереди</h2>
55
</ul><h2>Очереди</h2>
56
<p>Очередь представляет собой линейную структура данных, где элементы хранятся последовательно. Однако при сравнении со стеком мы увидим, что здесь действует уже принцип FIFO (первый пришел - первый вышел). Классический пример - очередь покупателей в гипермаркете.</p>
56
<p>Очередь представляет собой линейную структура данных, где элементы хранятся последовательно. Однако при сравнении со стеком мы увидим, что здесь действует уже принцип FIFO (первый пришел - первый вышел). Классический пример - очередь покупателей в гипермаркете.</p>
57
<p>Изображение очереди:</p>
57
<p>Изображение очереди:</p>
58
<p><strong>Операции</strong>:</p>
58
<p><strong>Операции</strong>:</p>
59
<ul><li>Enqueue() - добавление элемента в конец очереди;</li>
59
<ul><li>Enqueue() - добавление элемента в конец очереди;</li>
60
<li>Dequeue() - удаление элемента из начала;</li>
60
<li>Dequeue() - удаление элемента из начала;</li>
61
<li>isEmpty() - возвращение true, если очередь пуста;</li>
61
<li>isEmpty() - возвращение true, если очередь пуста;</li>
62
<li>Top() - возвращение первого элемента.</li>
62
<li>Top() - возвращение первого элемента.</li>
63
</ul><p><strong>Вопросы</strong>:</p>
63
</ul><p><strong>Вопросы</strong>:</p>
64
<ul><li>реализовать стек посредством очереди;</li>
64
<ul><li>реализовать стек посредством очереди;</li>
65
<li>обратить первые k-элементы в очереди;</li>
65
<li>обратить первые k-элементы в очереди;</li>
66
<li>сгенерировать двоичные числа от 1 до n, используя очередь.</li>
66
<li>сгенерировать двоичные числа от 1 до n, используя очередь.</li>
67
</ul><h2>Связный список</h2>
67
</ul><h2>Связный список</h2>
68
<p>Эта структура напоминает массив, но если выполнить сравнение, становится понятно, что связный список отличается по ряду характеристик:</p>
68
<p>Эта структура напоминает массив, но если выполнить сравнение, становится понятно, что связный список отличается по ряду характеристик:</p>
69
<p>- выделение памяти;</p>
69
<p>- выделение памяти;</p>
70
<p>- внутренняя структура;</p>
70
<p>- внутренняя структура;</p>
71
<p>- особенности вставки и удаления.</p>
71
<p>- особенности вставки и удаления.</p>
72
<p>Связный список можно назвать цепочкой узлов, причем каждый из них содержит информацию: к примеру, данные и указатель на последующий узел в цепочке. Существует головной указатель, который соответствует первому элементу в списке, а если список пуст, то указатель направлен на null.</p>
72
<p>Связный список можно назвать цепочкой узлов, причем каждый из них содержит информацию: к примеру, данные и указатель на последующий узел в цепочке. Существует головной указатель, который соответствует первому элементу в списке, а если список пуст, то указатель направлен на null.</p>
73
<p>Применение - реализация файловых систем, хэш-таблицы, списки смежности.</p>
73
<p>Применение - реализация файловых систем, хэш-таблицы, списки смежности.</p>
74
<p><strong>Типы</strong>:</p>
74
<p><strong>Типы</strong>:</p>
75
<ul><li>односвязный (однонаправленный);</li>
75
<ul><li>односвязный (однонаправленный);</li>
76
<li>двусвязный (двунаправленный).</li>
76
<li>двусвязный (двунаправленный).</li>
77
</ul><p><strong>Простейшие действия:</strong></p>
77
</ul><p><strong>Простейшие действия:</strong></p>
78
<ul><li><em>InsertAtEnd</em> - вставка заданного элемента в конец;</li>
78
<ul><li><em>InsertAtEnd</em> - вставка заданного элемента в конец;</li>
79
<li><em>InsertAtHead</em> - вставка в начало (с головы);</li>
79
<li><em>InsertAtHead</em> - вставка в начало (с головы);</li>
80
<li><em>Delete</em> - удаление из списка;</li>
80
<li><em>Delete</em> - удаление из списка;</li>
81
<li><em>DeleteAtHead</em> - удаление первого компонента;</li>
81
<li><em>DeleteAtHead</em> - удаление первого компонента;</li>
82
<li><em>Search</em> - возвращение заданного компонента из списка;</li>
82
<li><em>Search</em> - возвращение заданного компонента из списка;</li>
83
<li><em>isEmpty</em> - возвращение true, если имеющийся список пуст.</li>
83
<li><em>isEmpty</em> - возвращение true, если имеющийся список пуст.</li>
84
</ul><p><strong>Вопросы</strong>:</p>
84
</ul><p><strong>Вопросы</strong>:</p>
85
<ul><li>обратить связный список;</li>
85
<ul><li>обратить связный список;</li>
86
<li>найти петлю;</li>
86
<li>найти петлю;</li>
87
<li>вернуть N-ный узел с начала списка;</li>
87
<li>вернуть N-ный узел с начала списка;</li>
88
<li>удалить дублирующиеся значения.</li>
88
<li>удалить дублирующиеся значения.</li>
89
</ul><h2>Графы</h2>
89
</ul><h2>Графы</h2>
90
<p>Графом называют множество узлов, которые соединены друг с другом, образуя сеть. Узлы = вершины. Пара (x, y) - это ребро, которое может иметь стоимость или вес, что характеризует, насколько затратным является переход от одной вершины к другой.</p>
90
<p>Графом называют множество узлов, которые соединены друг с другом, образуя сеть. Узлы = вершины. Пара (x, y) - это ребро, которое может иметь стоимость или вес, что характеризует, насколько затратным является переход от одной вершины к другой.</p>
91
<p><strong>Типы</strong>:</p>
91
<p><strong>Типы</strong>:</p>
92
<ul><li>неориентированные;</li>
92
<ul><li>неориентированные;</li>
93
<li>ориентированные.</li>
93
<li>ориентированные.</li>
94
</ul><p>В языке программирования популярны графы 2-х типов:</p>
94
</ul><p>В языке программирования популярны графы 2-х типов:</p>
95
<ul><li>матрица смежности;</li>
95
<ul><li>матрица смежности;</li>
96
<li>список смежности.</li>
96
<li>список смежности.</li>
97
</ul><p>Также надо знать самые популярные алгоритмы обхода графа:</p>
97
</ul><p>Также надо знать самые популярные алгоритмы обхода графа:</p>
98
<ul><li>поиск в ширину;</li>
98
<ul><li>поиск в ширину;</li>
99
<li>поиск в глубину.</li>
99
<li>поиск в глубину.</li>
100
</ul><p><strong>Вопросы к собеседованию, которые желательно проработать:</strong></p>
100
</ul><p><strong>Вопросы к собеседованию, которые желательно проработать:</strong></p>
101
<ul><li>реализация поиска в ширину и глубину;</li>
101
<ul><li>реализация поиска в ширину и глубину;</li>
102
<li>проверка, является ли граф деревом;</li>
102
<li>проверка, является ли граф деревом;</li>
103
<li>подсчет числа ребер;</li>
103
<li>подсчет числа ребер;</li>
104
<li>поиск кратчайшего пути между 2-мя вершинами.</li>
104
<li>поиск кратчайшего пути между 2-мя вершинами.</li>
105
</ul><h2>Деревья</h2>
105
</ul><h2>Деревья</h2>
106
<p>Деревья - иерархическая структура, которые состоят из вершин и ребер, соединяющих эти вершины. Мы можем сказать, что деревья подобны графам, но тут существует различие: у первых не бывает циклов.</p>
106
<p>Деревья - иерархическая структура, которые состоят из вершин и ребер, соединяющих эти вершины. Мы можем сказать, что деревья подобны графам, но тут существует различие: у первых не бывает циклов.</p>
107
<p>Сегодня деревья применяются в сфере ИИ, а также в сложных алгоритмах, где они выступают в роли эффективного хранилища данных. С деревом знаком, по сути, любой программист.</p>
107
<p>Сегодня деревья применяются в сфере ИИ, а также в сложных алгоритмах, где они выступают в роли эффективного хранилища данных. С деревом знаком, по сути, любой программист.</p>
108
<p>Ниже - рисунок простого дерева:</p>
108
<p>Ниже - рисунок простого дерева:</p>
109
<p><strong>Деревья бывают разных типов:</strong></p>
109
<p><strong>Деревья бывают разных типов:</strong></p>
110
<ul><li>N-арное;</li>
110
<ul><li>N-арное;</li>
111
<li>сбалансированное;</li>
111
<li>сбалансированное;</li>
112
<li>двоичное;</li>
112
<li>двоичное;</li>
113
<li>двоичное дерево поиска;</li>
113
<li>двоичное дерево поиска;</li>
114
<li>АВЛ-дерево;</li>
114
<li>АВЛ-дерево;</li>
115
<li>красно-черное дерево;</li>
115
<li>красно-черное дерево;</li>
116
<li>2-3 дерево.</li>
116
<li>2-3 дерево.</li>
117
</ul><p>Сегодня широко используют двоичные деревья.</p>
117
</ul><p>Сегодня широко используют двоичные деревья.</p>
118
<p><strong>На собеседовании у вас могут попросить найти:</strong></p>
118
<p><strong>На собеседовании у вас могут попросить найти:</strong></p>
119
<ul><li>высоту двоичного дерева;</li>
119
<ul><li>высоту двоичного дерева;</li>
120
<li>k-ное максимальное значение в 2-чном древе поиска;</li>
120
<li>k-ное максимальное значение в 2-чном древе поиска;</li>
121
<li>узлы, которые расположены на расстоянии “k” от корня;</li>
121
<li>узлы, которые расположены на расстоянии “k” от корня;</li>
122
<li>предки заданной вершины в 2-чном дереве.</li>
122
<li>предки заданной вершины в 2-чном дереве.</li>
123
</ul><h2>Бор</h2>
123
</ul><h2>Бор</h2>
124
<p>Второе название - "префиксное дерево". Речь идет о древовидной структуре, которая весьма эффективна в процессе решении задач на строки. Бор обеспечивает быстрое извлечение информации и часто используется при поиске слов в словаре, автоматических завершений в поисковике, а также в IP-маршрутизации.</p>
124
<p>Второе название - "префиксное дерево". Речь идет о древовидной структуре, которая весьма эффективна в процессе решении задач на строки. Бор обеспечивает быстрое извлечение информации и часто используется при поиске слов в словаре, автоматических завершений в поисковике, а также в IP-маршрутизации.</p>
125
<p>Давайте посмотрим, как 3 слова "top", "thus" и "their" хранятся в бору:</p>
125
<p>Давайте посмотрим, как 3 слова "top", "thus" и "their" хранятся в бору:</p>
126
<p><strong>Вопросы</strong>:</p>
126
<p><strong>Вопросы</strong>:</p>
127
<ul><li>подсчет общего числа слов, которые сохранены в бору;</li>
127
<ul><li>подсчет общего числа слов, которые сохранены в бору;</li>
128
<li>вывод на экран всех слов, сохраненных в бору;</li>
128
<li>вывод на экран всех слов, сохраненных в бору;</li>
129
<li>сортировка элементов массива посредством бора;</li>
129
<li>сортировка элементов массива посредством бора;</li>
130
<li>построение слова из словаря;</li>
130
<li>построение слова из словаря;</li>
131
<li>создание словаря T9.</li>
131
<li>создание словаря T9.</li>
132
</ul><h2>Хэш-таблица</h2>
132
</ul><h2>Хэш-таблица</h2>
133
<p>Хэширование используется в целях уникальной идентификации и сохранения объектов по вычисленному индексу, который называют "ключом". В результате объект хранится в формате "ключ-значение", а коллекция этих объектов представляет собой "словарь". Поиск объекта осуществляется по его ключу. Есть разные структуры данных, которые построены по принципам хэширования, к примеру, широко известна <strong>хэш-таблица</strong>(обычно ее реализуют посредством массивов).От чего зависит производительность хэширующей структуры:</p>
133
<p>Хэширование используется в целях уникальной идентификации и сохранения объектов по вычисленному индексу, который называют "ключом". В результате объект хранится в формате "ключ-значение", а коллекция этих объектов представляет собой "словарь". Поиск объекта осуществляется по его ключу. Есть разные структуры данных, которые построены по принципам хэширования, к примеру, широко известна <strong>хэш-таблица</strong>(обычно ее реализуют посредством массивов).От чего зависит производительность хэширующей структуры:</p>
134
<ul><li>от хэш-функции;</li>
134
<ul><li>от хэш-функции;</li>
135
<li>от размера хэш-таблицы;</li>
135
<li>от размера хэш-таблицы;</li>
136
<li>от метода обработки коллизий.</li>
136
<li>от метода обработки коллизий.</li>
137
</ul><p><strong>Что могут спросить:</strong></p>
137
</ul><p><strong>Что могут спросить:</strong></p>
138
<ul><li>поиск симметричных пар;</li>
138
<ul><li>поиск симметричных пар;</li>
139
<li>отслеживание полной траектории пути;</li>
139
<li>отслеживание полной траектории пути;</li>
140
<li>поиск, является ли массив подмножеством другого массива;</li>
140
<li>поиск, является ли массив подмножеством другого массива;</li>
141
<li>проверка, можно ли назвать массивы непересекающимися.</li>
141
<li>проверка, можно ли назвать массивы непересекающимися.</li>
142
</ul><p>Надеемся, этот перевод был вам полезен, и теперь вы имеете единое понимание основных структур данных, которые должен знать каждый разработчик. Мы уверены, что предоставленная информация обязательно поможет на собеседовании по программированию. Успехов!</p>
142
</ul><p>Надеемся, этот перевод был вам полезен, и теперь вы имеете единое понимание основных структур данных, которые должен знать каждый разработчик. Мы уверены, что предоставленная информация обязательно поможет на собеседовании по программированию. Успехов!</p>
143
143