Структура данных: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Нет описания правки |
Нет описания правки |
||
(не показаны 23 промежуточные версии 20 участников) | |||
Строка 1: | Строка 1: | ||
[[Файл:binary tree.svg|thumb|192px|[[Бинарное дерево]], простой пример ветвящейся связной структуры данных.]] |
[[Файл:binary tree.svg|thumb|192px|[[Бинарное дерево]], простой пример ветвящейся связной структуры данных.]] |
||
'''Структура данных''' |
'''Структура данных''' ({{lang-en|data structure}}) — [[программная единица]], позволяющая хранить и обрабатывать ([[Конечный автомат|машиной]]) однотипные и/или логически связанные [[данные (вычислительная техника)|данные]]. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс. |
||
Термин «структура данных» может иметь несколько близких, но тем не менее различных значений{{sfn|Okasaki|1998|pp= |
Термин «структура данных» может иметь несколько близких, но тем не менее различных значений{{sfn|Okasaki|1998|pp=3—4}}: |
||
* [[Абстрактный тип данных]]; |
* [[Абстрактный тип данных]]; |
||
* Реализация какого-либо абстрактного типа данных; |
* Реализация какого-либо абстрактного типа данных; |
||
Строка 10: | Строка 10: | ||
Структуры данных формируются с помощью [[Тип данных|типов данных]], [[Ссылка (программирование)|ссылок]] и операций над ними в выбранном [[язык программирования|языке программирования]]. |
Структуры данных формируются с помощью [[Тип данных|типов данных]], [[Ссылка (программирование)|ссылок]] и операций над ними в выбранном [[язык программирования|языке программирования]]. |
||
Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, [[B-дерево|B-деревья]] обычно подходят для создания [[база данных|баз данных]], в то время как [[Хеш-таблица|хеш-таблицы]] используются повсеместно для создания различного рода словарей, например, для отображения доменных имён в [[IP-адрес|интернет- |
Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, [[B-дерево|B-деревья]] обычно подходят для создания [[база данных|баз данных]], в то время как [[Хеш-таблица|хеш-таблицы]] используются повсеместно для создания различного рода [[Ассоциативный массив|словарей]], например, для отображения доменных имён в [[IP-адрес|интернет-адресах компьютеров]]. |
||
При разработке программного обеспечения сложность реализации и качество работы программ существенно |
При разработке программного обеспечения сложность реализации и качество работы программ существенно зависят от правильного выбора структур данных. Это понимание дало начало формальным методам разработки и языкам программирования, в которых именно структуры данных, а не алгоритмы, ставятся во главу архитектуры программного средства. Большая часть таких языков обладает определённым типом [[Модульность (программирование)|модульности]], позволяющим структурам данных безопасно [[повторное использование кода|переиспользоваться]] в различных приложениях. [[Объектно-ориентированный язык программирования|Объектно-ориентированные языки]], такие как [[Java]], [[C Sharp|C#]] и [[C++]], являются примерами такого подхода. |
||
[[Файл:Python 3. The standard type hierarchy.png|thumb]] |
|||
Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных |
Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных хеш-таблица встроена в языки программирования [[Lua]], [[Perl]], [[Python]], [[Ruby]], [[Tcl]] и др. Широко используется [[стандартная библиотека шаблонов]] (STL) языка C++. |
||
Фундаментальными строительными блоками для большей части структур данных являются [[Массив (программирование)|массивы]], [[ |
Фундаментальными строительными блоками для большей части структур данных являются [[Массив (программирование)|массивы]], [[Запись (тип данных)|записи]] (<code>struct</code> в [[Си (язык программирования)|Си]] и <code>record</code> в [[Паскаль (язык программирования)|Паскале]]), [[размеченное объединение|размеченные объединения]] (<code>union</code> в Си) и [[Ссылка (программирование)|ссылки]]. Например, [[двусвязный список]] может быть построен с помощью записей и ссылок, где каждая запись (узел) будет хранить данные и ссылки на «левый» и «правый» узлы. |
||
== Сравнение структур данных в функциональном и императивном программировании == |
== Сравнение структур данных в функциональном и императивном программировании == |
||
Проектировать структуры данных для функциональных языков более сложно, чем для императивных, как минимум по двум причинам{{sfn|Okasaki|1998|pp= |
Проектировать структуры данных для функциональных языков более сложно, чем для императивных, как минимум по двум причинам{{sfn|Okasaki|1998|pp=3—4}}: |
||
# Почти все структуры данных интенсивно используют [[присваивание]], которое в чисто функциональном стиле не используется; |
# Почти все структуры данных интенсивно используют [[присваивание]], которое в чисто функциональном стиле не используется; |
||
# Функциональные структуры данных являются более гибкими, и поэтому там, где в императивном программировании старая версия теряется, просто заменяясь новой, в функциональном она автоматически продолжает существовать. Другими словами, в императивном программировании (если не принять особых мер, которые могут серьёзно усложнить программу) структуры данных являются '''''эфемерными''''' ({{lang-en|ephemeral}}), а в функциональных программах они как правило '''''постоянные''''' ({{lang-en|persistent}}). |
# Функциональные структуры данных являются более гибкими, и поэтому там, где в императивном программировании старая версия теряется, просто заменяясь новой, в функциональном она автоматически продолжает существовать. Другими словами, в императивном программировании (если не принять особых мер, которые могут серьёзно усложнить программу) структуры данных являются '''''эфемерными''''' ({{lang-en|ephemeral}}), а в функциональных программах они как правило '''''постоянные''''' ({{lang-en|persistent}}). |
||
== См. также == |
|||
* [[Онтология (информатика)]] |
|||
== Примечания == |
== Примечания == |
||
Строка 28: | Строка 32: | ||
== Литература == |
== Литература == |
||
* {{книга |
* {{книга |
||
|автор = Альфред В. Ахо, [[Джон Хопкрофт]], Джеффри Д. Ульман |
|автор = [[Ахо, Альфред|Альфред В. Ахо]], [[Джон Хопкрофт]], [[Ульман, Джеффри Дэвид|Джеффри Д. Ульман]] |
||
|заглавие = Структуры данных и алгоритмы |
|заглавие = Структуры данных и алгоритмы |
||
|оригинал = Data Structures and Algorithms |
|оригинал = Data Structures and Algorithms |
||
Строка 51: | Строка 55: | ||
|автор = Chris Okasaki |
|автор = Chris Okasaki |
||
|заглавие = Purely Functional Data Structures |
|заглавие = Purely Functional Data Structures |
||
|издательство = Cambridge University Press |
|издательство = [[Cambridge University Press]] |
||
|год = 1998 |
|год = 1998 |
||
|страниц = 232 |
|страниц = 232 |
||
Строка 60: | Строка 64: | ||
== Ссылки == |
== Ссылки == |
||
* [http://algolist.manual.ru/ds/ Структуры данных и хеширование] |
* [http://algolist.manual.ru/ds/ Структуры данных и хеширование] |
||
{{вс}} |
|||
* [http://kvodo.ru/data-structures-introduction.html Основные структуры данных] |
|||
{{compu-prog-stub}} |
|||
⚫ | |||
{{Структуры данных}} |
{{Структуры данных}} |
||
{{Типы данных}} |
{{Типы данных}} |
||
⚫ | |||
__NOTOC__ |
__NOTOC__ |
||
Текущая версия от 20:43, 29 марта 2024
Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать (машиной) однотипные и/или логически связанные данные. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.
Термин «структура данных» может иметь несколько близких, но тем не менее различных значений[1]:
- Абстрактный тип данных;
- Реализация какого-либо абстрактного типа данных;
- Экземпляр типа данных, например, конкретный список;
- В контексте функционального программирования — уникальная единица (англ. unique identity), сохраняющаяся при изменениях. О ней неформально говорят как об одной структуре данных, несмотря на возможное наличие различных версий.
Структуры данных формируются с помощью типов данных, ссылок и операций над ними в выбранном языке программирования.
Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, B-деревья обычно подходят для создания баз данных, в то время как хеш-таблицы используются повсеместно для создания различного рода словарей, например, для отображения доменных имён в интернет-адресах компьютеров.
При разработке программного обеспечения сложность реализации и качество работы программ существенно зависят от правильного выбора структур данных. Это понимание дало начало формальным методам разработки и языкам программирования, в которых именно структуры данных, а не алгоритмы, ставятся во главу архитектуры программного средства. Большая часть таких языков обладает определённым типом модульности, позволяющим структурам данных безопасно переиспользоваться в различных приложениях. Объектно-ориентированные языки, такие как Java, C# и C++, являются примерами такого подхода.
Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных хеш-таблица встроена в языки программирования Lua, Perl, Python, Ruby, Tcl и др. Широко используется стандартная библиотека шаблонов (STL) языка C++.
Фундаментальными строительными блоками для большей части структур данных являются массивы, записи (struct
в Си и record
в Паскале), размеченные объединения (union
в Си) и ссылки. Например, двусвязный список может быть построен с помощью записей и ссылок, где каждая запись (узел) будет хранить данные и ссылки на «левый» и «правый» узлы.
Сравнение структур данных в функциональном и императивном программировании
[править | править код]Проектировать структуры данных для функциональных языков более сложно, чем для императивных, как минимум по двум причинам[1]:
- Почти все структуры данных интенсивно используют присваивание, которое в чисто функциональном стиле не используется;
- Функциональные структуры данных являются более гибкими, и поэтому там, где в императивном программировании старая версия теряется, просто заменяясь новой, в функциональном она автоматически продолжает существовать. Другими словами, в императивном программировании (если не принять особых мер, которые могут серьёзно усложнить программу) структуры данных являются эфемерными (англ. ephemeral), а в функциональных программах они как правило постоянные (англ. persistent).
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 Okasaki, 1998, pp. 3—4.
Литература
[править | править код]- Альфред В. Ахо, Джон Хопкрофт, Джеффри Д. Ульман. Структуры данных и алгоритмы = Data Structures and Algorithms. — М.: Вильямс, 2000. — 384 с. — ISBN 0-201-00023-7.
- Майкл Мейн, Уолтер Савитч. Структуры данных и другие объекты в C++ = Data Structures and Other Objects Using C++. — 2-е изд. — М.: Вильямс, 2002. — 832 с. — ISBN 0-201-70297-5.
- Chris Okasaki. Purely Functional Data Structures. — Cambridge University Press, 1998. — 232 с. — ISBN 978-0521663502.
Ссылки
[править | править код]Для улучшения этой статьи по информационным технологиям желательно:
|