Tak i nie. Zależy to od ograniczeń, które chcesz spełnić, i warunków koniecznych do uruchomienia twojego algorytmu.
Idealnie, algorytm to abstrakcyjny przepis, który definiuje krok po kroku, jak coś zrobić. Algorytmy zdefiniowano w taki sposób w celu zapewnienia odtwarzalności, a następnie automatyzacji. Algorytmy wywodzą się z obliczeń lambda, dzięki czemu można łatwo zrozumieć, dlaczego zostały wykonane w taki sposób. Ta definicja jest zwykła, ale współczesne algorytmy mogą być niesekwencyjne (nie krok po kroku, jak algorytmy współbieżne lub logiczne, takie jak te wykorzystujące unifikację), nieliniowe (algorytmy stochastyczne) lub po prostu dziwne (kwantowe algorytmy), ale przekażę to.
Idealnie więc algorytm powinien być tak abstrakcyjny, jak to możliwe, bez księgowania jakiegokolwiek sprzętu.
Ale, jak w przypadku każdego systemu, musisz zdefiniować niektóre aksjomaty , nie tylko w celu uzyskania spójnego systemu, ale także w celu uzyskania czasu. Na przykład większość algorytmów zakłada, przynajmniej domyślnie, że są one zdefiniowane na maszynie Von-Neumann. Gdyby tak nie było, musieliby jednoznacznie zdefiniować każdą część systemu, na której mają być uruchomione (ponieważ jest to wymagane do odtworzenia przepisu, jest to rodzaj warunku wstępnego). Ponadto często algorytmy opierają się na popularnych poleceniach, takich jak write (), bez ich pełnego zdefiniowania.
Innym powodem, dla którego algorytmy nie są tak abstrakcyjne w stosunku do architektury sprzętowej, jest konieczność spełnienia pewnych ograniczeń .
Załóżmy, że pracujesz na systemach wbudowanych, więc prawdopodobnie nie możesz polegać na takiej samej ilości zasobów, jaką masz na stacjach roboczych. Jednym z najbardziej powściągliwych zasobów jest prawdopodobnie pamięć. Jednak większość algorytmów ma tendencję do optymalizacji złożoności czasowej (szybkości wykonywania na procesorze), a nie złożoności pamięci (ilość pamięci niezbędnej do pracy na danych). Dla tych systemów opracowano algorytmy zoptymalizowane pod kątem pamięci, w których algorytmy niezoptymalizowane pod kątem pamięci po prostu zawiodłyby lub działałyby znacznie wolniej. W rzeczywistości systemy wbudowane nie są jedynym celem algorytmów efektywnych pod względem pamięci: na przykład istnieją algorytmy nieobsługujące pamięci podręcznej, które dostosowują swoje przetwarzanie do efektywnego wykorzystania pamięci podręcznej procesora. Kolejny przykład: niektóre algorytmy uczenia maszynowego dla dużych zbiorów danych są dostosowanenauka przyrostowa lub przetwarzanie poza rdzeniem w celu przetwarzania ogromnej ilości danych znacznie większych niż pamięć dostępna na dowolnym komputerze itp.
Istnieją również algorytmy, które nie optymalizują określonej części komputera, ale standard zależny od architektury sprzętowej. Na przykład dane liczbowe wymagające precyzji są przechowywane w liczbach zmiennoprzecinkowych lub podwójnych, które z natury są ograniczone ze względu na ograniczenia sprzętowe. Problem polega na tym, że złożone obliczenia mogą prowadzić do zaokrąglania, a im więcej obliczeń wykonasz na zaokrąglonych liczbach, tym bardziej będziesz odpływał. Nazywa się to katastrofalną ingerencją . Niektóre aplikacje wymagają krytycznej precyzji, nawet kosztem najgorszej złożoności. Dla tego typu aplikacji opracowano algorytmy optymalizujące ich obliczenia w celu zmniejszenia lub usunięcia katastrofalnych zakłóceń.
Zatem projektowanie algorytmu może być również kompromisem między abstrakcją a ograniczeniami.
Na koniec możemy powiedzieć, że algorytm jest tak abstrakcyjny, jak jego cel i jak wymaga tego jego warunek wstępny (architektura) . Im bardziej konkretny cel ma algorytm, tym bardziej prawdopodobnie będzie on polegał na architekturze sprzętowej.
Niektóre powiązane słowa kluczowe, które mogą Cię zainteresować: