Линейное время означает, что занимаемое время ограничено некоторым неопределенным постоянным временем (в этом контексте) количеством элементов в двух списках, которые вы хотите объединить. Ваш подход не достигает этого - требуется O (n log n) времени.
Определяя, сколько времени занимает алгоритм с точки зрения размера задачи, мы игнорируем такие детали, как скорость работы машины, что в основном означает, что мы игнорируем все постоянные члены. Для этого мы используем «асимптотическое обозначение». Они в основном описывают форму кривой, которую вы бы построили на графике размера задачи в x в зависимости от времени, взятого в y. Логика заключается в том, что плохая кривая (которая быстро становится круче) всегда приводит к замедлению времени выполнения, если проблема достаточно велика. Это может быть быстрее для очень маленькой проблемы (в зависимости от констант, которые, вероятно, зависят от машины), но для небольших проблем время выполнения обычно не является большой проблемой.
«Большой O» определяет верхнюю границу времени выполнения. Существуют взаимосвязанные обозначения для среднего времени выполнения и нижних границ, но именно «большой O» привлекает все внимание.
- O (1) - постоянное время - размер проблемы не имеет значения.
- O (log n) - довольно пологая кривая - время увеличивается немного, поскольку проблема становится больше.
- O (n) - линейное время - каждое увеличение на единицу означает, что требуется примерно постоянное количество дополнительного времени. График (приблизительно) прямая линия.
- O (n log n) изгибается вверх более круто, поскольку проблема становится более сложной, но не очень сильно. Это лучшее, что может сделать алгоритм сортировки общего назначения.
- O (n в квадрате) изгибается вверх намного круче, так как задача усложняется. Это типично для более медленных алгоритмов сортировки, таких как пузырьковая сортировка.
Самые противные алгоритмы классифицируются как «np-hard» или «np-complete», где «np» означает «неполиномиальный» - кривая становится круче быстрее, чем любой полином. Экспоненциальное время это плохо, но некоторые еще хуже. Подобные вещи все еще выполняются, но только для очень маленьких проблем.
РЕДАКТИРОВАТЬ последний абзац неверен, как указано в комментарии. У меня есть некоторые дыры в моей теории алгоритмов, и, очевидно, пришло время проверить то, что я думал Я выяснил. А пока я не совсем уверен, как исправить этот абзац, поэтому просто предупреждаю.
В случае вашей проблемы слияния учтите, что ваши два входных списка уже отсортированы. Самый маленький элемент из вашего вывода должен быть наименьшим из одного из ваших входов. Получите первый элемент от обоих и сравните два, и поместите наименьшее в ваш вывод. Поместите самое большое назад, откуда оно пришло. Вы проделали постоянную работу и обработали один предмет. Повторяйте, пока оба списка не будут исчерпаны.
Некоторые детали ... Во-первых, помещать элемент обратно в список, просто чтобы вытащить его снова, явно глупо, но это облегчает объяснение. Далее - один входной список будет исчерпан раньше другого, так что вам нужно с этим справиться (в основном просто очистите остальную часть другого списка и добавьте его в вывод). Наконец, вам не нужно удалять элементы из списков ввода - опять же, это только объяснение. Вы можете просто пройти через них.