logo

Definicja, rodzaje, złożoność i przykłady algorytmów

Algorytm to dobrze zdefiniowana technika obliczeń sekwencyjnych, która przyjmuje wartość lub zbiór wartości jako dane wejściowe i generuje dane wyjściowe potrzebne do rozwiązania problemu.

Można też powiedzieć, że algorytm jest dokładny wtedy i tylko wtedy, gdy kończy się na właściwym wyjściu dla każdej instancji wejściowej.



POTRZEBA ALGORYTMÓW:

Algorytmy służą do rozwiązywania problemów lub automatyzacji zadań w sposób systematyczny i efektywny. Stanowią zestaw instrukcji lub reguł, które kierują komputerem lub oprogramowaniem w wykonywaniu określonego zadania lub rozwiązywaniu problemu.

wyrażenia lambda w Javie

Istnieje kilka powodów, dla których używamy algorytmów:



    Wydajność: Algorytmy mogą wykonywać zadania szybko i dokładnie, co czyni je niezbędnym narzędziem do zadań wymagających dużej liczby obliczeń lub przetwarzania danych. Spójność: Algorytmy są powtarzalne i dają spójne wyniki za każdym razem, gdy są wykonywane. Jest to ważne w przypadku dużych ilości danych lub skomplikowanych procesów. Skalowalność: Algorytmy można skalować w celu obsługi dużych zbiorów danych lub złożonych problemów, co czyni je przydatnymi w aplikacjach wymagających przetwarzania dużych ilości danych. Automatyzacja: Algorytmy mogą automatyzować powtarzalne zadania, zmniejszając potrzebę interwencji człowieka i uwalniając czas na inne zadania. Standaryzacja: Algorytmy można standaryzować i udostępniać różnym zespołom lub organizacjom, co ułatwia ludziom współpracę i dzielenie się wiedzą.

Ogólnie rzecz biorąc, algorytmy są niezbędnym narzędziem do rozwiązywania problemów w różnych dziedzinach, w tym w informatyce, inżynierii, analizie danych, finansach i wielu innych.

Przykład:

Weźmy pod uwagę pudełko, w którym nikt nie może zobaczyć, co dzieje się w środku, mówimy czarną skrzynkę.

Wprowadzamy dane wejściowe do skrzynki, a ona daje nam potrzebne dane wyjściowe, ale procedurą, którą możemy potrzebować za konwersją danych wejściowych na żądane wyjście, jest ALGORYTM.



Algorytm jest niezależny od używanego języka. Informuje programistę o logice użytej do rozwiązania problemu. Jest to zatem logiczna procedura krok po kroku, która działa jak plan dla programistów.

Przykłady z życia wzięte, które definiują zastosowanie algorytmów:

  • Weźmy pod uwagę zegar. Wiemy, że zegar tyka, ale w jaki sposób producent ustawia te nakrętki i śruby, aby poruszał się co 60 sekund, wskazówka min i co 60 minut wskazówka godzinowa? Aby rozwiązać ten problem, musi istnieć algorytm.
  • Widziałeś, jak ktoś gotuje dla Ciebie Twoje ulubione jedzenie? Czy przepis jest do tego niezbędny? Tak, jest to konieczne, ponieważ przepis to sekwencyjna procedura, która zamienia surowego ziemniaka w chłodnego ziemniaka. Oto czym jest algorytm: przestrzeganie procedury w celu uzyskania pożądanego wyniku. Czy konieczne jest przestrzeganie kolejności? Tak, kolejność jest najważniejszą rzeczą, której należy przestrzegać, aby uzyskać to, czego chcemy.

Rodzaje algorytmów:

  • Algorytmy sortowania: Sortowanie bąbelkowe, sortowanie przez wstawianie i wiele innych. Algorytmy te służą do sortowania danych w określonym formacie.
  • Algorytmy wyszukiwania: Wyszukiwanie liniowe, wyszukiwanie binarne itp. Algorytmy te służą do wyszukiwania wartości lub rekordu wymaganego przez użytkownika.
  • Algorytmy grafowe : Służy do znajdowania rozwiązań problemów, takich jak znalezienie najkrótszej ścieżki między miastami, oraz problemów z życia codziennego, takich jak problemy komiwojażera.

Algorytmy sortowania to algorytmy, które pobierają zbiór elementów i porządkują je w określonej kolejności (np. rosnąco lub malejąco). Istnieje wiele różnych algorytmów sortowania, każdy z nich ma swoje mocne i słabe strony. Do najczęściej używanych algorytmów sortowania należą:

Sortowanie bąbelkowe: Prosty algorytm sortowania, który wielokrotnie przegląda listę, porównuje sąsiednie elementy i zamienia je, jeśli są w niewłaściwej kolejności.

Sortowanie przez wstawianie: Prosty algorytm sortowania, który tworzy ostateczną posortowaną tablicę po jednym elemencie na raz, porównując każdy nowy element z elementami, które zostały już posortowane i wstawiając go we właściwym miejscu.

Sortowanie przez wybór: Prosty algorytm sortowania, który wielokrotnie wybiera minimalny element z nieposortowanej części tablicy i przenosi go na koniec posortowanej części.

Sortowanie przez scalanie: Algorytm sortowania typu „dziel i rządź”, który działa poprzez podzielenie nieposortowanej listy na n podlist, posortowanie każdej podlisty, a następnie ponowne połączenie ich w jedną posortowaną listę.

Szybkie sortowanie: Algorytm sortowania typu „dziel i zwyciężaj”, który polega na wybraniu elementu przestawnego z tablicy i podzieleniu pozostałych elementów na dwie podtablice, w zależności od tego, czy są one mniejsze, czy większe od elementu przestawnego. Podtablice są następnie sortowane rekurencyjnie.

Każdy z tych algorytmów ma inną złożoność czasową i przestrzenną, dzięki czemu niektóre z nich są bardziej odpowiednie dla określonych przypadków użycia niż inne.

Algorytmy wyszukiwania to algorytmy wyszukujące określony element lub wartość w strukturze danych (takiej jak tablica lub lista połączona). Do najczęściej używanych algorytmów wyszukiwania należą:

Wyszukiwanie liniowe: Prosty algorytm wyszukiwania, który iteruje po każdym elemencie listy, aż znajdzie dopasowanie.

Wyszukiwanie binarne: Algorytm wyszukiwania, który polega na wielokrotnym dzieleniu posortowanej listy na pół, aż do znalezienia żądanego elementu lub ustalenia, że ​​elementu nie ma.

Przeskocz wyszukiwanie: Algorytm wyszukiwania, który polega na przeskakiwaniu do przodu po ustalonych krokach na liście, aż do znalezienia odpowiedniego kandydata, a następnie przeprowadzaniu wyszukiwania liniowego w otaczających elementach.

Wyszukiwanie interpolacyjne : Algorytm wyszukiwania, który wykorzystuje informacje o zakresie wartości na liście w celu oszacowania położenia żądanego elementu, a następnie sprawdzenia, czy rzeczywiście on występuje.

Wyszukiwanie tabeli mieszającej: Algorytm wyszukiwania, który używa funkcji skrótu do mapowania elementów na indeksy w tablicy, a następnie wykonuje wyszukiwania w tablicy w czasie stałym w celu znalezienia żądanego elementu.

Każdy z tych algorytmów ma inną złożoność czasową i przestrzenną, dzięki czemu niektóre z nich są bardziej odpowiednie dla określonych przypadków użycia niż inne. Wybór algorytmu zależy od konkretnych wymagań problemu, takich jak rozmiar struktury danych, rozkład wartości i pożądana złożoność czasowa.

Algorytmy grafowe to zestaw algorytmów używanych do przetwarzania, analizowania i rozumienia struktur danych grafowych. Wykresy to struktury matematyczne używane do modelowania relacji między obiektami, gdzie obiekty są reprezentowane jako wierzchołki (lub węzły), a relacje między nimi są przedstawiane jako krawędzie. Algorytmy grafowe są wykorzystywane w różnych zastosowaniach, takich jak analiza sieci, analiza sieci społecznościowych, systemy rekomendacji i w wielu innych obszarach, w których ważne jest zrozumienie relacji między obiektami. Niektóre z typowych algorytmów grafowych obejmują:

Algorytmy najkrótszej ścieżki (np. Dijkstra, Bellman-Ford, A*)
Algorytmy minimalnego drzewa opinającego (np. Kruskal, Prim)
Algorytmy maksymalnego przepływu (np. Ford-Fulkerson, Edmonds-Karp)
Algorytmy przepływu sieci (np. dopasowanie dwustronne)
Algorytmy łączności (np. wyszukiwanie w głąb, wyszukiwanie wszerz)

Dlaczego używamy algorytmów?

Wyobraźmy sobie dwójkę dzieci, Amana i Rohana, układających kostkę Rubika. Aman wie, jak rozwiązać ten problem w określonej liczbie kroków. Z drugiej strony Rohan wie, że to zrobi, ale nie jest świadomy procedury. Aman ułożył kostkę w ciągu 2 minut, podczas gdy Rohan nadal utknął i pod koniec dnia jakimś cudem udało mu się ją ułożyć (mógł oszukać, bo procedura była konieczna).

ogólny błąd ochrony

Zatem czas potrzebny na rozwiązanie za pomocą procedury/algorytmu jest znacznie bardziej efektywny niż bez żadnej procedury. Dlatego algorytm jest koniecznością.

Jeśli chodzi o projektowanie rozwiązań problemów informatycznych, komputery są szybkie, ale nie nieskończenie szybkie. Pamięć może być niedroga, ale nie darmowa. Zatem czas obliczeniowy jest zasobem ograniczonym, podobnie jak przestrzeń w pamięci. Powinniśmy więc korzystać z tych zasobów mądrze, a algorytmy efektywne czasowo i przestrzennie Ci w tym pomogą.

Tworzenie algorytmu:

Ponieważ algorytm jest niezależny od języka, piszemy kroki, aby zademonstrować logikę rozwiązania, które należy zastosować do rozwiązania problemu. Zanim jednak napiszesz algorytm, pamiętaj o następujących kwestiach:

  • Algorytm powinien być jasny i jednoznaczny.
  • Algorytm powinien zawierać 0 lub więcej dobrze zdefiniowanych danych wejściowych.
  • Algorytm musi generować jeden lub więcej dobrze zdefiniowanych wyników, które są równoważne pożądanemu wyjściu. Po określonej liczbie kroków algorytmy muszą się zatrzymać.
  • Algorytmy musi się zatrzymać lub zakończyć po skończonej liczbie kroków.
  • W algorytmie należy podać instrukcje krok po kroku, które powinny być niezależne od jakiegokolwiek kodu komputerowego.

Przykład: algorytm mnożenia 2 liczb i drukowania wyniku:

Krok 1: Początek
Krok 2: Zdobądź wiedzę o wejściu. Tutaj potrzebujemy 3 zmiennych; a i b będą danymi wprowadzonymi przez użytkownika, a c będzie przechowywać wynik.
Krok 3: Zadeklaruj zmienne a, b, c.
Krok 4: Pobierz dane wejściowe dla zmiennej aib od użytkownika.
Krok 5: Poznaj problem i znajdź rozwiązanie, korzystając z operatorów, struktur danych i logiki

Musimy pomnożyć zmienne a i b, więc używamy operatora * i przypisujemy wynik do c.
To jest c <- a * b

Krok 6: Sprawdź, jak podać wynik. Tutaj musimy wydrukować wynik. Więc napisz drukuj c
Krok 7: Koniec

Przykład 1: Napisz algorytm, który znajdzie maksimum wszystkich elementów znajdujących się w tablicy.
Postępuj zgodnie z podejściem algorytmicznym jak poniżej:

Krok 1: Uruchom program
Krok 2: Zadeklaruj zmienną max z wartością pierwszego elementu tablicy.
Krok 3: Porównaj max z innymi elementami za pomocą pętli.
Krok 4: Jeśli maks Krok 5: Jeśli nie pozostał żaden element, zwróć lub wydrukuj max, w przeciwnym razie przejdź do kroku 3.
Krok 6: Koniec rozwiązania

Przykład 2: Napisz algorytm znajdujący średnią z 3 przedmiotów.
Postępuj zgodnie z podejściem algorytmicznym jak poniżej:

Krok 1: Uruchom program
Krok 2: Zadeklaruj i przeczytaj 3 Temat, powiedzmy S1, S2, S3
Krok 3: Oblicz sumę wszystkich 3 wartości podmiotu i zapisz wynik w zmiennej Suma (Suma = S1+S2+S3)
Krok 4: Podziel Sumę przez 3 i przypisz ją do zmiennej Średnia. (Średnia = Suma/3)
Krok 5: Wydrukuj wartość Średnia z 3 przedmiotów
Krok 6: Koniec rozwiązania

Wiedz o złożoności algorytmów:

Złożoność algorytmów odnosi się do ilości zasobów (takich jak czas lub pamięć) wymaganych do rozwiązania problemu lub wykonania zadania. Najpowszechniejszą miarą złożoności jest złożoność czasowa, która odnosi się do czasu potrzebnego algorytmowi na wygenerowanie wyniku jako funkcji wielkości danych wejściowych. Złożoność pamięci odnosi się do ilości pamięci wykorzystywanej przez algorytm. Projektanci algorytmów starają się opracowywać algorytmy o możliwie najniższej złożoności czasowej i pamięciowej, ponieważ dzięki temu są one bardziej wydajne i skalowalne.

Złożoność algorytmu to funkcja opisująca efektywność algorytmu pod względem ilości danych, które algorytm musi przetworzyć.

Zwykle istnieją jednostki naturalne dla dziedziny i zakresu tej funkcji.

Algorytm jest analizowany przy użyciu złożoności czasowej i złożoności przestrzennej. Napisanie wydajnego algorytmu pomaga pochłonąć minimalną ilość czasu na przetwarzanie logiki. W przypadku algorytmu A ocenia się go na podstawie dwóch parametrów dla danych wejściowych o rozmiarze n:

  • Złożoność czasowa: Czas potrzebny algorytmowi na rozwiązanie problemu. Mierzy się go poprzez obliczenie iteracji pętli, liczby porównań itp.
  • Złożoność czasowa to funkcja opisująca ilość czasu potrzebnego algorytmowi w kategoriach ilości danych wejściowych do algorytmu.
  • Czas może oznaczać liczbę wykonanych dostępów do pamięci, liczbę porównań między liczbami całkowitymi, liczbę wykonań jakiejś wewnętrznej pętli lub inną naturalną jednostkę związaną z ilością czasu rzeczywistego potrzebnego algorytmowi.
  • Złożoność przestrzeni: Przestrzeń zajmowana przez algorytm na rozwiązanie problemu. Obejmuje przestrzeń zajmowaną przez niezbędne zmienne wejściowe oraz dodatkową przestrzeń (z wyłączeniem przestrzeni zajmowanej przez dane wejściowe) wykorzystywaną przez algorytm. Przykładowo, jeśli korzystamy z tablicy mieszającej (rodzaj struktury danych), potrzebujemy tablicy do przechowywania wartości tzw
  • jest to zajęta dodatkowa przestrzeń, dlatego będzie wliczana do złożoności przestrzennej algorytmu. Ta dodatkowa przestrzeń nazywana jest przestrzenią pomocniczą.
  • Złożoność przestrzenna to funkcja opisująca ilość pamięci (przestrzeni) zajmowanej przez algorytm w kategoriach ilości danych wejściowych do algorytmu.
  • Złożoność przestrzeni jest czasami ignorowana, ponieważ wykorzystywana przestrzeń jest minimalna i/lub oczywista, ale czasami staje się problemem wraz z upływem czasu.

.Złożoność czasowa operacji:

ciąg wew
  • Wybór struktury danych powinien opierać się na złożoności czasowej operacji, które będą wykonywane.
  • Złożoność czasową definiuje się w kategoriach liczby uruchomień danego algorytmu na podstawie długości danych wejściowych.
  • Złożoność czasowa algorytmu to czas potrzebny na wykonanie każdej instrukcji. Zależy to w dużym stopniu od wielkości przetwarzanych danych.
  • Na przykład, jeśli musisz często przeprowadzać wyszukiwania, powinieneś użyć drzewa wyszukiwania binarnego.

.Złożoność przestrzenna operacji:

  • Wybór struktury danych powinien opierać się na złożoności przestrzennej operacji, które będą wykonywane.
  • Ilość pamięci używanej przez program do jego wykonania jest reprezentowana przez jego złożoność przestrzenną.
  • Ponieważ program wymaga pamięci do przechowywania danych wejściowych i wartości tymczasowych podczas działania, złożoność przestrzeni to przestrzeń pomocnicza i wejściowa.
  • Na przykład, jeśli chcesz przechowywać dużo danych, powinieneś użyć tablicy.

przypadki złożoności:

Istnieją dwa powszechnie badane przypadki złożoności algorytmów:

1. Najlepsza złożoność przypadku: Najlepszy scenariusz dla algorytmu to scenariusz, w którym algorytm wykonuje minimalną ilość pracy (np. zajmuje najkrótszą ilość czasu, zużywa najmniej pamięci itp.).

2. Złożoność najgorszego przypadku: Najgorszym scenariuszem dla algorytmu jest scenariusz, w którym algorytm wykonuje maksymalną ilość pracy (np. zajmuje najwięcej czasu, zużywa najwięcej pamięci itp.).

Analizując złożoność algorytmu, często bardziej pouczające jest zbadanie najgorszego scenariusza, ponieważ daje to gwarancję górnej granicy wydajności algorytmu. Czasami przeprowadza się analizę najlepszego scenariusza, ale generalnie jest ona mniej ważna, ponieważ zapewnia dolną granicę, której osiągnięcie jest często trywialne.

Zalety algorytmów

  • Łatwy do zrozumienia: Ponieważ jest to etapowa reprezentacja rozwiązania danego problemu, jest łatwa do zrozumienia.
  • Niezależny od języka: Nie jest zależny od żadnego języka programowania, dlatego może być z łatwością zrozumiały dla każdego.
  • Debugowanie / znajdowanie błędów: Każdy krok jest niezależny / przebiega w sposób ciągły, więc łatwo będzie wykryć i naprawić błąd.
  • Podproblemy: Jest napisany w sposób przepływowy, dzięki czemu programista może teraz podzielić zadania, co ułatwia ich kodowanie.

Wady algorytmów

  • Tworzenie wydajnych algorytmów jest czasochłonne i wymaga dobrych umiejętności logicznych.
  • Paskudne jest pokazywanie rozgałęzień i pętli w algorytmach.