максимальный порядок времени в методе - в списках - это O (n) в python, которые, как вы знаете, имеют лучшие временные порядки. Это правда?
Нет, это не правда. Поиск максимального значения в списке потребует проверки всех значений в списке, следовательно, O (n) .
Вас могут спутать списки, которые были подготовлены в некотором роде. Например:
У вас есть список, который уже отсортирован (это процесс O (nlogn) ). В этом случае вы, конечно, можете получить максимум за постоянное время, так как вы знаете его индекс. Если список отсортирован в порядке возрастания, было бы неразумно вызывать max
, так как это действительно было бы пустой тратой времени. Вы можете знать, что список отсортирован, но python не примет это и все равно сканирует весь список.
У вас есть список, который был heapified до максимальной кучи (что является процессом O (n) ). Опять же, в этом случае вы можете получить максимум за постоянное время, так как он хранится с индексом 0. Списки можно накапливать с помощью heapq
- по умолчанию используется min-heap.
Итак, если вы ничего не знаете о своем списке, то вам придется проверить все значений, чтобы точно определить максимум. Вот что делает max()
. Если вы действительно знаете что-то большее, что может помочь определить максимум без необходимости просматривать все значения, тогда используйте другой, более подходящий метод.
Должен ли я использовать алгоритмы, которые, как я знаю, могут работать лучше, чтобы сэкономить больше времени, или python сделал это для меня в своих методах?
Вам следует использовать алгоритмы, которые, как вы знаете, могут работать лучше (исходя из того, что вы знаете о структуре данных). Во многих случаях такая лучшая реализация алгоритма доступна через библиотеку python. Например, чтобы найти определенное значение в отсортированном списке, используйте bisect.bisect_left
, а не index
.
. Посмотрите на более сложный пример. Допустим, вы написали код, который может генерировать шахматные ходы и имитировать игру в шахматы. У вас есть хорошие идеи о функциях оценки, сокращении алфавита, перемещениях убийцы, таблицах поиска и ... и множестве других методов оптимизации. Вы не можете ожидать, что python станет умным, когда вы введете наивный max
для "всех" оцененных шахматных состояний. Вам необходимо реализовать сложный алгоритм для эффективного поиска и фильтрации правильных состояний, чтобы получить «лучшие» шахматные ходы из этого леса информации, не тратя время на менее многообещающие ходы.