HTML Diff
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