Kas ir algoritms? Definīcija, piemēri un skaitļošanas pamati
Uzzini, kas ir algoritms: skaidra definīcija, praktiski piemēri un skaitļošanas pamati — soli pa solim skaidrojumi, pseidokodi un plūsmas diagrammas.
Algoritms ir pakāpeniska, skaidri definēta procedūra vai recepte problēmas risināšanai vai uzdevuma izpildei. Algoritms apraksta soļu virkni, kas jāveic, lai no dotajiem ievades datiem iegūtu paredzamo izejas rezultātu.
Vienkāršs skaidrojums un piemērs
Recepte ir labs algoritma paraugs — tajā soli pa solim norādīts, kas jādara, kādas sastāvdaļas (ievade) jāizmanto un kāds būs gatavais ēdiens (izeja). Neoficiāli algoritmu bieži dēvē par soļu sarakstu, un to var aprakstīt arī parastā valodā.
Algoritma īpašības
- Determinētība (precizitāte) — katram solim jābūt skaidram un nediskutējamam.
- Beigu esamība (finītums) — algoritmam jābeidzas pēc galīgu soļu skaita (vai jānorāda, ka tas var darboties mūžīgi, ja tas ir paredzēts speciālai sistēmai).
- Ievade — algoritms var pieņemt vienu vai vairākas ievades vērtības.
- Izeja — algoritms rada vienu vai vairākas izejas vērtības, kas ir atrisinājuma vai rezultāta forma.
- Efektivitāte — secina, cik ātri un cik daudz resursu (piem., atmiņa) algoritms patērē.
- Izpildāmība — katrs solis jābūt veicams ar ierobežotu laiku un resursiem (praktiskā izpildāmība).
Kā algoritmus raksta un attēlo
Algoritmus skaitļošanā raksta ar dažādām metodēm: pseidokodā, plūsmas diagrammās vai tieši programmēšanas valodās. Šādi apraksti palīdz pārvērst ideju par kodu, kas darbosies datorā.
Tipiski veidi, kā attēlot algoritmus:
- Pseidokods — cilvēkam saprotams, tuvu programmēšanas valodai.
- Plūsmas diagrammas — vizuāls soļu un lēmumu attēlojums.
- Reāla programma — algoritma kodēta forma, kuru var izpildīt datorā.
Piemēri
Daži pazīstami algoritmu piemēri un kategorijas:
- Šķirošanas algoritmi (Bubble sort, Quick sort, Merge sort).
- Meklēšanas algoritmi (lineāra meklēšana, binary search).
- Grafu algoritmi (Dijkstra, BFS, DFS).
- Optimizācijas metodes (greedy algoritmi, dinamiskā programmēšana).
Vienkāršs pseidokods — binārā meklēšana sakārtotā masīvā:
function binarySearch(A, target): low ← 0 high ← length(A) - 1 while low ≤ high: mid ← (low + high) // 2 if A[mid] = target: return mid else if A[mid] < target: low ← mid + 1 else: high ← mid - 1 return -1 // nav atrasts
Algoritmu sarežģītība un efektivitāte
Algoritma izvērtēšana parasti balstās uz diviem galvenajiem rādītājiem:
- Laika sarežģītība — cik daudz laika (operāciju skaits) nepieciešams izpildei atkarībā no ievades lieluma. Parasti to izsaka kā Big O notāciju (piem., O(n), O(n log n)).
- Telpas (atmiņas) sarežģītība — cik daudz papildu atmiņas algoritms izmanto.
Skaitļošanas pamati un Tjūringa mašīna
Skaitļošanā algoritms tiek definēts kā precīzs darbību saraksts, ko var izpildīt ar Tjūringa mašīnu vai līdzvērtīgu aprēķinu modeli. Tjūringa mašīna ir teorētisks modelis, kas palīdz izprast, kas ir aprēķināms.
Church–Tjūringa teze apgalvo, ka viss, ko cilvēks var aprakstīt kā efektīvu algoritmu, ir aprakstāms ar Tjūringa mašīnu vai modernu programmēšanas valodu — tas ir pamatjēdziens skaitļošanas teorijā.
Līdzīgās un sarežģītākās tēmas
- Aprēķināmība — kuras problēmas ir risināmas ar algoritmiem un kuras nav (piem., nav risināms uzdevums: Paskāla izteiksmes pārbaude nav piemērs — neskaidrs; jāzina, ka dažas problēmas ir šķietami nerisināmas jeb nedecidējamas).
- NP-kompleksitāte — klasifikācija, kas saista problēmu risināšanas sarežģītību (P vs NP jautājums).
Vēsture un etimoloģija
Vārdi "algoritms" un "algorisms" ir atvasināti no persiešu matemātiķa Al-Khwārizmī (persiešu: خوارزمی, aptuveni 780–850). Viņa darbi par aritmētiku un algebrai devuši pamatu mūsdienu algebraiskajai domāšanai un numeriskajām metodēm, kā arī ietekmējuši terminu attīstību.
Kopsavilkums
Algoritms ir vispārīgs instruments problēmu risināšanai — no ikdienas recepšu līdz sarežģītām datorzinātņu metodēm. Saprast algoritmu īpašības (ievade, izeja, finišs, efektivitāte) un to pieraksta formas (pseidokods, plūsmas diagrammas, programmēšanas valodas) ir pamats, lai veidotu pareizu un efektīvu programmatūru vai risinātu matemātiskas problēmas.
Algoritmu salīdzināšana
Parasti ir vairāk nekā viens veids, kā atrisināt problēmu. Var būt daudz dažādu recepšu, kā pagatavot kādu ēdienu, kas izskatās atšķirīgi, bet galu galā garšo vienādi, kad viss ir pateikts un izdarīts. Tas pats attiecas arī uz algoritmiem. Tomēr daži no šiem veidiem būs labāki par citiem. Ja receptei nepieciešams daudz sarežģītu sastāvdaļu, kuru jums nav, tā nav tik laba kā vienkārša recepte. Kad mēs aplūkojam algoritmus kā problēmu risināšanas veidu, bieži vien mēs vēlamies zināt, cik ilgā laikā dators atrisinātu problēmu, izmantojot konkrēto algoritmu. Rakstot algoritmus, mēs vēlamies, lai mūsu algoritms aizņemtu pēc iespējas mazāk laika, lai mēs varētu atrisināt problēmu pēc iespējas ātrāk.
Dažas receptes gatavošanā ir grūtāk izpildāmas nekā citas, jo to pabeigšanai nepieciešams vairāk laika vai vairāk lietu, kurām jāseko līdzi. Tāpat ir arī ar algoritmiem, un algoritmi ir labāki, ja tos ir vieglāk izpildīt datoram. To, ar ko mēra algoritma sarežģītību, sauc par sarežģītību. Kad mēs jautājam, cik sarežģīts ir algoritms, bieži vien mēs vēlamies zināt, cik ilgā laikā dators atrisinās uzdevumu, ko vēlamies, lai tas atrisinātu.
Šķirošana
Šis ir algoritma piemērs karšu ar krāsām sakārtošanai vienas krāsas kaudzītēs:
- Paņemiet visas kartes.
- Izvēlieties karti no savas rokas un apskatiet tās krāsu.
- Ja jau ir šīs krāsas kāršu kaudzīte, nolieciet šo kārti uz tās kaudzītes.
- Ja nav šīs krāsas kāršu kaudzītes, izveidojiet jaunu kaudzīti tikai ar šīs krāsas kārtīm.
- Ja Jūsu rokās joprojām ir karte, atgriezieties pie otrā soļa.
- Ja Jūsu rokās vēl nav nevienas kārts, tad kārtis tiek sakārtotas. Jūs esat beidzis.
Šķirošana pēc skaitļiem
Šie ir algoritmu piemēri, kā sakārtot kāršu kaudzi ar daudziem dažādiem skaitļiem tā, lai skaitļi būtu sakārtoti.
Spēlētāji sāk ar kāršu kaudzi, kas nav sakārtotas.
Pirmais algoritms
Šis algoritms izskata kāršu kaudzi pa vienai kartei. Šī karte tiek salīdzināta ar nākamo karti kaudzē. Lūdzu, ņemiet vērā, ka šī pozīcija mainās tikai 6. solī. Šo algoritmu sauc par burbuļu šķirošanu. Tas ir lēns.
- Ja kāršu kaudze ir tukša vai tajā ir tikai viena kārts, tā ir sakārtota un viss ir izdarīts.
- Paņemiet kāršu kaudzīti. Paskatieties uz kaudzes pirmo kārti (augšējo).
- Jūsu aplūkojamā karte ir karte A. Karte A pašlaik atrodas P kaudzītē.
- Ja pēc A kārtis kaudzītē vairs nav citu kāršu, pārejiet uz 8. soli.
- Nākamā kārts kaudzītē ir B karte.
- Ja kartē B ir mazāks skaitlis nekā kartē A, apmainiet kāršu A un B pozīcijas. atcerieties, ka to izdarījāt. Kad apmaināsiet kārtis, nemainiet pozīciju P.
- Ja pēc P pozīcijas kaudzītē ir vēl viena karte, paskatieties uz to; atgriezieties pie 3. soļa.
- Ja pēdējā izspēlē neesat mainījis nevienas kārtis, tad kāršu kaudze ir sakārtota.
- Pretējā gadījumā atgriezieties pie 2. soļa.
Soli pa solim piemērs
Paņemsim kāršu kaudzi ar skaitļiem "5 1 4 2 8" un sakārtosim to no mazākā skaitļa līdz lielākajam, izmantojot šo algoritmu. Katrā solī algoritms salīdzina treknrakstā rakstītos elementus. Kāršu kaudzes augšdaļa ir kreisajā pusē.
Pirmā eja:
( 5 1 1 4 2 8 ) → {\displaystyle \to } ( 1 5 5 4 4 2 8 ) Šeit algoritms salīdzina pirmos divus elementus un tos apmaina.
( 1 5 4 4 2 8 ) → {\displaystyle \to } ( 1 4 5 5 2 8 )
( 1 4 5 2 8 ) → {\displaystyle \to } ( 1 4 2 2 5 8 )
( 1 4 2 5 8 ) → {\displaystyle \to } ( 1 4 2 2 5 8 ) Šie elementi jau ir sakārtoti, tāpēc algoritms tos nemaina.
Otrais gājiens:
( 1 4 2 5 8 ) → {\displaystyle \to } ( 1 4 2 5 8 )(
1 4 2 5 8 ) → {\displaystyle \to } ( 1 2 2 4 5 8 )(
1 2 4 5 8 ) → {\displaystyle \to } ( 1 2 4 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to } ( 1 2 4 4 5 8 )
Tagad kāršu kaudze jau ir sakārtota, bet mūsu algoritms to nezina. Algoritmam ir nepieciešams viens vesels piegājiens bez jebkādas apmaiņas, lai zinātu, ka tā ir sakārtota.
Trešais gājiens:
( 1 2 4 4 5 8 ) → {\displaystyle \to } ( 1 2 4 4 5 8 )(
1 2 4 5 8 ) → {\displaystyle \to } ( 1 2 4 5 8 )(
1 2 4 5 8 ) → {\displaystyle \to } ( 1 2 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to } ( 1 2 2 4 5 5 8 )
Visbeidzot, masīvs ir sakārtots, un algoritms var apstāties.
Vēsture
Šis ir viegli saprotams šķirošanas algoritms. Datorzinātnieki to nosauca par burbuļveida šķirošanu, jo mazāki elementi pacelsies uz augšu, mainot savu pozīciju katrā piegājienā. Diemžēl šis algoritms nav pārāk labs, jo, lai šķirotu, ir nepieciešams ilgs laiks (daudzas ejas cauri kāršu kaudzei).
Otrais algoritms
Šis algoritms izmanto citu ideju. Dažreiz problēmas atrisināšana ir sarežģīta, bet problēmu var mainīt tā, lai to veidotu vienkāršākas problēmas, kuras ir vieglāk atrisināt. To sauc par rekursiju. Tas ir grūtāk saprotams nekā pirmais piemērs, bet tas dos labāku algoritmu.
Pamatideja
- Ja kaudzītē nav nevienas kartes vai ir tikai viena karte, tā ir sakārtota, un Jūs esat pabeidzis.
- Sadaliet kāršu kaudzi divās apmēram vienāda lieluma daļās. Ja kāršu skaits ir nepāra, vienā no abām kaudzītēm būs par vienu karti vairāk nekā otrā.
- Sakārtojiet katru no abām kaudzēm, izmantojot šo algoritmu (Katrai kaudzei sāciet ar šī saraksta 1. punktu.)
- Apvienojiet abas sakārtotās kaudzes kopā, kā aprakstīts tālāk.
- Rezultāts ir sakārtota kāršu kaudze. Jūs esat pabeidzis.
Divu kaudžu apvienošana
Tas darbojas ar divām kāršu kaudzītēm. Viena no tām saucas A, otra - B. Ir trešā kaudzīte, kas sākumā ir tukša un ko sauc par C. Beigās tajā būs rezultāts.
- Ja A vai B kaudze ir tukša, visas tās kaudzes kārtis, kas nav tukšas, novietojiet uz C kaudzes; viss ir izdarīts, C kaudze ir apvienošanas rezultāts. (Piezīme: paņemiet visu kaudzīti un novietojiet to uz C kaudzītes; ja to darīsiet pa kartēm, mainīsies kārtība, un tas nedarbosies tā, kā vajadzētu.)
- Aplūkojiet A un B kaudzes augšējās kārtis. Kārtiņu ar mazāku numuru novietojiet C kaudzes augšpusē. Ja C kaudzē nebija nevienas kārtis, tagad tajā būs viena kārts.
- Ja A vai B kaudzītē ir palikušas kārtis, atgriezieties pie 1. soļa, lai tās sakārtotu.
Vēsture
Šo algoritmu 1945. gadā izstrādāja Džons fon Neimans. Viņš to nesauca par šķirošanu pēc skaitļiem, bet gan par Mergesort. Tas ir ļoti labs šķirošanas algoritms, salīdzinot ar citiem.
Trešais algoritms
Pirmā algoritma karšu šķirošana aizņem daudz vairāk laika nekā otrā, taču to var uzlabot (padarīt labāku). Aplūkojot burbuļveida šķirošanu, var pamanīt, ka kārtis ar lieliem skaitļiem no kaudzes augšas pārvietojas diezgan ātri, bet kartēm ar maziem skaitļiem kaudzes apakšā ir vajadzīgs ilgs laiks, lai paceltos (pārvietotos uz augšu). Lai uzlabotu pirmo algoritmu, ir šāda ideja:
Tā vietā, lai salīdzinātu divas blakus esošas kārtis, sākumā tiek izvēlēta "īpaša" karte. Pēc tam visas pārējās kartes tiek salīdzinātas ar šo karti.
- Sākam ar kaudzi A. Vēl būs divas citas kaudzes B un C, kas tiks izveidotas vēlāk.
- Ja kaudzē A nav karšu vai ir tikai viena karte, šķirošana ir pabeigta.
- No A kaudzes tiek izvēlēta kārts, ja iespējams, pēc nejaušības principa. To sauc par šarnīru.
- Visas atlikušās A kaudzes kārtis tiek salīdzinātas ar šo šarnīru. Kartes ar mazāku skaitu nonāk B kaudzītē, bet tās, kurām ir vienāds vai lielāks skaits, nonāk C kaudzītē.
- Ja B vai C kaudzēs ir kādas kārtis, šīs kaudzes ir jāsašķiro ar to pašu algoritmu (Sākt no 1. pozīcijas šajā sarakstā gan B, gan C kaudzē pēc kārtas).)
- Paveikts. Sakārtotajā kāršu kaudzē vispirms ir sakārtotā kaudze B, tad šarnīrs un tad sakārtotā kaudze C.
Vēsture
Šo algoritmu 1960. gadā izstrādāja K. A. R. Hūrs. Mūsdienās tas ir viens no visplašāk izmantotajiem šķirošanas algoritmiem. To sauc par Quicksort.

Animācija, kas parāda, kā darbojas burbuļu šķirošana

7 skaitļu šķirošana, izmantojot otro šķirošanas pēc skaitļiem algoritmu (Mergesort)

Trešais kāršu šķirošanas algoritms. Elements ar sarkano joslu tiek izvēlēts kā ass. Sākumā tas ir elements, kas atrodas pa labi. Šo algoritmu sauc par Quicksort.
Algoritmu salikšana kopā
Ja spēlētājiem ir kārtis ar krāsām un cipariem, viņi var tās sašķirot pēc krāsas un skaitļa, ja veic "šķirošanas pēc krāsām" algoritmu, tad veic "šķirošanas pēc cipariem" algoritmu katrai krāsainai kaudzītei un tad saliek kaudzītes kopā.
Šķirošanas pēc skaitļiem algoritmus ir grūtāk veikt nekā šķirošanas pēc krāsām algoritmus, jo var nākties atkārtot darbības vairākas reizes. Varētu teikt, ka šķirošana pēc skaitļiem ir sarežģītāka.
Saistītās lapas
- Eiklīda algoritms tika atrasts pirms vairāk nekā 2000 gadiem. Ar to var atrast divu skaitļu lielāko kopīgo dalītāju.
Jautājumi un atbildes
J: Kas ir algoritms?
A: Algoritms ir instrukciju kopums loģisku un matemātisku problēmu risināšanai vai kāda uzdevuma izpildei.
J: Vai recepti var uzskatīt par algoritmu?
A: Jā, recepte ir labs algoritma piemērs, jo tajā ir izklāstīti soļi, kas vajadzīgi, lai iegūtu gatavu produktu.
J: No kurienes nāk vārds "algoritms"?
A: Vārds "algoritms" cēlies no persiešu matemātiķa Al-Khwārizmī vārda.
J: Kā var uzrakstīt algoritmus?
A: Algoritmus var rakstīt parastā valodā, bet skaitļošanas vajadzībām tos raksta pseidokodā, plūsmas diagrammās vai programmēšanas valodās.
J: Kāda ir atšķirība starp algoritmu parastajā valodā un algoritmu skaitļošanas tehnikā?
Algoritms parastajā valodā apraksta darbību kopumu, ko var veikt, lai izpildītu kādu uzdevumu, bet algoritms skaitļošanas tehnikā ir precīzs operāciju saraksts, ko var veikt ar Tjūringa mašīnu.
J: Kas ir pseidokods?
A: Pseidokods ir vienkāršota programmēšanas valoda, kas ļauj programmētājiem rakstīt algoritmus, neiedziļinoties konkrētas programmēšanas valodas detaļās.
J: Kāpēc algoritmi ir svarīgi skaitļošanā?
Algoritmi ir svarīgi skaitļošanas tehnikā, jo tie nodrošina skaidru instrukciju kopumu, pēc kura dators var vadīties, un tas ļauj tam ātri un precīzi izpildīt uzdevumus.
Meklēt