Когда вы смотрите на улучшение программы или фрагмента производительности кода (т. е. используя лучший алгоритм для вычисления одного и того же результата), важно рассмотреть видимый результат алгоритма. То есть, как алгоритм (выход) алгоритма используется или потребляется? Другими словами, что возвращает алгоритм и как его потребляет?
Вышеупомянутые шаги в вашем вопросе указывают, что список должен быть построен, но что тогда? Если бы вы просто отбросили результаты (вы могли бы легко написать такую программу или функцию), хороший оптимизатор (человек или машина) мог бы заменить нулевую или пустую программу или функцию на основании того, что результат никогда не используется. (Серьезно: это общая проблема в тестах, алгоритм вычисляет некоторый результат для измерения производительности сгенерированного кода, но этот результат не используется, поэтому компилятор удаляет потенциально целые циклы, выделения памяти, возможно целые функции!)
So , что действительно важно в отношении настройки вашего вопроса об анализе того, как перейти к изменению алгоритма для лучшей производительности, - это определить или указать часть используемого результата (какой-либо другой частью программы).
Учитывая спецификацию (как используются результаты алгоритма), мы можем работать назад, чтобы найти алгоритмические улучшения, которые дают одинаковые результаты при меньшей работе.
Когда мы составляем алгоритмы, мы можем работать над композициями, чтобы определить возможности для улучшения. Иными словами, алгоритм, описанный выше, может быть использован каким-либо другим алгоритмом для поиска только одного значения за раз, что означает, что решение Джеффри является лучшим алгоритмом замены.
Однако другой потребитель вашего алгоритма списка может запросить различную часть его видимого эффекта, поэтому может потребоваться другая оптимизация или алгоритмическая подстановка. Таков случай, описанный выше, если результаты не используются вообще, и все же другой потребитель может просто захотеть подсчитать количество узлов в списке, и в этом случае более подходящая оптимизация будет более подходящей.
В некоторых случаях мы можем указать, что алгоритм возвращает что-то, и мы вынуждены генерировать код по той или иной причине, не зная, кто потребляет результат. В таких случаях оптимизатор (человек или машина) будет вынужден пессимистично предположить, что каждый видимый эффект, который возвращается, потенциально потребляется. Например, предположим, что список - это то, что возвращается (как дополнительная спецификация в вашем вопросе), и мы не позволяем никакому оптимизатору видеть дальше в потреблении, мы, по всей вероятности, должны были бы фактически создать список (и так Ответ Джеффри не сработает).
Короче говоря, мы не можем полностью проанализировать проблему и пространство ее решения без дополнительного контекста.
В частности, этот дополнительный контекст принимает форму явного оператора return (или какого-либо другого внешне видимого побочного эффекта, такого как изменение глобальной переменной).
И, кроме того, некоторые из этого дополнительного контекста могут принимать форму другого алгоритма, который включает, вызывая или составляя (с исходным алгоритмом, представляющим интерес); следовательно, процесс оптимизации рекурсивный и дает лучшие результаты, тем больше (человек или машина) может «видеть».
Вы должны задать свой вопрос здесь: [Math] (http://math.stackexchange.com/) –
На самом деле это не просто объяснение алгоритмов и как повысить производительность алгоритма. И если я правильно смотрю на это, это должен быть алгоритм O (n), так как вы должны пропустить все элементы n (в данном случае 10000000) один раз. – CBredlow
Думаю, вам нужно более подробно описать проблему. «Генерация» такого списка может быть выполнена O (1), так как сам список является постоянным. @ Siamak.A.M: Я не думаю, что этот вопрос подходит. Сайт Math предназначен для студентов и специалистов по математике. –