Для начала с упрощением:
Существует всего несколько основных типов структур данных: массивы, списки и деревья. Все остальное может быть составлено с использованием различных типов этих двух структур (например, хеш-таблица может быть реализована с массивом для хеш-значений и одним списком для каждого хеш-значения для обработки коллизий).
Из этих структур массивы являются статическими (т. Е. Их объем памяти не изменяется во времени при выполнении операций над ними), а все остальное является динамическим (т. Е. В общем случае, объем памяти изменяется).
Различия между двумя типами структур могут быть получены из приведенного выше:
- Статика требует, чтобы максимальный размер был известен заранее, в то время как динамический может адаптироваться на лету
- Static не перераспределяет память, несмотря на то, что вы можете иметь гарантированные требования к памяти
Существуют и другие различия, которые, однако, вступают в действие только в том случае, если ваши данные могут быть отсортированы. Я не могу дать подробный список, поскольку существует много динамических структур данных, которые демонстрируют разные характеристики производительности для разных операций («добавить», «удалить», «найти»), и поэтому их нельзя разместить под одной крышей.
Очень заметное отличие состоит в том, что отсортированные массивы требуют перемещения (возможно большого количества) содержимого в памяти для любой операции, кроме «поиска», в то время как динамические структуры обычно выполняют меньше работы.
Итак, резюмируем:
- Если вам нужна гарантия максимального использования памяти, у вас нет другого выбора, кроме массива.
- Если у вас жесткий верхний предел размера данных, рассмотрите возможность использования массива. Массивы могут хорошо подходить для задач, которые в основном требуют операций добавления / удаления (сохранить массив не отсортированными), а также для тех, которые в основном требуют операций поиска (держать массив отсортированным), но не для обоих одновременно.
- Если у вас нет жесткого верхнего предела или если вы хотите, чтобы все операции добавления / удаления / поиска выполнялись быстро, используйте соответствующую динамическую структуру.
Редактировать: Я не упомянул графы, другой вид динамической структуры данных, которая, возможно, не может быть составлена из более простых частей (по определению, дерево имеет ровно одну ссылку, идущую "в" любой узел, кроме корня в то время как графики могут иметь более одного). Тем не менее, графы не могут действительно сравниваться с другими структурами в сценарии «что было бы лучше использовать», потому что вы либо должны использовать граф, либо нет (другие структуры могут демонстрировать разную производительность, но в итоге все они поддерживают тот же набор операций).