Алгоритамска ефикасностУ рачунарској науци, алгоритамска ефикасност је свосјтво алгоритма које је повезано са количином рачунарских ресурса које алгоритам користи. Алгоритам мора бити анализиран да би се одредило његово коришћење ресурса. Алгоритамска ефикасност може бити замишљена и као аналогна са инжињерском продуктивношћу током понављаног или континуалног процеса. За максималну ефикасност желимо да минимизирамо коришћење ресурса. Међутим, различити ресурси (нпр. време, простор) не могу бити поређени директно, тако да то који је од два алгоритма ефикаснији често зависи од тога која мера за ефикасност је најважније, нпр. потреба за великом брзином, минималним коришћењем меморије или нека друга мера.
ПозадинаВажност ефикасности је у прошлости нагласила Ада Лавлејс 1843. применом механичког аналитичког мотора Чарлса Бебиџа:
Стари електронски рачунари су врло ограничени и од стране брзине операција и количине доступне меморије. У неким случајевима је увиђено да постоји простор-време размена, при чему задатак може бити решен коришћењем брзог алгоритма који заузима прилично пуно меморије, или коришћењем спорог алгоритма који користи врло мало радне меморије. Инжињерска размена је онда била да се користи најбржи алгоритам који би стао у доступну меморију. Модерни рачунари су много бржи од раних рачунара, и имају много већу количину доступне меморије (гигабајте уместо килобајта). Ипак, Доналд Кнут је нагласио да је ефикасност и даље важна за разматрање:
ПрегледАлгоритам се сматра ефикасним ако његова потрошња ресурса (или рачунска вредност) на или испод неког прихватљивог нивоа. Грубо речено, "прихватљивих" значи: радиће разумно много времена на доступном рачунару. Од 1950-их компјутери су доживели драматично повећање доступне рачунарске моћи и доступне меморије, тако тренутни прихватљиви нивои би били неприхватљиви чак и пре 10 година. Произвођачи компјутера често доносе нове моделе, често са бољим перформансама. Цене софтвера могу бити врло високе, тако да је у неким случајевима најједноставнији и најјефтинији начин да се добиу боље перформансе да се купи бржи рачунар, уз обезбеђење да је компатибилан са постојећим рачунаром. Постоји много начина мерења колико алгоритам користи ресурса: два најчешћа мерења су брзина и коришћење меморије; друга мерења би могла да укључују брзину преноса, привремено коришћење диска, дугорочно коришћење диска, потрошња енергије, цена поседовања, време реаговања на спољашње стимулације, итд. Многе од ових мерења зависе од величине уноса у алгоритам (нпр. количина података који треба да се процесуирају); могу такође да зависе од начина на који су подаци распоређени (нпр. неки алгоритми за сортирање се лоше показују на подацима који су већ сортирани, или који су сортирани у обрнутом редоследу). У пракси, постоје други фактори који утичу на ефикасност алгоритма, као што су захтеви за прецизношћу и/или поузданошћу. Доле објашњен, начин на који је алгоритам имплементиран може имати велики ефекат на ефикасност, кроз много аспеката ово је повезано са проблемима оптимизације. Теоретске анализеУ теоретској анализи алгоритама, нормална пракса је да се процени њихова комплексност у асимптотском смислу, нпр. коришћење нотације велико О да се репрезентује комплексност алгоритма као функције са улазом величине н. Ово је генерално довољно прецизно када је н велико, али може бити спутавајуће за мале вредности н (нпр. бабл сорт може бити бржи од квиксорта када само неколико ствари треба да се сортира). Неки примери великог О укључују:
Тестирање: мерење перформансиЗа нове верзије или да се омогући поређење компетитивних система, тестирање се понекад користи, који асистирају са мерењем алгоритамских релативних перформанси. Ако се на пример произведе нови алгоритам за сортирање може бити упоређен са својим прецима да би се осигурало да је ефикасан као и раније са познатим подацима- узимајући у обзир сва функционална побољшања. Тестирања могу да користе муштерије када упоређују различите производе алтернативних добављача да би проценили који производ ће најбоље да одговара њиховим потребама у смислу функционалности и перформанси. На пример у главном делу светског власништва продуката за сортирање у независним софтверским компанијама као што је Синксорт се такмиче са продуктима које добављају велики добављачи као што је IBM за брзину. Нека тестирања обезбеђују прилике за произвођење анализе која упоређује релативну брзину различитих састављених и интерпретираних језика на пример и The Computer Language Benchmarks Game упоређује перформансе имплементација типичних програмерских проблема у неколико програмских јзика. (Чак и стварање "уради сам" тестирања да би се добила макар нека захвалност релативних перформанси различитих програмских језика, коришћењем различитих критеријума специфицираних од стране корисника, је лако да се произведе "окупљање групе девет перформансних језика" од Кристофера Ковела демонстрира на примеру) Проблеми имплементацијеПроблеми импементације могу да имају ефекат на ефикасност, као што је избор програмског језика, или начина на који је алгоритам кодиран, или избор компајлера за одређени језик, или компилација поменутих опција, или чак који се оперативни систем користи. У неким случајевима језик који се имплементира од стране интерпретатора може бити много спорији од језика имплементираног од стране компајлера.[3] Постоје други фактори који могу да утичу на временске или просторне проблеме, али који могу бити ван контроле програмера; они укључују усклађивање података, грануларност података, скупљаче ђубрета, паралелизам на нивоу инструкција, позиви подрутина.[4] Неки процесори имају способност векторског процесуирања, које дозвољава да једна инструкција оперише над више операнада; то може и не мора да буде лако програмерима или компајлерима да користе. Алгоритми дизајнирани за секвенцијално процесуирање можда треба да буду потпуно редизајнирани да би се искористило паралелно процесуирање. Још један проблем који може да настане са компатибилним процесорима је да они могу да имплементирају инструкцију на различите начине, тако да инструкције које су релативно брзе на неким моделима, на другим моделима могу да буду релативно споре; ово може загорчати живот оптимизирајућем компајлеру. Мере коришћења ресурсаМере се обично представљају као функције са величином лаза н. Две најчешће мере су:
За компјутере чија је снага снадбдевена батеријом (нпр. лаптопови), или врло дуге/велике калкулације (нпр. суперкомпјутери), друге мере од интереса су:
У неким случајевима друге мање честе мере могу да буду такође релевантне:
ВремеТеоријаАнализирање алгоритма, типично коришћењем анализе временске комплексности да се добије просек времена извршавања као функција за величину унетих података. Резултат је обично представљен нотацијом велико О. Ово је корисно за упоређивање алгоритама, посебно када се велика количина података процесуира. Детаљније процене су потребне за поређење алгоритама када је количина података мала (иако у овој ситуацији време не може да буде неки проблем у сваком случају). Алгоритми који укључују паралелно процесуирање могу да буду тежи за анализирање. ПраксаКоришћење тестирања да се измери корисност алгоритма. Многи програмски језици имају доступну функцију која даје потрошњу времена процесора. За алгоритме који дуго трају протекло време може бити значајно. Резултати би генерално требало да буду упросечени кроз неколико тестова. Овај тип тестирања може бити веома осетљив на хардверску конфигурацију и могућности програмера или проблема да се догађају истовремено на мулти процесуираном и мулти програмерској околини. Ова врста теста такође зависи много од селекције одређеног програмског језика, компајлера, и компајлерских опција, тако алгоритми који се пореде морају бити имплементирани под истим околностима. ПросторОва секција се бави коришћењем главне меморије (често РАМ) док се алгоритми дешавају. Као и временска анализа изнад, анализа алгоритама, типично користећи анализу временске комплексности да се процени меморија потребна за функцију за унесене податке. Резултат је често представљен нотацијом велико О. Постоји чак четири аспекта коришћења меморије који треба да се размотре:
Рани електронски рачунари, и рани домаћи рачунари, имају релативно малу количину радне меморије. Нпр. 1949 EDSAC је имао максималну радну меморију од 1024 17-битних речи, док 1980 Sinclair ZX80 је у почетку имао 1024 8-битне бајтове радне меморије. Тренутни рачунари имају релативно велику количину меморије (могуће Гигабајте), тако да скупљање алгоритма у што мању меморију је много мањи проблем него што је некада био. Али присуство три различите категорије меморије може бити врло важно:
Алгоритам чија меморија треба да стане у кеш меморију ће бити много бржа од алгоритма који стаје у главну меморију, што ће за узврат бити много брже од алгоритма који је у виртуелној меморији, Да даље закомпликујемо проблем, неки системи имају до три нивоа кеш меморије, са варирајућим ефикасним брзинама. Различити системи ће имати различите количине ових различитих типова меморије, тако да ефекат меморије која је потребна алгоритму варира поприлично од једног система до другог. У раним данима електронског рачунарства, ако алгоритам и његови подаци не стају у главну меморију онда алгоритам не може да се користи. Данас коришћење виртуелне меморије изгледа да доприноси много меморије, али на рачун перформанси. Ако алгоритам и његови подаци стају у кеш меморију, онда се може постићи велика брзина; у овом случају минимизирање простора би такође допринело минимизирању времена. Алгоритам коју не може у потпуности да стане у кеш меморију али који показује локалност референци може поприлично добро да се покаже. Примери ефикасних алгоритама
Критика тренутног стања програмирања
Такмичења за најбоље алгоритмеСледећа такмичења позивају на најбољи алгоритам засновано на неким арбитрарним критеријумима одређеним од стране судија:
Види још
Референце
Литература
Спољашње везе
|
Portal di Ensiklopedia Dunia