Що е алгоритъм?
Тъй. Сега я загазих. По-горе използвах понятието алгоритъм като все отлагах момента на обяснението и разчитах на интуицията на читателя, но вече е крайно време да обясня какъв дявол е това. Е, поне ще опитам.
Алгоритъмът е възможно най-основното понятие в програмирането, но и най-абстрактното. Не може да ви го посочат, трябва просто да се разбере. То е нещо като математическия платонизъм - съществува някъде и за да го използваш трябва да изградиш мислена връзка с това "някъде". Като споменах математика се сетих да кажа, че алгоритъм и математичната операция логаритъм са коренно различни неща.
Но да се върнем към въпроса: Що е алгоритъм? Може би сте чували някакво определение от вида "Алгоритъм - начин нещо да се направи". Има известна доза истина в това, ама тя е пренебрежимо малка. Няма точна дефиниция на понятието, така че както и да ви го обяснят, все ще е погрешно. Ако се захванете сериозно с програмиране, в един момент ще стигнете до прозрението и сами ще разберете смисъла на думата. Но за да продължим нататък, тук ще дам едно определение което ще свърши работа за сега (не забравяйте обаче, че и това определение не е съвсем точно):
Алгоритъм - съвкупност от методи за обработка на дадена система свързани логически чрез условия, които методи се реализират чрез действия различни за всеки частен случай, които действия зависят от контролни обратни връзки давани от проверки на състоянието на системата в момента, което състояние е предварително предвидено като възможно в резултат от събития вътрешни или външни за системата.
Въобще не си помисляйте, че съм си изсмукал това определение от пръстите за да ви объркам, аз наистина се опитвам да дам точна представа какво е алгоритъм. И не се опитвайте да го запомняте само за да шашнете приятелите си (аз самият трудно бих успял да го запомня), а се опитайте да го разберете. За да ви помогна с разбирането, ще ви дам един примерен алгоритъм за запалване на цигара, ако пушачът се намира в някой бар. Примерния алгоритъм ще представя по три начина - обяснение, блок-схема, и псевдо код. Ще подчертая отново, за да не ме разберете погрешно: Нито едно от трите не е алгоритъма, те са само негово представяне.
Сега да обсъдим малко тези три начина за представяне на алгоритъма. Така де, аз ще ги обсъдя, а вие ще цъкате с език както и до сега.
- Обяснение на алгоритъма:
Търсиш цигара, ако няма - няма да пушиш. Ако намериш, търсиш запалка. Ако не намериш запалка, търсиш кибрит (малко е селско, ама какво да се прави). Ако няма и кибрит, придаваш си приятен вид и напрягаш взор наоколо да видиш готина мадама от която да искаш огънче. Ако има такава и до нея няма някой тип с вид на трикрилен гардероб с надстройка искаш огънче от нея. Ако и тя няма или някое от горните условия не е спазено, искаш огънче от бармана. Той има със сигурност. С намереното огънче палиш цигарата.
- Представяне на алгоритъма чрез блок-схема:
- Реализация на алгоритъма чрез псевдо код:
цигара=потърси_цигара() if (цигара==NOT_FOUND) return Няма_цигара огниво=потърси_запалка() if (огниво==NOT_FOUND) { огниво=потърси_кибрит() if (огниво==NOT_FOUND) { I_am(LOOKING_GOOD) if (pretty_woman_around(NO_GANGSTER_ABOUT_HER)) огниво=ask_pretty_woman(NO_GANGSTER_ABOUT_HER, OGIN) if (огниво==NOT_FOUND) огниво=ask_barman(OGIN) } } smoke(цигара, огниво)
Първият начин (обяснението с думи) обикновено се прилага когато се обясняват прости или не много сложни алгоритми. Обяснението e бързо и изискванията или особеностите се изясняват подробно. Недостатък е това, че е нужно време за да бъде разбран алгоритъма, тъй като липсва визуализация на идеята и условностите.
Представянето на алгоритъм чрез блок-схема се прилага при изработване проектната документация на една програма. Всъщност, задължителна част от тази документация е блок-схемата на основния алгоритъм. Друго приложение на блок-схемите е при обясняване на алгоритми със средна и висока сложност, тъй като може директно да бъде посочена част от алгоритъма, а взаимоотношенията на отделните модули се виждат ясно. В примерната блок-схема по-горе в лявата колона са дадени отделните модули, а в дясната - условията при които те се изпълняват.
Третият начин първоначално е малко объркващ, тъй като методите и условията в него са като шопска салата. Но голямото предимство на този начин на представяне (не случайно е записано реализация) е това, че той бързо може да бъде сведен до език за програмиране, тъй като спазва аналогичен синтаксис. До псевдо код се прибягва при изучаване или анализ на алгоритъма.
Това са трите основни начина за представяне на един алгоритъм, всеки друг начин е модификация на някой от тях. Обикновено обаче, те не се използват самостоятелно, а се комбинират - дава се блок-схема на основния алгоритъм, а методите се представят с псевдо код + обяснения. Идеята е алгоритъма да бъде разбран за възможно най-кратко време, и затова често в обясненията се прибягва до професионален жаргон.
Е, надявам се, че добихте известна представа що за животно е това алгоритъма. Преди да приключим с тази тема обаче, много ми се иска да ви доверя и следната обърквация: Често в практиката един алгоритъм съдържа в себе си много други алгоритми които взаимно се допълват под негов контрол, като той самият се изпълнява в контекста на друг алгоритъм и/или кореспондира със съвсем други алгоритми които са или не са в същия контекст, с концепцията че всеки от алгоритмите е модифициран в смисъл на несамостоятелност, като цялата тази съвкупност образува единен алгоритъм който може да излезе извън рамките на една програма. Закопах ви!