Да и нет. Это зависит от ограничений, которые вы хотите встретить, и предварительных условий, необходимых для запуска вашего алгоритма.
В идеале алгоритм - это абстрактный рецепт, который шаг за шагом определяет, как что-то делать. Алгоритмы были определены так же с целью воспроизводимости и последующей автоматизации. Алгоритмы происходят от лямбда-исчисления, поэтому вы можете легко понять, почему они сделаны таким образом. Это определение является обычным, но современные алгоритмы могут быть непоследовательными (не пошаговыми, как параллельные алгоритмы, или логическими, например, использующими объединение), нелинейными (стохастические алгоритмы) или просто странными (квантовыми алгоритмы), но я передам это.
Таким образом, в идеале алгоритм должен быть как можно более абстрактным, без учета какого-либо оборудования.
Но, как и в любой системе, вы должны определить некоторые аксиомы не только для того, чтобы получить согласованную систему, но и для того, чтобы выиграть время. Например, большинство алгоритмов предполагают, по крайней мере неявно, что они определены на машине фон Неймана. Если бы это было не так, им нужно было бы явно определить каждую часть системы, на которой они должны работать (поскольку это требуется для воспроизведения рецепта, это своего рода предварительное условие). Кроме того, часто алгоритмы опираются на общие команды, такие как write (), не определяя их полностью.
Еще одна причина, по которой алгоритмы не столь отвлечены от аппаратной архитектуры, - это когда вам необходимо выполнить некоторые ограничения .
Допустим, вы работаете со встроенными системами, и, возможно, вы не можете полагаться на то же количество ресурсов, которое есть на рабочих станциях. Вероятно, одним из наиболее сдержанных ресурсов является память. Однако большинство алгоритмов имеют тенденцию оптимизировать сложность времени (скорость выполнения на процессоре), а не сложность памяти (объем памяти, необходимый для работы с данными). Для этих систем были разработаны алгоритмы, оптимизированные для памяти, в которых алгоритмы, не оптимизированные для памяти, просто отказывали или работали намного медленнее. Фактически, встроенные системы не являются единственной целью алгоритмов, эффективно использующих память: например, существуют алгоритмы , не обращающие внимания на кэш, которые адаптируют их обработку для эффективного использования кэша ЦП. Другой пример: некоторые алгоритмы машинного обучения для больших данных адаптированы дляинкрементное обучение или неосновные вычисления для обработки огромного объема данных, намного превышающего объем памяти, доступный на любом компьютере, и т. д.
Существуют также алгоритмы, которые не оптимизируют определенную часть компьютера, но стандарт, который зависит от аппаратной архитектуры. Например, числовые данные, которые требуют точности, хранятся внутри числа с плавающей запятой или двойного числа, которые по своей природе ограничены из-за аппаратных ограничений. Проблема в том, что сложные вычисления могут привести к округлению, и чем больше вычислений вы выполняете для округленных чисел, тем больше вы будете смещаться. Это называется катастрофическим вмешательством . Некоторые приложения нуждаются в критической точности, даже за счет некоторой наихудшей сложности. Для этого типа приложений были разработаны алгоритмы, которые оптимизируют их вычисления для уменьшения или устранения катастрофических помех.
Таким образом, разработка алгоритма также может быть компромиссом между абстракцией и ограничениями.
В конце концов, мы можем сказать, что алгоритм такой же абстрактный, как и его цель, и его предварительные условия (архитектура) . Чем конкретнее цель, к которой стремится ваш алгоритм, тем больше он, вероятно, будет опираться на аппаратную архитектуру.
Некоторые похожие ключевые слова, которые могут вас заинтересовать: