Particular way of storing and organizing data in a computer
В информатике структура данных — это организация и формат хранения данных , который обычно выбирается для эффективного доступа к данным. [1] [2] [3] Точнее, структура данных — это набор значений данных, взаимосвязей между ними и функций или операций , которые могут быть применены к данным, [4] т. е. это алгебраическая структура данных .
Использование
Структуры данных служат основой для абстрактных типов данных (ADT). ADT определяет логическую форму типа данных. Структура данных реализует физическую форму типа данных . [5]
Различные типы структур данных подходят для различных видов приложений, а некоторые из них узкоспециализированы для определенных задач. Например, реляционные базы данных обычно используют индексы B-дерева для поиска данных, [6] в то время как реализации компиляторов обычно используют хэш-таблицы для поиска идентификаторов . [7]
Структуры данных предоставляют средства для эффективного управления большими объемами данных для таких целей, как большие базы данных и службы индексации в Интернете. Обычно эффективные структуры данных являются ключом к разработке эффективных алгоритмов . Некоторые формальные методы проектирования и языки программирования подчеркивают структуры данных, а не алгоритмы, как ключевой организующий фактор в разработке программного обеспечения. Структуры данных могут использоваться для организации хранения и извлечения информации, хранящейся как в основной , так и во вторичной памяти . [8]
Выполнение
Структуры данных могут быть реализованы с использованием различных языков программирования и методов, но все они имеют общую цель эффективной организации и хранения данных. [9] Структуры данных, как правило, основаны на способности компьютера извлекать и хранить данные в любом месте своей памяти, указанном указателем — битовой строкой , представляющей адрес памяти , который сам может быть сохранен в памяти и обработан программой. Таким образом, структуры данных массива и записи основаны на вычислении адресов элементов данных с помощью арифметических операций , в то время как связанные структуры данных основаны на хранении адресов элементов данных внутри самой структуры. Такой подход к структурированию данных имеет глубокие последствия для эффективности и масштабируемости алгоритмов. Например, непрерывное распределение памяти в массивах облегчает операции быстрого доступа и модификации, что приводит к оптимизированной производительности в сценариях последовательной обработки данных. [10]
Реализация структуры данных обычно требует написания набора процедур , которые создают и манипулируют экземплярами этой структуры. Эффективность структуры данных не может быть проанализирована отдельно от этих операций. Это наблюдение мотивирует теоретическую концепцию абстрактного типа данных , структуры данных, которая определяется косвенно операциями, которые могут быть выполнены над ней, и математическими свойствами этих операций (включая их пространственную и временную стоимость). [11]
Примеры
Существует множество типов структур данных, как правило, построенных на более простых примитивных типах данных . Известными примерами являются: [12]
Массив — это ряд элементов в определенном порядке, обычно все одного типа (в зависимости от языка отдельные элементы могут быть либо принудительно одного типа, либо почти любого типа). Доступ к элементам осуществляется с помощью целочисленного индекса, чтобы указать, какой элемент требуется. Типичные реализации выделяют смежные слова памяти для элементов массивов (но это не всегда необходимо). Массивы могут быть фиксированной длины или с изменяемым размером.
Связанный список ( также называемый просто списком ) — это линейный набор элементов данных любого типа, называемых узлами, где каждый узел имеет свое значение и указывает на следующий узел в связанном списке. Главное преимущество связанного списка перед массивом заключается в том, что значения всегда можно эффективно вставлять и удалять без перемещения остальной части списка. Однако некоторые другие операции, такие как случайный доступ к определенному элементу, выполняются медленнее в списках, чем в массивах.
Хэш-таблицы , также известные как хэш-карты, представляют собой структуры данных, которые обеспечивают быстрый поиск значений на основе ключей. Они используют функцию хэширования для сопоставления ключей с индексами в массиве, что позволяет в среднем обеспечить постоянный временной доступ. Хэш-таблицы обычно используются в словарях, кэшах и индексации баз данных. Однако могут возникать коллизии хэшей, которые могут повлиять на их производительность. Для обработки коллизий используются такие методы, как цепочка и открытая адресация.
Графы — это наборы узлов, соединенных ребрами, представляющие отношения между сущностями. Графы могут использоваться для моделирования социальных сетей, компьютерных сетей и транспортных сетей, среди прочего. Они состоят из вершин (узлов) и ребер (соединений между узлами). Графы могут быть направленными или ненаправленными, а также иметь циклы или быть ациклическими. Алгоритмы обхода графов включают поиск в ширину и поиск в глубину.
Стеки и очереди — это абстрактные типы данных, которые можно реализовать с помощью массивов или связанных списков. Стек имеет две основные операции: push (добавление элемента на вершину стека) и pop (удаление самого верхнего элемента из стека), которые следуют принципу Last In, First Out (LIFO). Очереди имеют две основные операции: enqueue (добавление элемента в конец очереди) и dequeue (удаление элемента из начала очереди), которые следуют принципу First In, First Out (FIFO).
Деревья представляют собой иерархическую организацию элементов. Дерево состоит из узлов, соединенных ребрами, один из которых является корнем, а все остальные узлы образуют поддеревья. Деревья широко используются в различных алгоритмах и сценариях хранения данных. Двоичные деревья (особенно кучи ), AVL-деревья и B-деревья — некоторые популярные типы деревьев. Они обеспечивают эффективный и оптимальный поиск, сортировку и иерархическое представление данных.
Trie или дерево префиксов — это особый тип дерева, используемый для эффективного извлечения строк. В trie каждый узел представляет символ строки, а ребра между узлами представляют символы, которые их соединяют. Эта структура особенно полезна для таких задач, как автозаполнение, проверка орфографии и создание словарей. Trie позволяют выполнять быстрый поиск и операции на основе префиксов строк .
Языковая поддержка
Большинство языков ассемблера и некоторые низкоуровневые языки , такие как BCPL (Basic Combined Programming Language), не имеют встроенной поддержки структур данных. С другой стороны, многие высокоуровневые языки программирования и некоторые высокоуровневые языки ассемблера, такие как MASM , имеют специальный синтаксис или другую встроенную поддержку определенных структур данных, таких как записи и массивы. Например, языки C (прямой потомок BCPL) и Pascal поддерживают структуры и записи, соответственно, в дополнение к векторам (одномерным массивам ) и многомерным массивам. [14] [15]
Большинство языков программирования имеют своего рода библиотечный механизм, который позволяет повторно использовать реализации структур данных в разных программах. Современные языки обычно поставляются со стандартными библиотеками, которые реализуют наиболее распространенные структуры данных. Примерами являются C++ Standard Template Library , Java Collections Framework и Microsoft .NET Framework .
Многие известные структуры данных имеют параллельные версии, которые позволяют нескольким вычислительным потокам одновременно получать доступ к одному конкретному экземпляру структуры данных. [16]
^ Кормен, Томас Х.; Лейзерсон, Чарльз Э.; Ривест, Рональд Л.; Штейн, Клиффорд (2009). Введение в алгоритмы, третье издание (3-е изд.). Массачусетский технологический институт Пресс. ISBN 978-0262033848.
^ Black, Paul E. (15 декабря 2004 г.). "структура данных". В Pieterse, Vreda; Black, Paul E. (ред.). Словарь алгоритмов и структур данных [онлайн] . Национальный институт стандартов и технологий . Получено 2018-11-06 .
^ "Структура данных". Encyclopaedia Britannica . 17 апреля 2017 г. Получено 06.11.2018 .
^ Вегнер, Питер; Рейлли, Эдвин Д. (2003-08-29). Энциклопедия компьютерных наук. Чичестер, Великобритания: John Wiley and Sons. стр. 507–512. ISBN978-0470864128.
^ "Абстрактные типы данных". Virginia Tech - CS3 Data Structures & Algorithms . Архивировано из оригинала 2023-02-10 . Получено 2023-02-15 .
^ Гэвин Пауэлл (2006). "Глава 8: Создание быстродействующих моделей баз данных". Начало проектирования баз данных . Wrox Publishing . ISBN978-0-7645-7490-0. Архивировано из оригинала 2007-08-18.{{cite book}}: CS1 maint: unfit URL (link)
^ "1.5 Applications of a Hash Table". University of Regina - CS210 Lab: Hash Table . Архивировано из оригинала 2021-04-27 . Получено 2018-06-14 .
^ «Когда данные слишком велики, чтобы поместиться в основную память». Университет Индианы в Блумингтоне — Структуры данных (C343/A594) . 2014. Архивировано из оригинала 10.04.2018.
^ Вайшнави, Гунджал; Шраддха, Гаване; Йогешвари, Джоши (2021-06-21). «Обзорная статья по мелкозернистому распознаванию выражений лица с использованием машинного обучения» (PDF) . Международный журнал компьютерных приложений . 183 (11): 47–49. doi :10.5120/ijca2021921427.
^ Нивергельт, Юрг; Видмайер, Питер (2000-01-01), Сак, Дж. -Р.; Уррутия, Дж. (ред.), «Глава 17 - Пространственные структуры данных: концепции и выбор дизайна», Справочник по вычислительной геометрии , Амстердам: Северная Голландия, стр. 725–764, ISBN978-0-444-82537-7, получено 2023-11-12
^ Дубей, RC (2014). Продвинутая биотехнология: Для студентов бакалавриата и магистратуры по биотехнологии и другим биологическим наукам . Нью-Дели: S Chand. ISBN978-81-219-4290-4. OCLC 883695533.
^ Сеймур, Липшуц (2014). Структуры данных (пересмотренное первое издание). Нью-Дели, Индия: McGraw Hill Education. ISBN9781259029967. OCLC 927793728.