Так і ні. Це залежить від обмежень, які ви хочете виконати, та передумов, необхідних для запуску алгоритму.
В ідеалі алгоритм - це абстрактний рецепт, який визначає поетапно, як щось робити. Алгоритми були визначені так з метою відтворюваності та подальшої автоматизації. Алгоритми походять від лямбда-числення, тому ви можете легко зрозуміти, чому вони зроблені таким чином. Це визначення є звичайним, але сучасні алгоритми можуть бути не послідовними (не крок за кроком, як паралельні алгоритми, або логічні, як ті, що використовують уніфікацію), нелінійними (стохастичні алгоритми) або просто дивними (квантовими алгоритми), але я пройду це.
Таким чином, в ідеалі алгоритм повинен бути максимально абстрактним без обліку будь-якого обладнання.
Але, як і в будь-якій системі, ви повинні визначити деякі аксіоми не тільки для отримання цілісної системи, але і для отримання часу. Наприклад, більшість алгоритмів припускають, принаймні неявно, що вони визначені на машині Фон-Неймана. Якщо цього не було, їм потрібно було б чітко визначити кожну частину системи, над якою потрібно працювати (оскільки це потрібно для відтворення рецепту, це певна передумова). Також часто алгоритми покладаються на загальні команди, такі як write (), не визначаючи їх повністю.
Ще одна причина, чому алгоритми не настільки абстрактні від апаратної архітектури, - це коли потрібно відповідати деяким обмеженням .
Скажімо, ви працюєте над вбудованими системами, то, ймовірно, ви не можете розраховувати на ту саму кількість ресурсів, яку маєте на робочих станціях. Один з найбільш стриманих ресурсів - це, мабуть, пам'ять. Однак більшість алгоритмів прагнуть оптимізувати часову складність (швидкість виконання на процесорі), а не складність пам'яті (обсяг пам'яті, необхідний для роботи над даними). Для цих систем були розроблені алгоритми, оптимізовані для пам’яті, де алгоритми, не оптимізовані для пам’яті, просто виходили б з ладу або працюватимуть значно повільніше. Насправді вбудовані системи не є єдиною ціллю алгоритмів ефективної пам’яті: наприклад, є кешовані алгоритми, які не захищені кешем, які пристосовують їх обробку для ефективного використання кешу CPU. Ще один приклад: деякі алгоритми машинного навчання для великих даних пристосовані дляінкрементальне навчання або непрофільні обчислення для обробки величезної кількості даних, значно більших, ніж пам'ять, наявна на будь-якому комп’ютері тощо.
Існують також алгоритми, які не оптимізують конкретну частину комп’ютера, а стандарт, який залежить від архітектури обладнання. Наприклад, числові дані, які потребують точності, зберігаються всередині поплавця або подвійних, які за своєю природою обмежені через апаратні обмеження. Проблема полягає в тому, що складні обчислення можуть призвести до округлення, і чим більше обчислень ви зробите за закругленими числами, тим більше ви будете збиватися. Це називається катастрофічним втручанням . Деякі програми потребують критичної точності, навіть ціною найгіршої складності. Для цього типу додатків були виготовлені алгоритми, які оптимізують їх розрахунок для зменшення або усунення катастрофічних перешкод.
Таким чином, проектування алгоритму також може бути компромісом між абстракцією та обмеженнями.
Зрештою, можна сказати, що алгоритм є настільки ж абстрактним, як і його цільовим, і настільки як його попередні (архітектурні) потреби . Чим конкретніше націлений ваш алгоритм, тим більше, ймовірно, буде покладатися на апаратну архітектуру.
Деякі пов’язані ключові слова, які можуть вас зацікавити: