Jaki jest związek między strukturami danych a algorytmami? [Zamknięte]

13

Szukałem dobrego kursu online w strukturach danych, ale odkryłem, że Google zwraca również wyniki kursów z algorytmów, które mówią:

Na tym kursie poznasz kilka podstawowych zasad projektowania algorytmów: metody dziel i zwyciężaj, algorytmy graficzne, praktyczne struktury danych (sterty, tabele skrótów, drzewa wyszukiwania) , algorytmy losowe i inne. [źródło]

i

Pod koniec tej klasy zrozumiesz kluczowe pojęcia potrzebne do opracowania nowych algorytmów dla wykresów i innych ważnych struktur danych oraz do oceny wydajności tych algorytmów. [źródło]

i

Kurs stanowi wprowadzenie do modelowania matematycznego problemów obliczeniowych. Obejmuje typowe algorytmy, paradygmaty algorytmiczne i struktury danych stosowane do rozwiązywania tych problemów . [źródło]

Moje pytanie brzmi: czy algorytmy i struktury danych są ze sobą ściśle powiązane, co oznacza, że ​​należy je rozumieć razem, czy też jeden temat jest bardziej fundamentalny niż drugi?

EDYCJA: Aby głosujący mogli zamknąć to pytanie, czy możesz mi powiedzieć, dlaczego i jak je poprawić? Nauka zadawania właściwych pytań jest częścią procesu edukacyjnego.

gwg
źródło
17
Struktura danych jest statyczna i nie może nic zrobić. Algorytm to tylko zestaw instrukcji do wykonania na niektórych danych. Bez jednego drugi jest bezużyteczny. Razem tworzą programy komputerowe. Oba są fundamentalne.
Phoshi
2
@Phoshi Wrong. Struktura danych jest ściśle związana z algorytmami manipulującymi danymi. Tak ściśle powiązane te algorytmy są uważane za część struktury danych. Na przykład struktura danych Lined List informuje, w jaki sposób dane są zapisywane, a także w jaki sposób dane są odczytywane i przetwarzane.
Euforyczny
7
@Euphoric Twierdzę, że błędem jest twierdzenie, że algorytmy są częścią struktury danych. Istnieje kilka sposobów implementacji wyszukiwania binarnego: możesz na przykład przeprowadzić if less than recurse to the left; if greater than, recurse to the right; if equal, returnwyszukiwanie naiwne lub nieco bardziej wyrafinowane if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Mają nieco różną liczbę porównań. Obie są jedną z wielu rzeczy, które możesz zrobić z drzewem.
Doval
4
@Euphoric Mylisz strukturę danych z abstrakcyjnym typem danych, który implementuje kombinacja struktury danych i algorytmów.
Doval
7
@Euphoric, muszę się nie zgodzić. sortowanie po scaleniu jest algorytmem. Tablica jest strukturą danych. Połączona lista ma inną strukturę danych. Mogę napisać implementację MergeSort do działania na obu. Niektóre struktury danych mogą być bardziej naturalne lub bardziej wydajne dla konkretnego algorytmu, ale rzadko jest to bezwzględne wymaganie (do implementacji sortowania stosów trzeba mieć stertę). Nicholas Wirth napisał w latach 80. popularny podręcznik zatytułowany: „Algorytmy + struktury danych = programy”
Charles E. Grant

Odpowiedzi:

20

Istnieją różne rodzaje mieszanin. Masz struktury danych, które nie są powiązane z algorytmami, algorytmy, które nie wymagają (rzeczywistych) struktur danych, ale najczęściej oba są w jednym pakiecie.

Edycja: jak słusznie wskazano @Doval, struktury danych same w sobie nie są powiązane z żadnymi operacjami. Akt łączenia struktury danych i algorytmu tworzy abstrakcyjny typ danych.

Struktury danych bez algorytmów

Rozważmy na przykład strukturę danych do przechowywania współrzędnych dwuwymiarowych, odpowiednio nazwaną Point. Algorytmy nie mają wiele do zrobienia dla punktu, a tak naprawdę to tylko kontener dla wartości xi y. Oczywiście, nadając tę ​​strukturę danych, możesz teraz dodawać do niej wszelkiego rodzaju algorytmy (obliczanie odległości, wypukłe kadłuby, co masz).

Możesz pomyśleć o wielu strukturach danych, które są po prostu nagromadzeniem pojedynczych danych. Chociaż występują one często w praktyce, nie stanowią dobrego materiału dydaktycznego, ponieważ nie można się z nich niczego nauczyć, po zrozumieniu, że pojedyncze elementy danych można akumulować w nową strukturę danych (np. Czego się uczysz po powyższym Pointprzykładzie, jeśli dostarczę ci tę niesamowitą strukturę danych Point3D, która może zrobić to samo w przypadku przestrzeni trójwymiarowej?)

Algorytmy bez (rzeczywistych) struktur danych

„Rzeczywisty”, ponieważ oczywiście każdy interesujący algorytm potrzebuje prymitywnych typów danych, takich jak liczby całkowite lub logiczne, i nie chcemy uwzględniać ich jako struktur danych w tym kontekście. Podobnie jak powyżej, algorytmy te są zazwyczaj dość proste. W szczególności nie mają one żadnego skomplikowanego stanu, ponieważ zwykle wchodzi w strukturę danych (patrz następny rozdział).

Przykładem takiego algorytmu może być obliczenie największego wspólnego dzielnika dwóch liczb. Algorytmy Euklid dla gcd naprawdę potrzebują tylko dwóch liczb całkowitych i manipulują nimi.

Gdy sprawy stają się coraz bardziej interesujące, bardzo szybko wkraczasz w świat abstrakcyjnych typów danych. Na przykład sito Eratostenesa opiera się na tablicy. Moglibyśmy teraz porozmawiać, czy tablica nadal jest prymitywna, czy w rzeczywistości możesz porozmawiać, jeśli liczba całkowita nie jest już strukturą danych. Tak czy inaczej, algorytmy, które istnieją całkowicie bez struktur danych, są nudne, nawet jeśli zaakceptujesz ich izolowane istnienie.

Algorytmy połączone ze strukturami danych, czyli abstrakcyjne typy danych

Teraz są to interesujące, ale z dwóch bardzo różnych powodów. Zazwyczaj można do nich podejść z dwóch kierunków: najpierw struktury danych lub najpierw algorytmu.

Podczas gdy abstrakcyjny typ danych jest definiowany przez kombinację struktury danych + algorytmy / operacje, często oglądamy je, koncentrując się na jednym z nich, i uważamy drugi za czynnik umożliwiający.

Struktura danych, a następnie algorytm

Spotkasz abstrakcyjne typy danych, które są raczej proste w użyciu, ale wymagają mniej lub bardziej skomplikowanych algorytmów, aby działały wewnętrznie. Na przykład, a HashMapjest trywialny w użyciu, ale wymaga sprytnej funkcji skrótu i ​​radzenia sobie z kolizjami skrótu wewnątrz. Jednak z twojego punktu widzenia jako użytkownika zależy Ci na tym, że jest to coś, co przechowuje dane dla Ciebie, a nie coś, co coś dla Ciebie robi.

W przeciwieństwie do ostatniej grupy poniżej, te struktury danych nie narażają użytkowników na te algorytmy. Nie musisz wiedzieć ani przejmować się HashMapwewnętrzną funkcją skrótu, aby móc z niej korzystać. (Aby jednak efektywnie z niego korzystać, możesz chcieć poznać te rzeczy;)

Algorytm, a następnie struktura danych

Drugi kierunek oznacza, że ​​masz algorytm, którego chcesz po prostu użyć, ale który potrzebuje wewnętrznych struktur danych, aby działał zgodnie z przeznaczeniem. Przykładem może być algorytm partycjonowania przestrzeni binarnej (BSP), który można po prostu poprosić o dwuwymiarowy Pointz dużego zestawu punktów najbliższego danemu punktowi zapytania. Jednak potrzebujesz struktury drzewa (a nawet dodatkowych algorytmów, takich jak obliczanie odległości) od wewnątrz, aby faktycznie napisać algorytm.

Ogólnie można powiedzieć, że algorytmy w tej grupie wykorzystują struktury danych do reprezentacji ich stanu wewnętrznego. Twierdziłbym, że ta grupa algorytmów jest najbardziej różnorodna i znajdziesz wiele różnych, które pasują do tego ogólnego schematu. Jeśli chodzi o punkt widzenia, uważamy je za interesujące, ponieważ robią dla nas coś (np. Sortowanie) i nie dbają tak bardzo o część przechowującą dane.

Ściśle powiązane struktury danych i algorytmy

Wreszcie, masz struktury danych, które są bardzo blisko związane z algorytmami, które bezpośrednio z nimi odpowiadają. Typowym przykładem jest drzewo binarne, które, gdy chcesz zrobić z nim coś sensownego, wymusza na tobie temat algorytmów chodzenia po drzewie (najpierw głębokość, najpierw szerokość, cokolwiek).

W takich przypadkach co jakiś czas zmieniamy skupienie naszego widoku na wynikowe abstrakcyjne typy danych. Czasami zależy Ci na strukturze drzewa, kilka minut później zależy Ci na możliwości uruchomienia operacji wyszukiwania, potem zastanawiasz się nad usunięciem węzła i od razu widać, jak potem wygląda struktura. Chociaż wszystko to obowiązuje również w innych sekcjach powyżej, nie jest to coś, na czym koncentruje się twój umysł, na przykład, gdy przechowujesz / odzyskujesz dane do / z Maplub sortujesz połączoną listę.

Szczery
źródło
1
Łączymy struktury danych i abstrakcyjne typy danych. Struktura danych nic nie robi . Nie ma sensu mówić „napotkasz struktury danych, które są raczej proste w użyciu”, ponieważ struktura danych jest tylko strukturą. A Mapjest abstrakcyjnym typem danych, który może być zaimplementowany przy użyciu określonej struktury danych i zestawu algorytmów, które dają pożądane wyniki poprzez przemierzanie i manipulowanie strukturą. Struktura danych nie ukrywa algorytmów, ponieważ nie ma żadnych; abstrakcyjny typ danych ukrywa strukturę danych (co czyni ją abstrakcyjną.)
Doval
Zauważ, że w pewnym sensie algorytmy są zawsze ukryte, ponieważ nie ma sposobu na sprawdzenie funkcji. Prawdopodobnie dlatego są nazywane abstrakcjami w rachunku lambda (którego jedynym typem danych są funkcje).
Doval
2
Masz rację. Niemniej jednak widzę różnicę między tym, jak postrzegamy różne ADT. Zredagowałem moją odpowiedź i mam nadzieję, że jest teraz jaśniejsza i nie łączy już struktury z ADT, jednocześnie podkreślając, że możesz skupić się na strukturze i / lub operacjach dla dowolnego ADT.
Frank
Czy naprawdę zbyt łatwo jest powiedzieć, że struktury danych to rzeczowniki, a algorytmy to czasowniki? Przypuszczam, że można powiedzieć, że algorytm jest realizacja czasownika, ale nadal szukać na drzewo , nawet jeśli wyszukiwania jest wyszukiwanie binarne. Mówiąc to, przegapiłbyś wszystkie szczegóły techniczne, ale ma pewną elegancję.
Mag
@Doval: Nawet jeśli struktura danych, która po prostu składa się z szeregu liczb w tablicy, które są wymagane do utrzymywania i utrzymywania relacji między sobą, coś takiego może być „łatwe w użyciu”, jeśli łatwo jest utrzymać wymagane niezmienniki podczas robienia tego, co się chce lub „trudnego w użyciu”, jeśli jest to trudne.
supercat
5

Struktury danych często wpływają na szczegóły algorytmu. Z tego powodu często idą w parze.

Rozważ na przykład algorytm koszenia trawnika. Rzeczywista struktura trawnika może mieć wpływ na sposób, w jaki kosisz trawnik. Jeśli mieszkasz w małym domu na gęsto zabudowanym przedmieściu, a Twój trawnik jest tylko małym prostokątem o powierzchni kilku metrów kwadratowych, prawdopodobnie wolisz kosić trawnik za pomocą kosiarki zamiast traktora / kosiarki. Jeśli Twój trawnik obejmuje wiele akrów płaskiej łąki, możesz preferować kosiarkę jeżdżącą, a nie kosiarkę pchającą (chociaż każda kosiarka może ostatecznie wykonać pracę). Jeśli Twój trawnik obejmuje akry ziemi z dużymi płaskimi obszarami, ale z kilkoma małymi wzgórzami i wieloma drzewami, możesz opracować bardziej interesujący algorytm cięcia trawnika, który obejmuje zarówno kosiarkę jeżdżącą, jak i kosiarkę pchającą lub inną trawę techniki cięcia.

Ostatecznie jednak struktura danych może mieć znaczący wpływ na decyzje dotyczące sposobu opracowania algorytmu (lub algorytmów, które należy zastosować). Z tego powodu te dwa tematy często idą w parze.

I odwrotnie: czasami algorytm, który chcemy zastosować, wpływa (przynajmniej na początku obliczeń) na struktury danych opracowane w celu obsługi algorytmu. Na przykład przejście od listy tablic do pomysłu listy połączonej i ostatecznie do BST do przechowywania uporządkowanej listy, która pozwoli na szybkie znalezienie.

YoungJohn
źródło