Evet ve hayır. Bu , karşılamak istediğiniz kısıtlamalara ve algoritmanızı çalıştırmak için gereken ön koşullara bağlıdır .
İdeal olarak, algoritma bir şeyin nasıl yapılacağını adım adım tanımlayan soyut bir reçetedir . Algoritmalar, tekrarlanabilirlik ve daha sonra otomatikleştirme amacıyla bu şekilde tanımlanmıştır. Algoritmalar lambda-calcul kaynaklıdır, bu yüzden neden bu şekilde yapıldığını kolayca görebilirsiniz. Bu tanım olağan olanıdır, ancak modern algoritmalar sıralı olmayabilir (eşzamanlı algoritmalar gibi adım adım değil veya birleştirme kullananlara benzer mantıksal), doğrusal olmayan (stokastik algoritmalar) veya sadece garip (kuantum) olabilir algoritmalar), ancak bunu geçeceğim.
Dolayısıyla, ideal olarak, bir algoritma herhangi bir donanımı hesaba katmadan mümkün olduğunca soyut olmalıdır.
Ancak, herhangi bir sistemde olduğu gibi , sadece tutarlı bir sistem elde etmek için değil, aynı zamanda zaman kazanmak için de bazı aksiyomlar tanımlamanız gerekir . Örneğin, çoğu algoritma en azından örtük olarak bir Von-Neumann makinesinde tanımlandığını varsayar. Durum böyle değilse, çalıştırılması gereken sistemin her bir parçasını açıkça tanımlamaları gerekir (çünkü bu tarifi yeniden üretmek için gereklidir, bu bir tür önkoşuldur). Ayrıca, algoritmalar genellikle tam olarak tanımlanmadan write () gibi yaygın komutlara dayanır.
Algoritmaların donanım mimarisinden bu kadar soyut olmamasının bir başka nedeni de, bazı kısıtlamaları karşılamanız gerektiğidir .
Diyelim ki gömülü sistemler üzerinde çalışıyorsunuz, o zaman muhtemelen iş istasyonlarında sahip olduğunuz kaynakların miktarına güvenemezsiniz. En kısıtlı kaynaklardan biri muhtemelen bellektir. Bununla birlikte, çoğu algoritma bellek karmaşıklığını (veriler üzerinde çalışmak için gerekli bellek miktarı) değil, zaman karmaşıklığını (CPU üzerinde yürütme hızı) optimize etme eğilimindedir. Bu sistemler için, bellek için optimize edilmemiş algoritmaların başarısız olacağı veya çok daha yavaş çalışacağı yerlerde bellek için optimize edilmiş algoritmalar tasarlanmıştır. Aslında, gömülü sistemler bellek verimli algoritmaların tek hedefi değildir: örneğin, işlemlerini CPU önbelleğini verimli bir şekilde kullanacak şekilde uyarlayan önbelleksiz algoritmalar vardır. Başka bir örnek: büyük veriler için bazı makine öğrenme algoritmalarıherhangi bir bilgisayarda bulunan bellekten çok daha büyük miktarda veri işlemek için artımlı öğrenme veya çekirdek dışı hesaplama .
Bilgisayarın belirli bir bölümünü değil, donanım mimarisine bağlı olan bir standardı optimize eden algoritmalar da vardır. Örneğin, hassaslık gerektiren sayısal veriler, donanım sınırları nedeniyle doğası gereği sınırlı olan şamandıra veya çiftte saklanır. Sorun, karmaşık hesaplamaların yuvarlamaya yol açabileceğidir ve yuvarlanmış sayılar üzerinde ne kadar fazla hesap yaparsanız, o kadar fazla sürüklenirsiniz. Buna katastrofik müdahale denir . Bazı uygulamalar, en kötü karmaşıklık pahasına bile kritik bir hassasiyete ihtiyaç duyar. Bu tür uygulamalar için, felaket parazitini azaltmak veya kaldırmak için hesaplamalarını optimize eden algoritmalar yapılmıştır.
Dolayısıyla, bir algoritma tasarlamak aynı zamanda soyutlama ve kısıtlamalar arasında bir denge olabilir.
Sonunda, bir algoritmanın hedefi kadar soyut ve ön koşul (mimari) ihtiyacı kadar diyebiliriz . Algoritmanız ne kadar belirli bir hedef hedeflerse, muhtemelen donanım mimarisine o kadar çok güvenir.
İlginizi çekebilecek alakalı bazı anahtar kelimeler: