Разлика между версии на „Алгоритъм“

От Администрация и управление
Направо към навигацията Направо към търсенето
(Премахване на цялото съдържание на страницата)
Ред 1: Ред 1:
Алгоритъм е точното и разбираемо за изпълнителя описание на [[действие|действията]], които трябва да се извършат, за да се постигне определен [[резултат]]. По точно казано алгоритъм е строго определената [[последователност]] от [[действие|действия]], през които трябва да се премине, за да се изпълни дадена задача. В областите [[математика]], [[лингвистика]], [[информатика]] и други, термина алгоритъм е често срещан и се свързва предимно със [[изчисления]] и с [[обработка на данни|обработка на дадени данни]].     
 
                                                                                                                                                              '''''История'''''
 
  
Формирането на понятието идва с опитите да се реши 10-тия [[[http://bg.wikipedia.org/wiki/Хилбертови_проблеми проблем на Хилберт]]] „[[Задача за разрешимост на [http://bg.wikipedia.org/wiki/Диофантово_уравнение диофантово уравнение]]]“. Които [[Давид Хилберт]] поставя през 1900 година на Втория световен конгрес по [[математика]] в Париж. Последващите формализации представляват опити да се дефинира „[[ефективна изчислимост]]“ (Клини 1943:274) или „[[ефективен метод]]“ (Росър 1939:225); включват рекурсивните функции на Ербран-Гьодел-Клини от 1930, 1934 и 1935 година, ламбда смятането на [[Алонсо Чърч]] от 1936, „[[Формулировка 1]]“ на [[[http://bg.wikipedia.org/w/index.php?title=Емил_Пост&action=edit&redlink=1 Емил Пост]]] от 1936, и [[[http://bg.wikipedia.org/wiki/Машина_на_Тюринг машината на Тюринг]]] от 1936-7 и 1939 година. Класически пример за алгоритъм е [[Алгоритъмът на Евклид]].Това е [http://bg.wikipedia.org/wiki/Алгоритъм алгоритъм] за намиране на [http://bg.wikipedia.org/wiki/Най-голям_общ_делител най-големия общ делител] (НОД) на две [http://bg.wikipedia.org/wiki/Естествено_число естествени числа]. Той е един от първите публикувани алгоритмии е бил описан е в книгата на [[Евклид]] „[http://bg.wikipedia.org/wiki/Елементи Елементи]“ около 300 г. пр.н.е.                                                                                                                                                                      '''''Формализации'''''
 
 
Алгоритмите играят важна роля при изчислението на данни в [[компютър|компютрите]].При създаването на много [[компютърни програми]] се въвеждат алгоритми ,чрез които се определя точно определена [[последователност]] на действие при изпълнение на определени задачи.Тук алгоритъмът може да се разглежда и като произволна поредица от операции, които могат да се симулират от [[[http://bg.wikipedia.org/w/index.php?title=Пълнота_по_Тюринг&action=edit&redlink=1 пълна по Тюринг]]] система.
 
 
При съставянето на алгоритъм е необходимо на първо място да се представи сложното действие чрез [[последователност]] от по-прости действия, достъпни за [[изпълнител]]я. Също така трябва да използвате само елементарни (за [[изпълнител]]я) действия. Не по малко важно е да опише ясно и точно последователността, в която трябва да се изпълняват елементарни действия.                                                             
 
 
'''Представяне'''
 
 
Най-често срещаните начини за представяне на алгоритмите са чрез [[естествени езици]], [[псевдокод]], [[блок-схеми]] или [[програмни езици]].Чрез [[естествени езици]] предимно се представят по простите алгоритми, защото при по сложните алгоритми може да се стигне до неразбиране и не напълно определяне на [[последователност]]та и същността на процесите. [[Псевдокодът]] е начин да бъде описан [http://bg.wikipedia.org/wiki/Алгоритъм алгоритъм] или характеристика на [http://bg.wikipedia.org/wiki/Език_за_програмиране език за програмиране], без да се ангажира читателя с конкретен език.Алгоритмите се представят с [[блок-схеми]]те чрез геометрични фигури, като всяка от тях има свое собствено значение.При създаването на [[блок-схема]] трябва да се вземат под внимание следните елементи: началото, което се вписва в елипса; входът, от който зависи резултатът и без който алгоритъмът не може да се създаде; оператор 1,2,3…. , той зависи от броя на извършваните операции и всяка операция се записва в отделен квадрат и се поставят една под друга (тук могат да се въведе и условност, която се описва чрез „да” или „не” т.е. отговаря се дали може да се изпълни дадения процес); последните две части са изходът и края на [[блок-схема]]та.Чрез [[програмни езици|програмните езици]] се изразяват алгоритми в изпълним от компютър вид, но често се ползват и за да онагледяват, дефинират или документират алгоритмите. [[Image:algoritym_pic_1.png|thumb|right|alt=blok shema.|Блок схема.]]                                                 
 
 
'''''Класификация на алгоритмите.'''''
 
 
Съществуват различни начини на класификация на алгоритмите.
 
 
===Според имплементацията    ===
 
 
Рекурсивни или итеративни
 
 
Рекурсивният е този, който прави поредица от обръщения към себе си докато не се изпълни действието. За да решат същите задачи, итеративните алгоритми използват повтарящи се конструкции ([http://bg.wikipedia.org/w/index.php?title=Програмен_цикъл&action=edit&redlink=1 цикли]), а понякога и допълнителни структури от данни като [http://bg.wikipedia.org/wiki/Стек стекове].
 
 
Логически
 
 
Алгоритъмът може да се разглежда като контролирана логическа [[[http://bg.wikipedia.org/wiki/Дедукция дедукция]]].Според [[Роберт Ковалски]] алгоритъмът се състой от две основно части – [[логика]] и [[управление]].
 
 
Серийни, паралелни или разпределени
 
 
Серийните алгоритми са тези, който изпълняват една команда на един така както при [[компютри|компютрите]] се приема, че една задача се изпълнява на един такт. Паралелните алгоритми се прилагат тогава когато има няколко процесора и тези няколко процесора едновременно обработват и прилагат различните алгоритми. Разпределените алгоритми се осъществяват чрез свързването на няколко машини в една мрежа. Паралелните и разпределените алгоритми се различават от серийните по това ,за разлика от серийните паралелните и разпределителните разбиват задачите на подзадачи. [[Image:algoritym_pic_2.jpg|thumb|right|alt=razpredelitelen algoritym.|Разпределителен алгоритъм.]]
 
 
Детерминирани и недетерминирани
 
 
Детерминираните алгоритми използват една и съща процедура за решаването на задачите като и резултатът е един и същ. При недетерминираните се използват различни начини и подходи за решаването на поставените задачи, които методи се базират на [[евристика|евристики]] и случайност.
 
 
Точни и приблизителни
 
 
При все че много алгоритми достигат до точно решение на даден проблем, по различни причини в практиката се използват и приблизителни алгоритми, които (по горната класификация) могат да бъдат както недетерминирани, така и детерминирани.                          '''Според дизайна'''
 
 
Някои често срещани принципи в [[дизайн]]а на алгоритми са следните:
 
 
[[Динамично програмиране]]
 
 
Когато за дадена задача се знае, че до оптималното решение може да се стигне чрез базиране на оптималните решения на поредица подзадачи, и то такива припокриващи се подзадачи, до които се свежда решаването и на други видове задачи, то се прилага един по-бърз подход, наречен [[[http://bg.wikipedia.org/w/index.php?title=Динамично_програмиране&action=edit&redlink=1 динамично програмиране]]].Чрез този принцип се избягва повторното решение на задачите.
 
 
„[[Разделяй и владей]]“
 
 
Това е процес, при който даден проблем се непрестанно се раздробява на по-малки проблеми докато се стигне до там те да могат да се решат по-лесно. Основната разлика между [[динамично програмиране|динамичното програмиране]] и „[[разделяй и владей]]“ е, че подзадачите са малко или много независими при „[[разделяй и владей]]“, докато подзадачите при [[динамично програмиране|динамичното програмиране]] се припокриват.
 
 
[[Линейно програмиране]]
 
 
При този принцип, проблемът се свежда до откриването на специфични [[неравенства]], които са в сила по отношение на входните [[данни]], и след това се прави опит да се намери максимума (или минимума) на някоя [[[http://bg.wikipedia.org/wiki/Линейна_функция линейна функция]]] над тях.
 
 
Вероятностни,генетични и [[евристика|евристични алгоритми]]
 
 
При вероятностния алгоритъм се съдържа елемент на [[случайност]]та и за него може да се докаже, че в най-доброто решение се съдържа [[случайност]]та.
 
 
При генетичните алгоритми се използват цикли на случайните мутации, които генерират успешни поколения от решения.
 
 
[[евристика|Евристичните]] алгоритми се проявяват в това да се намери приблизително решение в условия на ограничени ресурси или време.                                                                        '''Според приложението'''
 
 
Според областта, в която се прилагат алгоритмите могат да се разделят на много и различни видове: [[алгоритми за търсене]], [[алгоритми за сливане]], [[алгоритми за сортиране]], алгоритми за [[машинно обучение]], [[криптография|криптографски]] алгоритми и други.     
 
 
'''Според сложността'''
 
 
Тук алгоритмите се разглеждат спрямо това колко време е нужно за да се стигне до решението на задачата. Някои алгоритми завършват за [[[http://bg.wikipedia.org/w/index.php?title=Линейно_време&action=edit&redlink=1 линейно време]]], други за [http://bg.wikipedia.org/w/index.php?title=Полиномиално_време&action=edit&redlink=1 полиномиално], трети за [[[http://bg.wikipedia.org/w/index.php?title=Експоненциално_време&action=edit&redlink=1 експоненциално време]]], а някои алгоритми никога не завършват работа.                                                                                                                               
 
 
[[category:Алгоритми]]
 

Версия от 17:22, 18 декември 2011