Algorytm to ciąg instrukcji, które są wykonywane w określonej kolejności w celu rozwiązania problemu lub ukończenia pracy. Funkcja to blok kodu, który można wywołać i wykonać z innych części programu.
Zestaw instrukcji dotyczących rozwiązania problemu lub wykonania określonej czynności. W informatyce algorytmy są wykorzystywane do szerokiego zakresu operacji, od podstawowych obliczeń matematycznych po skomplikowane przetwarzanie danych.
Jednym z powszechnych algorytmów używanych w C jest algorytm sortowania. Algorytm sortowania porządkuje kolekcję elementów w określonej kolejności, na przykład liczbowej lub alfabetycznej.
Istnieje wiele algorytmów sortowania, każdy ma zalety i wady. Najpopularniejszymi algorytmami sortowania w C są szybkie sortowanie, scalanie i sortowanie.
Jedną z kluczowych cech języka C jest obsługa wskaźników. Umożliwia to efektywną manipulację strukturami danych, takimi jak tablice, kolejki itp. Dzięki temu nadaje się do implementowania algorytmów wymagających złożonej manipulacji danymi, takich jak sortowanie i wyszukiwanie algorytmiczne.
Jednym ze znanych przykładów biblioteki oprogramowania zaimplementowanej w C jest Standard Template Library (STL). Biblioteka ta zapewnia szeroką gamę algorytmów do zadań takich jak sortowanie, wyszukiwanie i manipulowanie strukturami danych.
Cechy algorytmu
Definiuje kilka ważnych cech algorytmu, m.in.:
Analiza algorytmów
Analiza algorytmiczna to proces oceny wydajności algorytmu pod względem wydajności, złożoności i innych kryteriów. Zwykle ma to na celu ocenę wielu algorytmów i wybranie optymalnego rozwiązania dla określonego problemu lub oprogramowania.
Analiza algorytmów zwykle polega na pomiarze ich złożoności czasowej i przestrzennej.
Podobnie jak w przypadku złożoności przestrzennej, która opisuje ilość potrzebnej pamięci lub miejsca na dysku, złożoność czasowa opisuje, jak długo algorytm określa wykonanie zadania.
odlany w sql
Istnieją różne sposoby analizowania złożoności czasowej algorytmów, takie jak notacja Big O i Omega. Symbol Omega zapewnia górną granicę złożoności czasowej algorytmu, podczas gdy symbol Omega zapewnia dolną granicę.
Oprócz pomiaru złożoności czasowej i przestrzennej analiza algorytmów uwzględnia także inne kryteria, takie jak stabilność, równoległość i skalowalność.
Obejmują dwa rodzaje analiz.
oni są:-
- Analiza wstępna.
- Analiza późniejsza.
Analiza wstępna
Prior to metoda analizy algorytmów, która koncentruje się na szacowaniu wydajności algorytmu na podstawie jego właściwości matematycznych bez faktycznego wykonywania algorytmu.
Takie podejście pozwala analizować złożoność czasową i przestrzenną algorytmów oraz innych metryk bez konieczności implementowania i uruchamiania algorytmów.
Analiza późniejsza
Z drugiej strony analiza a posteriori jest metodą analizy algorytmu, która faktycznie wykonuje algorytm i mierzy jego wydajność.
Takie podejście zapewnia dokładniejsze i bardziej szczegółowe informacje o działaniu algorytmu, ale wymaga implementacji i wykonania algorytmu.
Złożoność algorytmu
Złożoność algorytmiczna jest miarą mierzącą efektywność i wydajność algorytmu. Algorytmy są zwykle oceniane pod kątem czasu i przestrzeni potrzebnej do rozwiązania problemu lub osiągnięcia określonego celu.
Na złożoność algorytmu wpływają dwa czynniki.
oni są:-
- Czynnik czasu.
- Czynnik przestrzenny.
Czynnik czasu
- Czas potrzebny algorytmowi na wykonanie zadania nazywany jest złożonością czasową. Zwykle mierzy się go liczbą operacji lub kroków, które algorytm musi wykonać, aby rozwiązać problem.
- Złożoność czasowa algorytmu jest ważna, ponieważ określa, ile czasu zajmie wykonanie i może mieć znaczący wpływ na wydajność programu i systemu.
- Złożoność czasową algorytmu można wyrazić za pomocą notacji Big O, sposobu wyrażania górnej granicy złożoności czasowej algorytmu.
- Algorytm o złożoności czasowej O(n) oznacza, że czas potrzebny na wykonanie algorytmu jest wprost proporcjonalny do rozmiaru danych wejściowych (n).
- Inne powszechne złożoności czasowe to złożoność kwadratowa O(n^2) i złożoność logarytmiczna O(log n).
Analiza przestrzeni
- Z drugiej strony złożoność przestrzeni odnosi się do ilości pamięci lub miejsca potrzebnego do wykonania algorytmu.
- Jest to ważne, ponieważ określa liczbę zasobów wymaganych do uruchomienia algorytmów, które mogą mieć wpływ na ogólną wydajność aplikacji lub systemu.
- Jeśli złożoność przestrzenna algorytmu wynosi O(n), wykorzystuje on ilość pamięci, która rośnie liniowo wraz z rozmiarem danych wejściowych.
- Jeśli algorytm ma złożoność przestrzenną O(1), wykorzystuje stałą ilość pamięci niezależnie od rozmiaru danych wejściowych.
Jak napisać algorytm
1. Najpierw zdefiniuj problem, który ma rozwiązać algorytm.
Załóżmy na przykład, że chcemy napisać algorytm znajdujący maksymalną wartość z listy liczb.
co to jest maven
2. Podziel problem na mniejsze, łatwe do wykonania kroki.
- Zainicjuj zmienną „max” pierwszą wartością na liście.
- Dla każdej kolejnej wartości na liście porównaj z „max”.
- Jeśli wartość jest większa niż „max”, ustaw „max” na tę wartość.
- Kontynuuj tę czynność, aż wszystkie wartości na liście zostaną porównane.
- Zwraca końcową wartość „maks.”.
3. Zapisz swój algorytm w pseudokodzie lub języku programowania.
Algorytm napisany w pseudokodzie:
MAX (list) max = list[0] For i = 1 the length of the list list IF[i] > max max = list[i] End for Maximum return Maximum end
4. Przetestuj swój algorytm, aby upewnić się, że jest poprawny i wydajny.
Możesz przetestować algorytm, wprowadzając różne listy liczb i sprawdzając, czy zwraca maksymalną poprawną wartość. Możesz także przeanalizować złożoność czasową algorytmu, aby określić, jak dobrze skaluje się on w przypadku większych danych wejściowych.
Przykład:-
Wejście: [1, 5, 2, 7, 3]
Wyjście: 7.
Objaśnienie: 7 to maksymalna wartość na liście.
5. Zoptymalizuj algorytm.
Poszukaj sposobów optymalizacji algorytmów, aby uczynić je szybszymi i wydajniejszymi. Może to obejmować modyfikację pseudokodu lub wdrożenie bardziej wydajnych struktur danych lub algorytmów.
Podstawy pisania algorytmów
Przykład: - Suma dwóch liczb całkowitych.
Krok 1 - Zaczynaj
Krok 2 - Zadeklaruj trzy liczby całkowite a, b, c
Krok 3 - Zdefiniuj wartości a i b
Krok 4 - Dodaj wartości a i b
Krok 5 - Zapisz wynik kroku 4 w c
obramowanie CSS
Krok 6 - Drukuj c
Krok 7 - Zatrzymywać się
Rodzaje algorytmów używanych w języku C.
1. Algorytmy sortowania
C zapewnia bogaty zestaw typów danych i operatorów, których można używać do implementowania różnych algorytmów sortowania, takich jak sortowanie bąbelkowe, sortowanie przez wstawianie i sortowanie szybkie.
Algorytmy te są przydatne w wielu zastosowaniach, ponieważ można ich używać do sortowania danych o różnych rozmiarach i typach.
Istnieją różne algorytmy sortowania.
oni są:-
(i) Sortowanie bąbelkowe: Nieskomplikowany algorytm sortowania, który wielokrotnie porównuje pobliskie komponenty i wyłącza je, jeśli są niesprawne.
Algorytm sortowania bąbelkowego to: -
- Zacznij od nieposortowanej listy elementów.
- Porównaj dwa pierwsze elementy na liście. Jeśli pierwszy element jest większy niż drugi, zamień je.
- Przejdź do kolejnej pary elementów i powtarzaj krok 2 aż do końca listy.
- Dla każdej pozycji na liście powtórz jeszcze raz kroki 2 i 3. nazywa się to przepustkami.
- Powtórz kroki 2-4 dla całej listy. W miarę powtarzania przebiegów elementy będą „bąbelkować” i zajmą właściwe pozycje na posortowanej liście.
- Po zakończeniu przebiegu i braku zamiany lista jest sortowana, a algorytm może zostać zatrzymany.
- Zwracana jest ostateczna posortowana lista.
(ii) Sortowanie przez wstawianie : metoda sortowania, która tworzy posortowaną listę po jednym pojedynczym elemencie na raz, umieszczając każdy z nich w odpowiednim miejscu.
Algorytm sortowania przez wstawianie to: -
- Zainicjuj pustą posortowaną listę i nieposortowaną listę elementów do sortowania.
- Należy wybrać pierwszego członka z listy nieposortowanej i umieścić go na odpowiedniej pozycji na liście posortowanej.
- Powtórz krok 2 dla każdego kolejnego elementu na nieposortowanej liście.
- Porównaj bieżący element z elementami na posortowanej liście, zaczynając od elementu znajdującego się bezpośrednio po lewej stronie.
- Zamień dwa elementy, jeśli bieżący element jest mniejszy niż element po jego lewej stronie.
- Jeśli bieżący element jest większy niż element po jego lewej stronie, wstaw go we właściwym miejscu na posortowanej liście.
- Powtórz kroki 4-6 dla każdego kolejnego elementu na nieposortowanej liście.
- Po przetworzeniu wszystkich elementów posortowana lista będzie zawierać wszystkie elementy we właściwej kolejności.
- Proces sortowania został zakończony.
(iii) Sortowanie przez wybór : metoda sortowania, która konsekwentnie rozpoczyna posortowaną listę od najmniejszego szczegółu z listy nieuporządkowanej.
Algorytm sortowania przez wybór to: -
- Zacznij od ustawienia podstawowego elementu listy jako elementu min.
- Powtórz pozostałe pozycje na liście, porównując każdy z bieżącym minimum.
- Ustaw nowe minimum, jeśli okaże się, że element jest mniejszy niż istniejący.
- Zmień obecne minimum na pierwszy element listy, gdy dojdzie do końca.
- Dla pozostałej nieposortowanej części listy powtórz kroki 2-4, ale zacznij od drugiej pozycji na liście (ponieważ pierwszy element jest już posortowany).
- Kontynuuj sortowanie listy w ten sposób, aż cała lista zostanie posortowana.
(iv) Szybkie sortowanie : Algorytm sortowania typu „dziel i zwyciężaj”, który wybiera element przestawny i dzieli listę na podlisty w zależności od tego, czy elementów jest mniej, czy więcej od elementu przestawnego. Następnie podlisty są sortowane wielokrotnie, aż do posortowania pełnej listy.
Algorytm szybkiego sortowania to: -
- Wybierz element obrotowy z listy. Zwykle jest to pierwszy element, ale może to być również element losowy lub mediana listy.
- Podziel listę na dwie podlisty: jedną zawierającą elementy mniejsze niż element przestawny i jedną zawierającą elementy większe niż element przestawny.
- Posortuj rekurencyjnie podlistę zawierającą elementy mniejsze niż element przestawny, stosując ten sam proces.
- Użyj tej samej procedury, aby rekursywnie posortować podlistę wpisów większych niż element przestawny.
- Połącz posortowane podlisty z elementem przestawnym znajdującym się pomiędzy nimi, aby utworzyć w pełni posortowaną listę.
- Zwróć w pełni posortowaną listę.
(v) Lot idzie : Algorytm sortowania typu „dziel i zwyciężaj” dzieli listę na dwie połowy, sortuje każdą połowę, a następnie łączy obie połówki w posortowanej kolejności.
Algorytm sortowania przez scalanie:
- Utwórz z listy dwie podlisty: jedną z elementami poniżej osi obrotu i jedną z elementami powyżej osi obrotu.
- Tworzy nową posortowaną listę podrzędną poprzez iteracyjne łączenie list podrzędnych, aż będzie istniała tylko jedna lista podrzędna. To będzie Twoja posortowana lista.
- Kroki, aby połączyć dwa podkatalogi: -
- Utwórz pustą listę do przechowywania posortowanych elementów.
- Porównuje pierwszy element każdej podlisty.
- Dodaje mniejszy element do nowej listy i usuwa go z nadrzędnej listy podrzędnej.
- Powtarzaj kroki 2 i 3, aż lista będzie całkowicie pusta.
- Dodaje pozostałe elementy z innych podlist do nowej listy.
- Zastępuje połączoną listę podrzędną nową posortowaną listą.
- Powtarzaj ten proces, aż wszystkie podlisty zostaną połączone w jedną posortowaną listę.
(vi) Sortowanie według sterty : Algorytm sortowania, który sortuje elementy przy użyciu struktury danych zwanej stertą.
Oto algorytm klasyfikacji:
- Ułóż pozostałe elementy w stos. Zaczynając od korzenia, każdy węzeł jest porównywany ze swoimi dziećmi, zamieniając węzły ze starszymi dziećmi, aż do osiągnięcia właściwości max sterty.
- Powtórz kroki 2 i 3 z nowo ułożonymi elementami, z wyjątkiem ostatniego elementu we właściwej pozycji.
- Powtarzaj ten proces, aż na stosie pozostanie tylko jeden element. To jest teraz posortowane.
(vii) Sortowanie radiacyjne : Algorytm sortowania, który sortuje elementy na podstawie cyfr lub cyfr ich reprezentacji binarnej.
Algorytm sortowania Radix to: -
- określić, ile cyfr zawiera się w największym elemencie listy wejściowej.
- Zainicjuj zmienną, powiedzmy miejsce cyfry, na 1, która reprezentuje bieżące miejsce cyfry.
- Utwórz pustą listę dla każdej możliwej wartości cyfry od 0 do 9.
- Wykonaj iterację po liście wejściowej i dodaj każdy element do odpowiedniej listy w oparciu o wartość bieżącego miejsca cyfry.
- Połącz wszystkie listy, aby utworzyć nową listę w kolejności list cyfr.
- Pomnóż cyfrę przez 10, aby przejść do następnej cyfry.
- Powtarzaj kroki 4-6 dla każdego miejsca cyfry, aż zostaną uwzględnione wszystkie cyfry największego elementu.
- Ostateczna lista zostanie posortowana rosnąco według cyfr elementów.
- Zwróć ostateczną posortowaną listę.
2. Algorytmy przeszukiwania
C zapewnia również narzędzia niezbędne do implementacji różnych algorytmów wyszukiwania, takich jak wyszukiwanie liniowe i wyszukiwanie binarne. Algorytmy te mogą szybko znaleźć określone elementy w zestawie danych, dzięki czemu są przydatne w szerokim zakresie zastosowań.
Istnieje wiele rodzajów algorytmów wyszukiwania.
rodzaje uczenia maszynowego
Oni są:-
(i) Przeszukiwanie liniowe : Podstawowy algorytm wyszukiwania, który sprawdza każdy element aukcji jeden po drugim, aż znajdzie żądany element.
Algorytm wyszukiwania liniowego: -
- Zdefiniuj dane wejściowe dla algorytmu: Dane wejściowe dla algorytmu wyszukiwania liniowego to lista elementów (lub tablica) i element docelowy, którego szukamy.
- Zainicjuj zmienną o nazwie „indeks” na -1: Ta zmienna zostanie użyta do przechowywania indeksu elementu docelowego, jeśli zostanie znaleziony.
- Przeglądanie listy elementów w pętli: Zaczynając od pierwszego elementu, sprawdzaj jeden po drugim każdy element na liście.
- Porównaj obecny element z żądanym elementem do oceny: Zachowaj indeks bieżącego elementu w zmiennej indeksującej i wyjdź z pętli, jeśli element nowoczesny i element docelowy są identyczne.
- Zwróć indeks elementu docelowego: Po zakończeniu pętli zwróć wartość zapisaną w zmiennej indeksującej. Jeśli element docelowy nie zostanie znaleziony, wartość indeksu będzie wynosić -1.
(ii) Wyszukiwanie binarne : algorytm wyszukiwania, który działa na zasadzie dzielenia wpisu na połowy i wyszukiwania w obrębie tych połówek, z większym prawdopodobieństwem uwzględni element.
Algorytm wyszukiwania binarnego: -
- Dane wejściowe: posortowana lista n elementów i element docelowy x.
- Zainicjuj zmienne: Ustaw niski indeks na 0, wysoki indeks na n-1, a średni na (niski+wysoki)/2.
- Rozpocznij pętlę: Gdy dolny indeks jest mniejszy lub równy wysokiemu indeksowi, powtórz poniższe kroki.
- Porównaj środkowy element z x: Jeśli środkowy element jest równy x, zwróć środkowy indeks.
- Zaktualizuj dolny lub wysoki indeks: Jeśli x jest większe niż środkowy element, ustaw dolny indeks na średni + 1. W przeciwnym razie ustaw wysoki indeks na średni - 1.
- Zaktualizuj środkowy indeks: Mid = (niski+wysoki)/2.
- Koniec pętli: Jeśli dolny indeks jest większy od wysokiego, wówczas x nie ma na liście, a algorytm zwraca błąd.
- Dane wyjściowe: Indeks x na liście lub w komunikacie o błędzie.
(iii) Przeszukiwanie najpierw w głąb : Algorytm wyszukiwania, który sprawdza każdą gałąź w miarę możliwości przed zawróceniem.
Poniższe wytyczne dotyczą wyszukiwania w głąb:
- wybierz początkowy wierzchołek lub węzeł wykresu, od którego chcesz zacząć.
- Dodaj znacznik odwiedzin do pierwszego wierzchołka.
- Bezpośrednio umieść wierzchołek początkowy w stosie.
- Dopóki stos nie będzie pusty, powtarzaj następujące czynności: -
- Usuń górny wierzchołek stosu.
- Oznacz jako odwiedzone i wstaw do stosu każdego nieodwiedzonego sąsiada wyskakującego wierzchołka.
- Kontynuuj ten proces, aż odwiedzisz wszystkie wierzchołki grafu.
- Po odwiedzeniu wszystkich wierzchołków algorytm jest gotowy i na grafie przeprowadzane jest przeszukiwanie w głąb.
(iv) Przeszukiwanie wszerz : Algorytm wyszukiwania, który bada wszystkich sąsiadów węzła przed przejściem do następnego poziomu.
Algorytm wyszukiwania wszerz to: -
- Zacznij od węzła głównego lub stanu początkowego.
- Dodaj węzeł główny do kolejki.
- Sprawdź, czy kolejka jest pusta; jeśli tak, zakończ algorytm.
- Weź pierwszy element z kolejki i oznacz go jako odwiedzony.
- Wzmocnij współczesny węzeł, dodając do kolejki wszystkich jego nieodwiedzonych sąsiadów.
- Dopóki nie zostanie zlokalizowany żądany węzeł lub kolejka nie będzie pusta, powtarzaj kroki od 3 do 5.
- Zwróć ścieżkę ze stanu wstępnego do stanu docelowego, jeśli zostanie znaleziony węzeł docelowy.
- Zakończ zestaw reguł i zgłoś, że stan docelowy nie został zidentyfikowany, jeśli kolejka jest pusta.
(v) Wyszukiwanie interpolacyjne : Algorytm wyszukiwania wykorzystujący wartości wyszukiwanych elementów do oszacowania pozycji w indeksie.
myflixer
Ważne jest, aby tablica była równomiernie rozłożona. W przeciwnym razie jest to algorytm.
Działa zgodnie z oczekiwaniami.
Algorytm można podsumować w następujący sposób.
- Pobierz listę wejściową i wartość klucza do przeszukania.
- Zainicjuj dolną i górną zmienną na pierwszym i ostatnim indeksie listy.
- Jeśli dolna wartość jest mniejsza lub równa wyższej wartości, wówczas: -
- Oblicz szacunkową lokalizację, korzystając z następującego wzoru:
pos = niski + ((wysoki - niski) / (arr[wysoki] - arr[niski])) * (x - arr[niski]). - Zwróć pozycję, jeśli szacowana wartość pozycji jest wartością kluczową.
- c) Jeżeli szacunkowa wartość pozycji jest mniejsza niż wartość klucza, ustaw ją niższą.
Pozycja + 1. - d) Jeżeli wartość szacowanej pozycji jest większa niż klawisz Ustaw wartość, pozycja - 1 w górę.
- Oblicz szacunkową lokalizację, korzystając z następującego wzoru:
- Jeśli wartość klucza nie zostanie znaleziona, zwróć -1, aby wskazać, że wartości nie ma na liście.
(vi) Wyszukiwanie skokowe : Metoda wyszukiwania, która iteruje po liście w krokach o stałej długości, aż znajdzie odpowiedni element lub ustali, że już go nie ma.
Algorytm wyszukiwania skoków jest następujący:
- Najpierw ustaw rozmiar skoku na pierwiastek kwadratowy z liczby elementów tablicy.
- Ustawia zmienną o nazwie „prąd” na pierwszy element tablicy.
- Wykonuje iterację po tablicy, przeskakując według rozmiaru skoku, jednocześnie zwiększając zmienną zwaną „skokiem”.
- Przejdź do następnego kroku, jeśli istniejący element jest mniejszy niż żądany element.
- Jeśli bieżący element jest większy niż element docelowy, wykonaj wyszukiwanie liniowe pomiędzy bieżącym elementem a poprzednim elementem skoku, aby znaleźć element docelowy.
- Jeśli element docelowy nie zostanie znaleziony w tablicy, zwraca -1, aby wskazać, że nie ma go w tablicy.
- Jeśli element zostanie znaleziony, zwraca indeks elementu w tablicy.
3. Algorytmy grafowe
Obsługa w języku C wskaźników i struktur danych, takich jak tablice i listy połączone, sprawia, że nadaje się on do implementowania algorytmów manipulujących wykresami, na przykład znajdowania najkrótszej ścieżki między dwoma węzłami na wykresie.
Istnieją różne typy algorytmów grafowych.
oni są:-
4. Algorytmy kryptograficzne
C obsługuje operacje niskiego poziomu i wydajną manipulację danymi, dzięki czemu idealnie nadaje się do implementacji algorytmów stosowanych w kryptografii, takich jak algorytmy szyfrowania i deszyfrowania danych.
Istnieją różne typy algorytmów szyfrowania.
Oni są:-
Zalety algorytmu
Algorytmy mają wiele zalet.
oni są:-
Wady algorytmu
Algorytmy są bardzo przydatne w programowaniu, ale mają wady.
oni są:-