Этим вопросом была последняя соломинка; и я задавался вопросом в течение долгого времени об этом,
Почему люди думают об "Алгоритмах" и "Структурах данных" как о чем-то, что может быть разделено друг от друга?
Я вижу большое доказательство, что они разделяются в умах программистов.
По-моему, "Структуры данных" являются алгоритмами, так как понятие "Структуры данных" об Алгоритмах для работы данными, которые входят и из структур. Но мнение кажется не господствующей тенденцией. Что я пропускаю?
Править: к сожалению, я не сформулировал вопрос хорошо. Разделение структур данных и алгоритмов у людей программ, запись является естественной, так как, ну, в общем, первый - данные и последний, является функциями (и в полуфункциональных платформах как STL это - ядро всего этого).
Но точки выше, и сам вопрос, относятся к способу, которым люди думают к способу, которым они располагают знание в головах. Это не должно даже касаться записи кода.
Вот некоторые ссылки, где люди разделяют "алгоритмы" и "структуры данных", когда они - то же самое:
Люди называют их разными сущностями, потому что они есть. Предположим, я хочу найти элемент из набора данных. Если я помещу эти данные в массив, массив будет структурой данных. Попав в массив, я могу использовать несколько разных алгоритмов для поиска интересующего меня элемента. Я мог бы отсортировать массив (с любым из нескольких видов), затем использовать двоичный поиск, я мог бы просто проверить каждый элемент линейно и т. Д. Выбор массива в качестве структуры данных, которую я бы использовал, в отличие от связанного списка, не означает выбор алгоритма.
При этом важно понимать одно, чтобы понимать другое. Если вы плохо разбираетесь в алгоритмах, тогда не очевидно, каковы преимущества и недостатки различных структур данных, и наоборот. Таким образом, имеет смысл обучать их одновременно. Однако это разные сущности.
[Edit] Подумайте об этом: если вы посмотрите на псевдокод для большинства алгоритмов, структура данных не определена. У вас может быть «список» элементов для перебора и т. Д., Но точная реализация этого списка не важна для правильности алгоритма.
Я бы сказал, это потому, что функциональное программирование отделяет то, над чем работают, от самих операций. Цели и действия, безусловно, разные, даже если они тесно взаимосвязаны.
Это было объектно-ориентированное программирование, объединяющее данные и операции в один компонент. Возможно, если бы OO появился раньше, была бы одна дисциплина.
Насколько я понимаю, алгоритмы - это то, что работает с или в структурах данных , так что там разница между ними. Простая структура данных - это массив, но существует множество алгоритмов, которые работают с простыми массивами, поэтому должен быть способ их разделения. Массив также может представлять дерево, и деревья обрабатываются с помощью специализированных алгоритмов.
Разница не велика, потому что в большинстве случаев нельзя иметь одно без другого, но иногда можно. Рассмотрим тривиальный алгоритм, который определяет, является ли число простым - он не использует структур данных. Рассмотрим алгоритм GCD, также без структур данных. Вы можете говорить об алгоритме, не говоря о структурах данных, но вы не можете говорить о структуре данных, не говоря обычно об алгоритмах. Вы можете говорить о дереве, но вам понадобятся алгоритмы для вставки, удаления и т. Д.
Я думаю, что есть различие, потому что они концептуально разные вещи. Алгоритм - это набор шагов, используемых для выполнения задачи, в то время как структура данных - это то, что используется для хранения данных , манипулирование этими данными выполняется с помощью алгоритмов.
Они разные. Если быть более точным, рассмотрим графы или деревья. Теперь дерево кажется только деревом. Но вы можете просматривать его в предзаказе, в порядке или после заказа (3 алгоритма для одной структуры ).
У вас может быть несколько или только 2 дочерних узла для одного узла. Дерево может быть сбалансированным (например, AVL) или содержать дополнительную информацию (например, индексы B-дерева в базах данных). Это разные структуры . Но вы все равно проходите их с помощью того же алгоритма .
Теперь видите?
Другой момент: иногда алгоритмы, а иногда и не независимы от структур данных. Некоторые алгоритмы имеют разную сложность по разным структурам (поиск путей в графе, представленном в виде списка или двухмерной таблицы).
Это отдельные университетские курсы. Как правило, курс структур данных делает упор на программировании и является предварительным условием для курса алгоритмов, который делает упор на математический анализ алгоритмов. Я не думаю, что трудно понять, почему многие люди с высшим образованием в области компьютерных наук могут думать о них как о разных.
Эти двое, конечно, тесно взаимосвязаны. Вот почему сообщения, на которые вы ссылаетесь, запрашивают книги по обоим. Но не всегда. Например, ядро алгоритма сортировки остается неизменным независимо от того, над какой структурой данных вы работаете.
Название книги Алгоритм + структуры данных = программы (1975), написанной не кем иным, как Никлаусом Виртом, говорит о том, что и то, и другое необходимо для написания программы.
Алгоритмы и структуры данных тесно связаны друг с другом. Алгоритм зависит от структур данных, если вы измените любую из них, сложность значительно изменится. Это не одно и то же, но определенно две стороны одной медали. Выбор хорошей структуры данных сам по себе является путем к лучшему алгоритму.
Например, , Очереди приоритетов могут быть реализованы с использованием двоичных куч и биномиальных куч , двоичных куч позволяют просматривать элемент с наивысшим приоритетом за постоянное время, тогда как биномиальные кучи требуют времени O (log N) для просмотра.
Таким образом, конкретный алгоритм лучше всего работает для этой конкретной структуры данных (в определенном контексте), следовательно, Алгоритмы и Структуры данных идут рука об руку!
Я согласен с вами. Оба являются двумя сторонами одного и того же.
Когда мы говорим о структурах данных, всегда речь идет о хранении данных таким образом, чтобы оптимизировать определенные операции с этими данными, что приводит нас к алгоритмам и сложности.