Структура данных: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
 
(не показаны 23 промежуточные версии 20 участников)
Строка 1: Строка 1:
[[Файл:binary tree.svg|thumb|192px|[[Бинарное дерево]], простой пример ветвящейся связной структуры данных.]]
[[Файл:binary tree.svg|thumb|192px|[[Бинарное дерево]], простой пример ветвящейся связной структуры данных.]]
'''Структура данных''' -({{lang-en|data structure}}) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных [[данные (вычислительная техника)|данных]] в [[Компьютер|вычислительной технике]]. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.
'''Структура данных''' ({{lang-en|data structure}}) — [[программная единица]], позволяющая хранить и обрабатывать ([[Конечный автомат|машиной]]) однотипные и/или логически связанные [[данные (вычислительная техника)|данные]]. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.


Термин «структура данных» может иметь несколько близких, но тем не менее различных значений{{sfn|Okasaki|1998|pp=3-4}}:
Термин «структура данных» может иметь несколько близких, но тем не менее различных значений{{sfn|Okasaki|1998|pp=3—4}}:
* [[Абстрактный тип данных]];
* [[Абстрактный тип данных]];
* Реализация какого-либо абстрактного типа данных;
* Реализация какого-либо абстрактного типа данных;
Строка 10: Строка 10:
Структуры данных формируются с помощью [[Тип данных|типов данных]], [[Ссылка (программирование)|ссылок]] и операций над ними в выбранном [[язык программирования|языке программирования]].
Структуры данных формируются с помощью [[Тип данных|типов данных]], [[Ссылка (программирование)|ссылок]] и операций над ними в выбранном [[язык программирования|языке программирования]].


Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, [[B-дерево|B-деревья]] обычно подходят для создания [[база данных|баз данных]], в то время как [[Хеш-таблица|хеш-таблицы]] используются повсеместно для создания различного рода словарей, например, для отображения доменных имён в [[IP-адрес|интернет-адреса компьютеров]].
Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, [[B-дерево|B-деревья]] обычно подходят для создания [[база данных|баз данных]], в то время как [[Хеш-таблица|хеш-таблицы]] используются повсеместно для создания различного рода [[Ассоциативный массив|словарей]], например, для отображения доменных имён в [[IP-адрес|интернет-адресах компьютеров]].


При разработке программного обеспечения сложность реализации и качество работы программ существенно зависит от правильного выбора структур данных. Это понимание дало начало формальным методам разработки и [[язык программирования|языкам программирования]], в которых именно структуры данных, а не алгоритмы, ставятся во главу архитектуры программного средства. Большая часть таких языков обладает определённым типом [[Модульность (программирование)|модульности]], позволяющим структурам данных безопасно [[повторное использование кода|переиспользоваться]] в различных приложениях. [[Объектно-ориентированный язык программирования|Объектно-ориентированные языки]], такие как [[Java]], [[C Sharp|C#]] и [[C++]], являются примерами такого подхода.
При разработке программного обеспечения сложность реализации и качество работы программ существенно зависят от правильного выбора структур данных. Это понимание дало начало формальным методам разработки и языкам программирования, в которых именно структуры данных, а не алгоритмы, ставятся во главу архитектуры программного средства. Большая часть таких языков обладает определённым типом [[Модульность (программирование)|модульности]], позволяющим структурам данных безопасно [[повторное использование кода|переиспользоваться]] в различных приложениях. [[Объектно-ориентированный язык программирования|Объектно-ориентированные языки]], такие как [[Java]], [[C Sharp|C#]] и [[C++]], являются примерами такого подхода.


[[Файл:Python 3. The standard type hierarchy.png|thumb]]
Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных хэш-таблица встроена в языки программирования [[Lua]], [[Perl]], [[Python]], [[Ruby]], [[Tcl]] и др. Широко используется [[стандартная библиотека шаблонов]] (STL) языка C++.
Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных хеш-таблица встроена в языки программирования [[Lua]], [[Perl]], [[Python]], [[Ruby]], [[Tcl]] и др. Широко используется [[стандартная библиотека шаблонов]] (STL) языка C++.


Фундаментальными строительными блоками для большей части структур данных являются [[Массив (программирование)|массивы]], [[запись (языки программирования)|записи]] (<code>struct</code> в [[Си (язык программирования)|Си]] и <code>record</code> в [[Паскаль (язык программирования)|Паскале]]), [[размеченное объединение|размеченные объединения]] (<code>union</code> в Си) и [[Ссылка (программирование)|ссылки]]. Например, [[двусвязный список]] может быть построен с помощью записей и ссылок, где каждая запись (узел) будет хранить данные и ссылки на «левый» и «правый» узлы.
Фундаментальными строительными блоками для большей части структур данных являются [[Массив (программирование)|массивы]], [[Запись (тип данных)|записи]] (<code>struct</code> в [[Си (язык программирования)|Си]] и <code>record</code> в [[Паскаль (язык программирования)|Паскале]]), [[размеченное объединение|размеченные объединения]] (<code>union</code> в Си) и [[Ссылка (программирование)|ссылки]]. Например, [[двусвязный список]] может быть построен с помощью записей и ссылок, где каждая запись (узел) будет хранить данные и ссылки на «левый» и «правый» узлы.


== Сравнение структур данных в функциональном и императивном программировании ==
== Сравнение структур данных в функциональном и императивном программировании ==
Проектировать структуры данных для функциональных языков более сложно, чем для императивных, как минимум по двум причинам{{sfn|Okasaki|1998|pp=3-4}}:
Проектировать структуры данных для функциональных языков более сложно, чем для императивных, как минимум по двум причинам{{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}}
{{rq|refless|topic=ИТ}}

{{Структуры данных}}
{{Структуры данных}}
{{Типы данных}}
{{Типы данных}}
{{rq|refless|topic=ИТ}}

__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]:

  1. Почти все структуры данных интенсивно используют присваивание, которое в чисто функциональном стиле не используется;
  2. Функциональные структуры данных являются более гибкими, и поэтому там, где в императивном программировании старая версия теряется, просто заменяясь новой, в функциональном она автоматически продолжает существовать. Другими словами, в императивном программировании (если не принять особых мер, которые могут серьёзно усложнить программу) структуры данных являются эфемерными (англ. ephemeral), а в функциональных программах они как правило постоянные (англ. persistent).

Примечания

[править | править код]
  1. 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.