Iya dan tidak. Itu tergantung pada kendala yang ingin Anda temui dan prasyarat yang diperlukan untuk menjalankan algoritma Anda.
Idealnya, suatu algoritma adalah resep abstrak yang mendefinisikan langkah-demi-langkah bagaimana melakukan sesuatu. Algoritma didefinisikan seperti itu dengan tujuan reproduktifitas, dan otomatisasi kemudian. Algoritma berasal dari perhitungan lambda, sehingga Anda dapat dengan mudah melihat mengapa mereka dibuat sedemikian rupa. Definisi ini adalah yang biasa, tetapi algoritma modern dapat non-sekuensial (bukan langkah-demi-langkah, seperti algoritma bersamaan, atau yang logis seperti yang menggunakan penyatuan), non-linear (algoritme stokastik) atau sekadar aneh (kuantum) algoritma), tapi saya akan melewati itu.
Jadi, idealnya, suatu algoritma harus seabstrak mungkin tanpa memperhitungkan perangkat keras apa pun.
Tetapi, seperti halnya sistem apa pun, Anda harus mendefinisikan beberapa aksioma , tidak hanya untuk mendapatkan sistem yang koheren, tetapi juga untuk mendapatkan waktu. Sebagai contoh, sebagian besar algoritma menganggap, paling tidak secara implisit, bahwa mereka didefinisikan pada mesin Von-Neumann. Jika bukan itu masalahnya, mereka perlu mendefinisikan secara eksplisit setiap bagian dari sistem yang mereka perlukan untuk dijalankan (karena ini diperlukan untuk mereproduksi resep, ini semacam prasyarat). Juga, seringkali algoritma bergantung pada perintah umum seperti write () tanpa mendefinisikannya sepenuhnya.
Alasan lain mengapa algoritma tidak begitu abstrak dari arsitektur perangkat keras, adalah ketika Anda perlu memenuhi beberapa kendala .
Katakanlah Anda bekerja pada sistem embedded, maka mungkin Anda tidak dapat mengandalkan jumlah sumber daya yang sama dengan yang Anda miliki di workstation. Salah satu sumber daya yang paling terkendali mungkin memori. Namun, sebagian besar algoritma cenderung mengoptimalkan kompleksitas waktu (kecepatan eksekusi pada CPU), bukan kompleksitas memori (jumlah memori yang diperlukan untuk mengerjakan data). Untuk sistem ini, algoritma yang dioptimalkan memori telah dirancang di mana algoritma yang dioptimalkan non-memori hanya akan gagal atau berjalan jauh lebih lambat. Faktanya, embedded system bukan satu-satunya target dari algoritma memory efisien: misalnya, ada algoritma cache-oblivious yang mengadaptasi pemrosesan mereka untuk secara efisien menggunakan cache CPU. Contoh lain: beberapa algoritma pembelajaran mesin untuk data besar dirancang untukpembelajaran tambahan atau komputasi out-of-core untuk memproses sejumlah besar data yang jauh lebih besar daripada memori yang tersedia di komputer mana pun, dll.
Ada juga algoritma yang tidak mengoptimalkan bagian tertentu dari komputer, tetapi standar yang bergantung pada arsitektur perangkat keras. Sebagai contoh, data numerik yang membutuhkan ketelitian disimpan di dalam float atau double, yang pada dasarnya terbatas karena batasan perangkat keras. Masalahnya adalah bahwa perhitungan yang rumit dapat menyebabkan pembulatan, dan semakin banyak perhitungan yang Anda lakukan terhadap angka bulat, semakin banyak Anda akan tertidur. Ini disebut gangguan katastropik . Beberapa aplikasi memerlukan ketepatan kritis, bahkan dengan mengorbankan beberapa kompleksitas terburuk. Untuk jenis aplikasi ini, algoritma yang mengoptimalkan perhitungannya untuk mengurangi atau menghilangkan gangguan katastropik telah dibuat.
Dengan demikian, merancang algoritma juga bisa menjadi trade-off antara abstraksi dan kendala.
Pada akhirnya, kita dapat mengatakan bahwa suatu algoritma adalah abstrak seperti targetnya, dan sebagai kebutuhan (arsitektur) prasyaratnya . Semakin spesifik target yang dituju oleh algoritma Anda, semakin besar kemungkinannya akan bergantung pada arsitektur perangkat keras.
Beberapa kata kunci terkait yang mungkin menarik bagi Anda: