Какова связь между структурами данных и алгоритмами? [закрыто]

13

Я искал хороший онлайн-курс по структурам данных, но обнаружил, что Google также возвращает результаты для курсов по алгоритмам, которые говорят что-то вроде:

В этом курсе вы изучите несколько фундаментальных принципов построения алгоритмов: методы «разделяй и властвуй», алгоритмы графов, практические структуры данных (кучи, хеш-таблицы, деревья поиска) , рандомизированные алгоритмы и многое другое. [источник]

и

К концу этого занятия вы поймете ключевые понятия, необходимые для разработки новых алгоритмов для графов и других важных структур данных и для оценки эффективности этих алгоритмов. [источник]

и

Этот курс представляет собой введение в математическое моделирование вычислительных задач. Он охватывает общие алгоритмы, алгоритмические парадигмы и структуры данных, используемые для решения этих проблем . [источник]

Мой вопрос: тесно ли связаны алгоритмы и структуры данных, что означает, что они должны пониматься вместе, или одна тема является более фундаментальной, чем другая?

РЕДАКТИРОВАТЬ: Для тех, кто голосует, чтобы закрыть этот вопрос, не могли бы вы сказать мне, почему и, возможно, как улучшить этот вопрос? Умение задавать правильные вопросы является частью образовательного процесса.

GWG
источник
17
Структура данных является статической и ничего не может сделать. Алгоритм - это просто набор инструкций для обработки некоторых данных. Без одного другой бесполезен. Вместе они делают компьютерные программы. Они оба фундаментальные.
Фоши
2
@ Фоши Неверно. Структура данных тесно связана с алгоритмами, которые манипулируют данными. Столь тесно связанные эти алгоритмы считаются частью структуры данных. Например, структура данных Lined List сообщает вам, как данные сохраняются, а также как данные считываются и обрабатываются.
Euphoric
7
@Euphoric Я бы сказал, что неправильно говорить, что алгоритмы являются частью структуры данных. Существует несколько способов реализации бинарного поиска: вы можете, например, выполнить простой if less than recurse to the left; if greater than, recurse to the right; if equal, returnпоиск или сделать его немного более сложным if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. У них немного другое количество сравнений. И то, и другое - одна из многих вещей, которые вы можете сделать с деревом.
Довал
4
@Euphoric Вы путаете структуру данных с абстрактным типом данных, который реализует комбинация структуры данных и алгоритмов.
Доваль
7
@ Эйфорик, я должен не согласиться. сортировка слиянием - это алгоритм. Массив - это структура данных. Связанный список - это другая структура данных. Я могу написать реализацию MergeSort для работы с любым из них. Некоторые структуры данных могут быть более естественными или более эффективными для конкретного алгоритма, но это редко является абсолютным требованием (для реализации сортировки в куче вам действительно нужно иметь кучу). Николас Вирт написал популярный учебник в 1980-х годах под названием: «Алгоритмы + структуры данных = программы»
Чарльз Грант

Ответы:

20

Все виды смесей существуют. У вас есть структуры данных, которые не связаны с алгоритмами, алгоритмы, для которых не требуются (реальные) структуры данных, но чаще всего они входят в один пакет.

Редактировать: как правильно указал @Doval, структуры данных сами по себе не имеют никаких операций, связанных с ними. Акт объединения структуры данных и алгоритма формирует абстрактный тип данных.

Структуры данных без алгоритмов

Рассмотрим, например, структуру данных для хранения двумерных координат, которая называется соответствующим образом Point. Нет ничего особенного с точки зрения алгоритмов, которые нужно сделать для точки, и это на самом деле просто контейнер для xи yзначения. Конечно, предоставив эту структуру данных, вы можете добавить к ней все виды алгоритмов (расчет расстояния, выпуклые оболочки, что у вас).

Вы можете думать о множестве структур данных, которые представляют собой просто набор отдельных данных. Хотя это часто происходит на практике, они не являются хорошим учебным материалом, потому что из этого нечего извлекать уроки, как только вы поняли, что отдельные элементы данных могут быть собраны в новую структуру данных (например, то, что вы изучаете) после приведенного выше Pointпримера, если я предоставлю вам эту удивительную структуру данных Point3D, которая может сделать то же самое для трехмерного пространства?)

Алгоритмы без (реальных) структур данных

«Реальный», потому что, очевидно, каждому интересному алгоритму нужны примитивные типы данных, такие как целые или логические, и мы не хотим рассматривать их как структуры данных в этом контексте. Как и выше, эти алгоритмы, как правило, довольно простые. В частности, они не имеют какого-либо сложного состояния, потому что это обычно входит в структуру данных (см. Следующий раздел).

Примером такого алгоритма будет вычисление наибольшего общего делителя двух чисел. Алгоритмы Евклида для gcd действительно должны содержать только два целых числа и манипулировать ими.

Когда все станет интереснее, вы очень скоро войдете в мир абстрактных типов данных. Например, сито Эратосфена основано на массиве. Теперь мы могли бы обсудить, является ли массив все еще примитивным, или на самом деле, вы могли бы обсудить, не является ли целое число структурой данных. В любом случае, алгоритмы, которые существуют полностью без структур данных, довольно скучны, даже если вы принимаете их изолированное существование.

Алгоритмы в сочетании со структурами данных, или абстрактные типы данных

Теперь это интересные, но по двум очень разным причинам. Как правило, вы можете подойти к ним с двух сторон: сначала структура данных или сначала алгоритм.

Хотя абстрактный тип данных определяется комбинацией структуры данных + алгоритмы / операции, мы часто рассматриваем их с акцентом на одном из них и рассматриваем другой как вспомогательные.

Структура данных, затем алгоритм

Вы столкнетесь с абстрактными типами данных, которые довольно просты в использовании, но используют более или менее сложные алгоритмы для обеспечения их внутренней работы. Например, a HashMapтривиально для использования, но включает в себя изящную хеш-функцию и имеет дело с коллизиями хеша внутри. Тем не менее, с вашей точки зрения, как пользователя, вы заботитесь о нем как о чем-то, что хранит данные для вас, а не как о чем-то, что делает что-то для вас.

В отличие от последней группы ниже, эти структуры данных не подвергают своих пользователей этим алгоритмам. Вам не нужно знать или заботиться о HashMapвнутренней хэш-функции, чтобы иметь возможность ее использовать. (Чтобы использовать его эффективно, вы можете знать эти вещи;)

Алгоритм, то структура данных

Другое направление означает, что у вас есть алгоритм, который вы хотите просто использовать, но который требует внутренних структур данных, чтобы он работал как задумано. Примером может служить алгоритм разделения двоичного пространства (BSP), который можно просто запросить для двумерного Pointиз большого набора точек, ближайшего к данной точке запроса. Тем не менее, вам нужна древовидная структура (и даже дополнительные алгоритмы, такие как вычисления расстояний) внутри, чтобы фактически написать алгоритм.

В общем, можно сказать, что алгоритмы в этой группе используют задействованные структуры данных для представления их внутреннего состояния. Я бы сказал, что эта группа алгоритмов самая разнообразная, и вы найдете много разных алгоритмов, которые соответствуют этой общей схеме. Что касается точки зрения, мы считаем их интересными, потому что они что-то делают (например, сортировку) для нас, и нас не слишком заботит часть хранения данных.

Тесно связанные структуры данных и алгоритмы

Наконец, у вас есть структуры данных, которые очень тесно связаны с алгоритмами, которые непосредственно им соответствуют. Типичным примером является двоичное дерево, которое, когда вы хотите сделать что-то значимое с ним, навязывает вам тему алгоритмов обхода дерева (сначала в глубину, в ширину, что угодно).

В этих случаях мы часто меняем фокус нашего представления о результирующих абстрактных типах данных. Иногда вы заботитесь о структуре вашего дерева, через несколько минут вы заботитесь о возможности запустить на нем операцию поиска, затем вам интересно удалить узел и сразу же узнать, как структура будет выглядеть потом. Хотя все это верно и для других разделов выше, это не то, что является основным направлением вашего внимания, например, когда вы сохраняете / извлекаете данные в / из Map, или когда вы сортируете связанный список.

Фрэнк
источник
1
Вы объединяете структуры данных и абстрактные типы данных. Структура данных ничего не делает . Нет смысла говорить «вы столкнетесь со структурами данных, которые довольно просты в использовании», потому что структура данных - это просто структура. А Map- это абстрактный тип данных, который может быть реализован с использованием конкретной структуры данных и набора алгоритмов, которые дают желаемые результаты путем обхода и манипулирования структурой. Структура данных не скрывает алгоритмы, потому что у них их нет; абстрактный тип данных скрывает структуру данных (вот что делает ее абстрактной.)
Doval,
Обратите внимание, что в некотором смысле алгоритмы всегда скрыты, потому что нет способа проверить функции. Вероятно, поэтому они называются абстракциями в лямбда-исчислении (единственным типом данных которого являются функции).
Доваль
2
Ты прав. Тем не менее, я вижу различие между тем, как мы видим разные ADT. Я отредактировал свой ответ и надеюсь, что теперь он более понятен и больше не связывает структуру с ADT, при этом подчеркивая, что вы можете сосредоточиться на структуре и / или операциях для любого ADT.
Франк
Неужели слишком просто сказать, что структуры данных являются существительными, а алгоритмы - глаголами? Я полагаю , вы могли бы сказать , что алгоритм является реализацией глагола, но вы по- прежнему искать в дереве , даже если этот поиск является бинарным поиском. Говоря об этом, вы упустите все технические детали, но в них есть определенная элегантность.
Маг
@Doval: даже если структура данных, которая просто состоит из набора чисел в массиве, которые должны иметь и поддерживать некоторые отношения друг с другом, такая вещь может быть «простой в использовании», если легко поддерживать требуемые инварианты делая то, что вы хотите, или «трудно использовать», если это трудно.
суперкат
5

Структуры данных часто влияют на детали алгоритма. Из-за этого они часто идут рука об руку.

Рассмотрим, например, алгоритм стрижки вашего газона. То, как вы будете подстригать газон, вероятно, будет зависеть от фактической структуры вашего газона. Если вы живете в небольшом доме в густонаселенном пригороде и ваш газон представляет собой небольшой прямоугольник площадью в несколько метров, вы, вероятно, предпочли бы подстригать газон с помощью косилки-толкача, а не тракторной / ездовой косилки. Если ваш газон занимает много акров равнинной луговой земли, вы можете предпочесть верховую газонокосилку, а не газонокосилку (хотя любая газонокосилка может в конечном итоге выполнить работу). Если ваш газон включает в себя акры земли с большими ровными участками, но с несколькими небольшими холмами и множеством деревьев, вы можете разработать более интересный алгоритм для стрижки газона, который включает в себя как газонокосилку-качалку, так и толкающую косилку, или какую-то другую траву. Техника резки.

Однако в конечном итоге структура ваших данных может оказать существенное влияние на ваши решения о том, как разрабатывать свой алгоритм (или какие алгоритмы использовать). По этой причине эти две темы часто идут рука об руку.

И наоборот: иногда алгоритм, который мы хотим использовать, влияет (по крайней мере, в начале вычислений) на структуры данных, которые вы разрабатываете для поддержки алгоритма. Например, переход от списка массивов к идее связанного списка и в конечном итоге к BST для хранения упорядоченного списка, который позволит быстро найти.

YoungJohn
источник