Алгоритъм
Алгоритъм е точното и разбираемо за изпълнителя описание на действията, които трябва да се извършат, за да се постигне определен резултат. По точно казано алгоритъм е строго определената последователност от действия, през които трябва да се премине, за да се изпълни дадена задача. В областите математика, лингвистика, информатика и други, термина алгоритъм е често срещан и се свързва предимно със изчисления и с обработка на дадени данни. История
Формирането на понятието идва с опитите да се реши 10-тия [[проблем на Хилберт]] „[[Задача за разрешимост на диофантово уравнение]]“. Които Давид Хилберт поставя през 1900 година на Втория световен конгрес по математика в Париж. Последващите формализации представляват опити да се дефинира „ефективна изчислимост“ (Клини 1943:274) или „ефективен метод“ (Росър 1939:225); включват рекурсивните функции на Ербран-Гьодел-Клини от 1930, 1934 и 1935 година, ламбда смятането на Алонсо Чърч от 1936, „Формулировка 1“ на [[Емил Пост]] от 1936, и [[машината на Тюринг]] от 1936-7 и 1939 година. Класически пример за алгоритъм е Алгоритъмът на Евклид.Това е алгоритъм за намиране на най-големия общ делител (НОД) на две естествени числа. Той е един от първите публикувани алгоритмии е бил описан е в книгата на Евклид „Елементи“ около 300 г. пр.н.е. Формализации
Алгоритмите играят важна роля при изчислението на данни в компютрите.При създаването на много компютърни програми се въвеждат алгоритми ,чрез които се определя точно определена последователност на действие при изпълнение на определени задачи.Тук алгоритъмът може да се разглежда и като произволна поредица от операции, които могат да се симулират от [[пълна по Тюринг]] система.
При съставянето на алгоритъм е необходимо на първо място да се представи сложното действие чрез последователност от по-прости действия, достъпни за изпълнителя. Също така трябва да използвате само елементарни (за изпълнителя) действия. Не по малко важно е да опише ясно и точно последователността, в която трябва да се изпълняват елементарни действия.
Представяне
Най-често срещаните начини за представяне на алгоритмите са чрез естествени езици, псевдокод, блок-схеми или програмни езици.Чрез естествени езици предимно се представят по простите алгоритми, защото при по сложните алгоритми може да се стигне до неразбиране и не напълно определяне на последователността и същността на процесите. Псевдокодът е начин да бъде описан алгоритъм или характеристика на език за програмиране, без да се ангажира читателя с конкретен език.Алгоритмите се представят с блок-схемите чрез геометрични фигури, като всяка от тях има свое собствено значение.При създаването на блок-схема трябва да се вземат под внимание следните елементи: началото, което се вписва в елипса; входът, от който зависи резултатът и без който алгоритъмът не може да се създаде; оператор 1,2,3…. , той зависи от броя на извършваните операции и всяка операция се записва в отделен квадрат и се поставят една под друга (тук могат да се въведе и условност, която се описва чрез „да” или „не” т.е. отговаря се дали може да се изпълни дадения процес); последните две части са изходът и края на блок-схемата.Чрез програмните езици се изразяват алгоритми в изпълним от компютър вид, но често се ползват и за да онагледяват, дефинират или документират алгоритмите.
Класификация на алгоритмите.
Съществуват различни начини на класификация на алгоритмите.
Според имплементацията
Рекурсивни или итеративни
Рекурсивният е този, който прави поредица от обръщения към себе си докато не се изпълни действието. За да решат същите задачи, итеративните алгоритми използват повтарящи се конструкции (цикли), а понякога и допълнителни структури от данни като стекове.
Логически
Алгоритъмът може да се разглежда като контролирана логическа [[дедукция]].Според Роберт Ковалски алгоритъмът се състой от две основно части – логика и управление.
Серийни, паралелни или разпределени
Серийните алгоритми са тези, който изпълняват една команда на един така както при компютрите се приема, че една задача се изпълнява на един такт. Паралелните алгоритми се прилагат тогава когато има няколко процесора и тези няколко процесора едновременно обработват и прилагат различните алгоритми. Разпределените алгоритми се осъществяват чрез свързването на няколко машини в една мрежа. Паралелните и разпределените алгоритми се различават от серийните по това ,за разлика от серийните паралелните и разпределителните разбиват задачите на подзадачи.
Детерминирани и недетерминирани
Детерминираните алгоритми използват една и съща процедура за решаването на задачите като и резултатът е един и същ. При недетерминираните се използват различни начини и подходи за решаването на поставените задачи, които методи се базират на евристики и случайност.
Точни и приблизителни
При все че много алгоритми достигат до точно решение на даден проблем, по различни причини в практиката се използват и приблизителни алгоритми, които (по горната класификация) могат да бъдат както недетерминирани, така и детерминирани. Според дизайна
Някои често срещани принципи в дизайна на алгоритми са следните:
Когато за дадена задача се знае, че до оптималното решение може да се стигне чрез базиране на оптималните решения на поредица подзадачи, и то такива припокриващи се подзадачи, до които се свежда решаването и на други видове задачи, то се прилага един по-бърз подход, наречен [[динамично програмиране]].Чрез този принцип се избягва повторното решение на задачите.
Това е процес, при който даден проблем се непрестанно се раздробява на по-малки проблеми докато се стигне до там те да могат да се решат по-лесно. Основната разлика между динамичното програмиране и „разделяй и владей“ е, че подзадачите са малко или много независими при „разделяй и владей“, докато подзадачите при динамичното програмиране се припокриват.
При този принцип, проблемът се свежда до откриването на специфични неравенства, които са в сила по отношение на входните данни, и след това се прави опит да се намери максимума (или минимума) на някоя [[линейна функция]] над тях.
Вероятностни,генетични и евристични алгоритми
При вероятностния алгоритъм се съдържа елемент на случайността и за него може да се докаже, че в най-доброто решение се съдържа случайността.
При генетичните алгоритми се използват цикли на случайните мутации, които генерират успешни поколения от решения.
Евристичните алгоритми се проявяват в това да се намери приблизително решение в условия на ограничени ресурси или време. Според приложението
Според областта, в която се прилагат алгоритмите могат да се разделят на много и различни видове: алгоритми за търсене, алгоритми за сливане, алгоритми за сортиране, алгоритми за машинно обучение, криптографски алгоритми и други.
Според сложността
Тук алгоритмите се разглеждат спрямо това колко време е нужно за да се стигне до решението на задачата. Някои алгоритми завършват за [[линейно време]], други за полиномиално, трети за [[експоненциално време]], а някои алгоритми никога не завършват работа.