Доц.

д-р Трајковиќ Владимир

за интерна употреба

Алгоритми и структури на податоци
– белешки од предавања –

10. Техники за креирање
алгоритми
Една честа основна поделба на алгоритмите е поделбата на структурирани
алгоритми и објектно ориентирани алгоритми. Првиот тип на алгоритми во
принцип претпочита реализација на решенија со користење на структурни
програмски јазици, додека вториот претпочита реализација со објектно
ориентирани јазици. Во рамките на овој курс ќе бидат обработени
структурираните принципи за реализација на алгоритми. Важно е да се
напомене дека тие принципи можат да се реализираат и со помош на објектно
ориентираните програмски алатки.
Наједноставна техника за реализација на алгоритмите е техниката на „груба
сила“ (brut force). Основниот принцип на оваа техника за креирање на
алгоритми е да се испитаат сите случаи се додека не се добие бараниот резултат.
Типичен пример за ваков алгоритам е последователното (секвенцијално)
пребарување на елементи во низа. Иако обично неефикасно, оваа техника
гарантира дека ќе го најде коректниот резултат.
Одредена класа на проблеми не може да се решат во прифатливо време со
користење на принципот на груба сила. Исто така некои проблеми немаат
единствено решение, а може да се случи и да немаат решение. Заради тоа е
потребно да се дискутира за принципи, односно техники, кои треба да се
применат при реализација на алгоритмите кои може да се применат за да се
трансформираат влезните податоци во излезни податоци кои го задоволуваат
проблемскиот домен.
Во продолжение ќе бидат разгледани четири архетипи (класи на алгоритми кои
се реализирани на заеднички принципи). Тоа се архетипите: алчни
(максималистички) алгоритми, раздели и владеј алгоритми, алгоритми со
случајни броеви и алгоритми кои се враќаат наназад од резултатот.
Постојат и други принципи за реализација на алгоритми кои се однесуваат за
одредени класи на проблеми, како на пример, алгоритми за дистрибуирано
процесирање, алгоритми кои работат со ограничувања и слично, но тие нема да
бидат предмет на овие предавања.
За секоја од разгледаните техники за креирање на алгоритми ќе бидат дадени
генералниот пристап на нивната реализација и ќе биде разгледан (барем еден)
типичен проблем кој се решава со тој пристап.

1

Поаналитички кажано. 2 . . . j2 за 25.2. просечното време на завршување на процесите е 28. t2. со помош на оваа класа на алгоритми можат да се добијат приближно точни резултати. алгоритмот креирал коректен резултат. Бидејќи процесот j1 завршува за 16 временски единици. па монети за да се намали вредноста на парите што треба да се врати. jn.1. Според техниката на алчни алгоритми. процесот не смее да се прекине. само за дел од проблемскиот домен. во конкретниот случај прво се враќаат две банкноти од 100 денари. j2.3. Така. Доколку е точно. Архетип на „Алчни алгоритми“ (Greedy Algorithms) Постои класа на алгоритми кои претпоставуваат дека во секоја фаза на нивното извршување се донесуваат одлуки кои во тој момент се чинат добри. една од 50 денари. во спротивно креирал коректно решение но. . поради потребата за реализација на брзи алгоритми. На овој начин (намалувајќи ја сумата секогаш со најголемите можни вредности) се добива најмалиот број на банкноти и монети кои треба да се вратат. па потоа една монета од 5 денари и две монети од два денари.Доц. Ова секогаш не мора да биде точно. Процесите треба да се извршат на еден процесор. Поради пристапот кој го „избира најдоброто што се нуди во моментот“. да разгледаме четири такви процеси со време на извршување дадено на слика 10.1. tn. Постојат неколку реални проблеми кои можат да се решат со примена на оваа техника на реализација на алгоритми. иако можеби носат некои идни (во тој момент непознати) нарушувања на исправноста на решението.25 временски единици (пократко чекање) е даден на слика 10. j3 за 30 и j4 за 41 временски единици. со времиња на извршување t1. најпрво се враќаат најголемите банкноти. соодветно. една од 10. д-р Трајковиќ Владимир за интерна употреба 10. оваа класа на алгоритми го добила името алчни алгоритми. . дошол и до глобалниот оптимум. Еден можен распоред на нивно извршување е даден на слика 10. Како пример. . за да се врати кусур од 269 денари. поради неможноста да се добијаат сите влеани податоци). . Кога алгоритмот ќе заврши се верува дека тој доколку можел. На кој начин тие можат да се распоредат за да се добие најдобро средно време на нивно завршување доколку е добиено истовремено барање за нивно извршување? Да се претпостави дека еднаш кога ќе започне. Дистрибуција на процеси кај компјутери со еден процесор (operating system schedule) Нека се дадени процесите (jobs) j1. . Подобар распоред со просечно време на завршување од 21. Проблем на враќање на кусур Најчесто цитиран алгоритам за илустрација на класите на алчни алгоритми е решението на проблемот со точно враќање на кусур со најмал број на банкноти и монети. . Доколку не се бараат најкоректни можни резултати (поради комплексноста на проблемскиот домен. тие алгоритми секогаш го бараат локалното оптимално решение.

кога вториот дел од разликата е најголем.Доц. важи дека првиот процес од конкретниот редослед завршува за ti1 временски единици. Од тука произлегува дека кратките процеси треба да се извршат први.3 Распоред според времетраењето (оптимален) Основната идеа при градењето на овој распоред е да се овозможи побрзо почнување на процесите. вториот за ti1 + ti2. . . Бидејќи во вториот дел од разликата имаме сума на вредности помножени со фактор к кој во секој чекор се зголемува. Прашањето е тогаш.1 Пример процеси со времиња на извршување слика 10. ji2. До ваков заклучок може да се дојде и со следната анализа: За даден редослед на извршување на процесите ji1. д-р Трајковиќ Владимир за интерна употреба Процес Време --------j1 16 j2 9 j3 5 j4 11 слика 10. 3 . е n C = ∑ (n − k + 1)t ik k =1 односно n n k =1 k =1 C = (n + 1)∑ t ik −∑ k ⋅ t ik Првиот дел од оваа разлика не влијае на вредноста на цената. .2 Распоред според името слика 10. односно нивно пократко чекање. . третиот за ti1 + ti2 + ti3 временски единици и така натаму. jin. очигледно е дека е најдобро најголемото к да се помножи со најголемото времетрање од каде произлегува дека колку е процесот пократок тој треба да се извршува побрзо. Од тука следи дека вкупното сумарно време потребно за завршување на сите процеси C (цена на алгоритмот која треба да ја оптимизираме).

Во општ случај. с. доколку имаме С симболи кои треба да се енкодираат на овој стандарден начин потребни се log2 C бита.4 Стандарден начин на претставување на датотека Може да се примети дека иако постојат седум симболи. нова линија и слично). или читање. побрз пренос на датотеките преку интернет и слично). Потребата од компресија на датотеки е повеќе од очигледна за сите што секојдневно ги користат компјутерите (поголема заштеда на дисковиот простор. На овие седум бита се додава еден бит за проверка на парноста кој прави секој ASCII карактер да има парен број на единици (или нули во својата репрезентација) што е особено корисно при проверка на правилно копирање. и. Вкупно постојат 128 симболи за чие претставување (на секој симбол поединечно) се потребни log2 128 = 7 бита (низи долги 7 нули и единици во бинарна форма на дисковиот простор). тие во датотеката не се појавуваат еднакво често. Ова е типично скоро за сите датотеки. за секој од овие 7 симболи се потребни 3 бита што резултира во датотека голема 174 бита. т. три симболи с. Доколку дозволиме кодовите на симболите да се со променлива должина и при тоа внимаваме кодовите на симболите што се чести да бидат кратки. празни и нови редови (што е исто така симбол). симбол код честост вкупно бити -------------------------------------a 000 10 30 e 001 15 45 и 010 12 36 с 011 3 9 т 100 4 12 празно 101 3 39 ентер 110 1 3 -------------------------------------Вкупно 174 слика 10. д-р Трајковиќ Владимир за интерна употреба Кодови на Хофман (Huffman Codes) Кодовите на Хофман кои се користат при компресијата на датотеки. Согласно слика 10.Доц. Да претпоставиме дека имаме обична текстуална датотека. може да се добие заштеда во големината на датотеката (компресија) од 25% до 60%. Нека постојат десет симболи a. четири т. петнаесет симболи e. самогласките се јавуваат почесто од согласките. добиена на пример со notepad. дванаесет симболи и. Стандардното множество на ASCII карактери кое тогаш се користи се состои од стотина симболи кои се видливи и триесетина кои се специјални (празно. 4 . Нека имаме датотека која ги содржи само симболите: a. тринаесет празни симболи и една нова линија (ентер). исто така се добиваат со примена на алчните принципи во креирањето на алгоритми. За да се види како датотеките можат да се компримираат потребно е да се даде принципот за начинот на нивно енкодирање (чување во дисковиот простор). e.4. со едноставна анализа се потврдува дека во текстуалните датотеки. На пример.

содржината на датотеката може да се протолкува недвосмислено без разлика на должината на кодовите кои се користат за секој од симболите. во кое сите симболи се сместени во листовите. Таа шема на кодирање е дадена на слика 10. но поради фактот што тој во датотеката се појавува само еднаш. за предходниот пример.6. со користење на репрезентацијата од слика 10. заштедата која е добиена на овој начин е само еден бит. бинарното дрво на симболи е дадено на слика 10. На пример нека биде дадена следната битова секвенца. Симболот „с“ е пристапен доколку од коренот се движиме лево.нл) има само едно дете. д-р Трајковиќ Владимир за интерна употреба Бинарниот код може да се претстави со помош на опишување на патеката од коренот до листот во бинарно дрво.6 5 . Така. Очигледно е дека едно подобрување на ова кодирање ќе се постигне доколку дрвото го направиме комплетно (секој јазел да има две деца) што се постигнува со едноставно поместување на јазелот нл за еден погоре.new line .Доц. Со ова се постигнува тој симбол да е репрезентиран со двобитен код (11). слика 10. а на десно користење на 1 во бинарниот код. затоа што таткото на јазелот кој го претставува симболот нов ред (enter . па десно па десно што резултира во код 011.5 Репрезентација на стандардното енкодирање со бинарно стебло слика 10.5.6 Малку подобра репрезентација Доколку симболите се наоѓаат само во листовите на стеблата. Секое движење на лево озаначува користење на 0. Се забележува дека ова стебло не е потполно.

7 Пример за оптимално енкодирање Можат да постојат повеќе оптимални кодови. т. 6 . и. симбол код честост вкупно бити ------------------------=-------------a 001 10 30 e 01 15 30 и 10 12 24 с 00000 3 15 т 0001 4 16 празно 11 13 26 ентер 00001 1 5 --------------------------------------Вкупно 146 слика 10. а исто така ни 01 но 010 е код за симболот и. Тој почнува од шума од N стебла од по еден јазел (по едно стебло за секој симбол). овој начин на енкодирање (кој е основа за поголемиот број форми на компресија) се нарекува Хофманово кодирање. празно. за интерна употреба е претставена со секвенцата Бидејќи 0 не е валиден код. Хофмановиот алгоритам работи на следниот начин.7. д-р Трајковиќ Владимир односно нека датотеката 0100111100010110001000111. Поради тоа.8. се додека не се добие само едно стебло се обединуваат двете стебла со најмали тежини. На секое од стеблата е придружена тежинска вредност еднаква на честотата на појавување на симболите во датотеката. оптимално енкодирање се добива со стеблото на кодирање дадено на слика 10. Алгоритмот на генерирање на стебло за оптимално енкодирање бил даден од Хофман (Huffman) во 1952. За примерот од слика 10. Со слична анализа следи кодот 011 кој го означува симболот т. кое резултира со датотека голема само 146 бита.Доц. можеме да заклучиме дека првиот симбол даден во датотеката е симболот и. Постапката за креирање на хофмановиот код за предходниот пример е даден на слика 10. Тежината на новодобиеното стебло е еднакво на збирот од тежините на двете стебла кои се обединуваат. Потоа. e и нова линија.4. Потоа следи 11 кој е двобитен код за нова линија и така натаму добиваме a.

д-р Трајковиќ Владимир за интерна употреба слика 10.Доц.8 Илустрација на алгоритмот на Хофман 7 .

0. Треба да се напомене дека при користење на ова кодирање.2. 0. слика 10. Проблем на пакување на ранец (Knapsack algorithm) Нека бидат дадени n пакети со големини s1.Доц. што е лошо затоа што за мали датотеки во голема мера влијае на големината на датотеката. Ова може да влијае на ефикасноста на алгоритмот особено ако се работи за големи датотеки. 0. 0. 0. . 0.7. Нека за сите големини важи 0 < si 1. Тоа ја потврдува можноста за повеќе оптимални решенија и охрабрува да се користи алчниот пристап. (Треба да се искористи најмал број на ранци). 0.3.3. најретко користените симболи имаат најдолги кодови.8 Постојат две верзии на алгоритмот кој го реализира пакувањето на пакети.4.5. Исто така треба да се знае дека кодирањето со помош на овој алгоритам се реализира во две фази: фаза на утврдување на користените симболи и нивната честота и фаза на креирање на стеблото на кодирање. .1.5.2.4. Проблемот на пакување го бара оптималното пакување на пакетите во ранци со големина 1. 0. Во вториот случај познати се сите големини на пакети однапред. истиот нема да биде изложен. Во првата верзија не се знае следната големина на пакетот во низата се додека тековниот пакет не се смести во некој ранец (типичен пример е black jack играта каде се собира збирот 21 од превртен шпил карти). Поради комплексноста на доказот за коректноста на овој алгоритам (кој користи индукција). 0.8. s2. на почетокот на датотеката треба да бидат дадени кодовите за сите симболи.9 Оптимално пакување на пакети со големина 0. . Се приметува дека во секој чекор се избира најмалиот збир од тежини што го квалификува овој алгоритам во класата на алчни алгоритми.1. sn. . 8 . 0. Примерот на слика 10.7. 0. 0.9 го дава оптималното пакување за пакети со големина: 0. Често пати овој проблем се нарекува и проблем на крадецот кој имал торби кој можеле да носат X килограми злато и златни предмети со различни тежини. д-р Трајковиќ Владимир за интерна употреба Визуелна потврда за коректноста на алгоритмот е фактот што најчесто користените симболи имаат најкратки кодови и обратно. При тоа исто така треба да се забележи дека не е важно дали Т5 и Т4 ќе се спојат на начинот даден во примерот или обратно.

0. 0.9.5. 0. 0. Со оваа стратегија (алгоритам) за секој пакет се проверуваат сите ранци од почеток и пакетот се сместува во првиот ранец кој има простор да го собере.Доц.10 е дадено пакувањето на пакети со овој алгоритам за истиот редослед на пакети кои се оптимално спакувани на слика 10.5. 0.2. 0. На слика 10. 2/n. 0.4. Овој алгоритам очигледно работи во линеарно време но не секогаш дава оптимални резултати. . Едноставна реализација на овој алгоритам има O(n2) 9 .5. слика 10.3. . 2/n.11 Примена на „Next fit“ пакувањето за пакети со големина 0. д-р Трајковиќ Владимир за интерна употреба Наједноставен алгоритам за решение на овој проблем е алгоритмот „next fit“. Тој случај е претставен на слика 10. Друг пристап за креирање на алгоритам за пакување на пакетите е „first fit“ стратегијата. Доколку нема место.8 Во најлош случај овој алгоритам користи двојно повеќе ранци од оптималното решение. се проверува следниот ранец и така натаму се додека не се најде првиот ранец во кој има доволно место каде што пакетот се сместува. слика 10. Нов ранец се користи само доколку нема простор во предходно започнатите ранци.10 Примена на „Next fit“ пакувањето за пакети со големина 0. 2/n. При сместување за секој следен пакет се проверува дали има место во ранецот каде што бил сместен предходниот пакет. Првиот пакет се сместува во првиот ранец.7. 0.11.1.5. .

На слика 10.13.12 е дадено пакувањето кое се добива со примена на овој алгоритам за пакетите со големина 0. Илустрација на примена на овој алгоритам е дадена на слика 10.7. слика 10. Иако најлошиот случај на „Next Fit“ алгоритмот едноставно се решава со примена на „First fit“ алгоритмот и овој алгоритам во одредено сценарио користи скоро двојно повеќе ранци од оптималниот број ранци потребен за пакување на пакетите.4. но можно е да се реализира и со O(n log n) временска комплексност. 0.1.5. д-р Трајковиќ Владимир за интерна употреба временска комплексност.2.12 Примена на „First fit “ пакувањето за пакети со големина 0. 0.7. 0.1.8 Алгоритмот „Best fit“ го сместува пакетот во ранецот во кој има најмал простор доволен да го собере пакетот со дадена големина.8.Доц. слика 10. 0.2.8 10 . 0. 0. 0.4.1.5. 0. 0.3. 0. 0. 0.2. 0. 0. 0.5.13 Примена на „Best fit “ пакувањето за пакети со големина 0. 0.4.3 и 0. 0.7.3.

некои алгоритми природно се решаваат со помош на оваа парадигма. д-р Трајковиќ Владимир за интерна употреба 10.коренот на стеблото. разделените подпроблеми треба да се дисјунктни. Типични класи проблеми кои се решаваат со помош на оваа техника се скоро сите алгоритми кои работат со бинарни стебла. Типични примери за примена на оваа техника на градење на алгоритми се рекурзивните изведби на сортирањето со спојување (mergesort). Владеј: Слејувањето на резултатите се состои од наоѓање на поголемата од двете добиени висини и нејзино зголемување за еден. Во принцип. овој алгоритам би се состоел од селедните чекори: Проблем: Најди висина на стебло. Така на пример алгоритмот за проблемот на наоѓање на висина на стебло може да се опише со една реченица: „Висината на стебло е за еден поголема од поголемата од висините на левото и десното подстебло на коренот на стеблото“. Елементарен случај: Висина на лист е еден. Архетип на „Раздели и владеј“ алгоритми (Divide and Conquer) Честа техника за реализација на алгоритми е примената на принципот „раздели и владеј“. Владеј: Решението на проблемот се добива од решенијата на поедноставните проблеми со помош на така наречено „слевање“ на решението. Висина на нулта врска е нула. може да се каже дека секој алгоритам кој користи барем два вгнездени рекурзивни повици го користи принципот раздели и владеј. Обично. Оваа техника во принцип секогаш резултира во коректен алгоритам и се состои од два чекора: Раздели: Проблемот се дели на помали проблеми се додека не се дојде до елементарни или базични случаи. Бинарното пребарување исто така претставува одличен пример за илустрација на оваа техника. Поради рекурзивната дефиниција на податочната структура стебло.Доц. односно да не се преклопуваат. Раздели: Подпроблеми: Најди висини на лево и десно подстебло на даден јазел. хип сортирањето (heap sort) и брзото сортирање (quicksort). 11 . Од аспект на користење на рекурзија. се користи рекурзија. Со поформална дефиниција на парадигмата „раздели и владеј“.2. Се претпоставува дека стеблото има барем еден јазел .

слика 10. нејзината временска комплексност може во принцип да се опише со следната итеративна формула T(n) = 2T(n/2) + O(n) која води до типична временска комплексност на извршување на оваа класа на алгоритми од O(n log n). множење на матрици). Доколку техниката на развој на алгоритми „раздели и владеј“ се реализира со два вградени рекурзивни повици. Одредени класи проблеми кои работат со графови исто така ја користат оваа парадигма.14 Примена на „раздели и владеј“ за наоѓање на максимална вредност во низа од броеви 12 . како и за класи на пресметувачки проблеми (брза фуриева трансформација. На слика 10.14 е дадена графичка илустрација на примената на техниката „раздели и владеј“ за наоѓање на максимум од множество (низа на броеви). најмал конвексен полигон кој опфаќа множество точки).Доц. д-р Трајковиќ Владимир за интерна употреба Оваа парадигма се користи и за решавање на одредени класи геометриски проблеми (најблиски точки во рамнина.

else /*3*/ return( fib(n-1) + fib(n-2) ). што се должи на повторување на рекурзивните повици.15 Стебло на рекурзивни повици за пресметување на фибоначиевите броеви 13 . /* Presmetuvanje na Fibonacci */ unsigned int fib( unsigned int n ) { /*1*/ if( n <= 1 ) /*2*/ return 1.15.Доц. } Нека Т(n) е времетраењето на извршување на функцијата fib(n). Очигледно е дека времетраењето е 1 (за споредбата) + делот после else-oт кој пак има една едноставна операција и два рекурзивни повика со должина (според предходната претпоставка) T(n-1) и T(n-2) соодветно.2) + 2 Со едноставна анализа (со примена на истото размислување за првите два члена на сумата добиваме по два нови во следниот чекор и така натаму) се заклучува дека растот (кардиналноста) на оваа фунција е експоненционален – О(2n). Лесно се утврдува дека со првиот повик на линија 3 се пресметува вредноста fib(n-2). слика 10. Ова претставува типичен пример за неефикасен алгоритам.1) + T(n . Пример на таков код што реализира рекурзивен алгоритaм е кодот за рекурзивно пресметување на фибоначиевите броеви даден и во првото поглавје (споредба на алгоритмите).3 Динамичко програмирање (Dynamic Programming) Рекурзивното решение на одредени проблеми често може да резултира во неефикасен код. Така добиваме: T(n) = T(n . д-р Трајковиќ Владимир за интерна употреба 10. Очигледно е дека за пресметување на Ф6 дури пет пати се повикува функцијата која го пресметува Ф2. која потоа повторно се пресметува при вториот повик на линија 3. Дрвото на рекурзивни повикувања кои се извршуваат со овој код е дадено на слика 10.

last = answer. for( i = 2. д-р Трајковиќ Владимир за интерна употреба Преведувачот на оваа програма често врши повици на иста функција со исти аргументи. next_to_last = last. answer. може да утврдиме дека за пресметување на следниот број. } Од погоре кажаното следи дека принципот на динамичко програмирање. unsigned int fibonacci( unsigned int n ) { unsigned int i. last = next_to_last = 1. обично се користи кога со примена на другите принципи се добиваат голем број на резултати кои не може едноставно да се слеат или повторно искалкулираат. if( n <= 1 ) return 1. Доколку се вратиме на примерот за пресметување на фибоначиеви броеви. i <= n. } return answer. што може да се избегне ако резултатите од пресметките се чуваат во табела. 14 . next_to_last. Техниката на градење на алгоритми која ги сочувува резултатите на подпроблемите во табели за да се искористат по потреба се нарекува „динамичко програмирање“. ни треба да ги запомниме само двата последни пресметани броеви во некоја меморија. Така креираниот алгоритам за пресметување на фибоначиевите броеви има временска комплексност О(n). i++ ) { answer = last + next_to_last. last.Доц.

но никогаш нема да знаат (затоа што тоа нема да го знае ни професорот) за кој дел од материјалот ќе биде тестирањето. За одредена класа на проблеми (како на пример за проблемот опишан во примерот) не постои решение со алгоритам кој не користи случајни броеви. пред студентите да фрла паричка при што на пример доколку паричката падне на „глава“. но и непредвидливи тестирања. Да претпоставиме дека професорот може да си дозволи проверка на 50% од материјата преку тестови. Доколку професорот сака да воспостави некоја „шема“ на тестирање. Поради бројноста на студентите и немањето доволно време. Доколку тестовите не се најавуваат. Колку пати нешто ќе се случи (колку ќе трае алгоритмот) не зависи само од влезните податоци туку и од некоја случајна вредност. Сличен ефект се постигнува и со најавување на тестовите. со што не би се изгубило целото време потребно да се реализира наставата од една страна и би се извршила некаква проверка на моменталните знаења од друга страна. На тој начин студентите во просек ќе бидат проверени за 50% од материјалот. Реализацијата на таквите тестови има многу недостатоци. Релативно лесно се покажува дека најлошото време на извршување на алгоритми кои користат случајни броеви е обично исто како најлошото време на извршување на алгоритмите кои за решавање на истиот проблем не користат случајни броеви. професорот не може да си дозволи секој час да го проверува знаењето на студентите (или поточно фактот дека решенијата од домашните не се препишани). нема гаранција дека таа нема да биде „пробиена“ од студентите (Всушност тоа треба да се очекува). Доколку тестовите се однесуваат само на важните теми. се дозволува студентите да обратат внимание само на одреден дел од темите.4 Алгоритми со случајни броеви (Randomized Algorithms) Одредена класа на проблеми (како проблемите на проверка дали големи броеви се прости) или потребата од подобрување на алгоритмите за пребарување и вметнување на елементи во податочни структури имаат потреба од користење на случајни вредности. иако е тоа единствен начин со потполна сигурност да се потврди посветеноста на знаењето на студентите.Доц. Една опција е повремено организирање на тестови. Овој пример илустрира алгоритам во кој се користи секвенца од случаен број (нула или еден) за донесување на одлука. Како типичен пример кој ја илустрира потребата за користење на случајни броеви е проблемот кој го има секој професор ако се однесува за проверката на знаење на студентите (или пратењето на наставата на студентите). Наједноставниот начин да го направи тоа е да спреми тестови за секоја тема и после секој час. студентите лесно ќе ги дознаат темите од интерес од предходните генерации. Значи професорот треба да изврши ненајавени. без тоа да влијае на времето потребно да се реализира наставата. но се однесуваат за фиксни теми. ќе се одржи тестирање. д-р Трајковиќ Владимир за интерна употреба 10. 15 .

Разликата меѓу случајните и псевдослучајните броеви лежи во тоа што псевдослучајните броеви задоволуваат одреден број (но не сите) статистички карактеристики кои ги задоволуваат случајните броеви.Доц. Иако скоро секој програмски јазик содржи функција која се декларира како генератор на случајни броеви. таа (поради природата и начинот на работа на преведувачите) користи некој алгоритам. д-р Трајковиќ Владимир за интерна употреба Основниот проблем при реализацијата на алгоритмите кои користат случајни броеви е потребата од генератор на случајни броеви. Поради тоа случајните броеви кои се добиваат со помош на компјутерите се нарекуваат псевдослучајни броеви. а не случаен резултат. 16 . со што дозволува при исти услови (влезни податоци) да генерира ист број со што се добива предвидлив. Во основа на алгоритмите за псевдослучајни броеви лежи принципот дека влезните податоци многу ретко (скоро никогаш) не се исти.

затоа што едниот играч (на пример човекот) се труди да ја намали вредноста на позицијата на опонентот додека вториот (на пример компјутерот) да ја зголеми вредноста на позицијата. д-р Трајковиќ Владимир за интерна употреба 10. вредноста на позицијата ќе се одреди со претпоставка дека двете (или генерално сите) страни што играат ќе ги играат потезите кои ќе направат најголема добивка за нив. За таа цел прво се евалуираат позициите на листовите.Доц. Со други зборови се врши „поткастрување“ на проверките или комбинациите кои не „водат“ кон задоволителен резултат. Архетип на враќање наназад (Backtracking Algorithms) Алгоритмите кои го користат архетипот враќање наназад. Илустрација на овој принцип за произволна игра за која се пресметани вредностите на позициите е дадена на слика 10.нула“ (tic-tac-toe). поради претпоставката дека некој чекор не води кон саканото решение се отфрла множество на проверки. Според предходно кажаното. 17 . Иако во принцип се можни сите комбинации.17. доколку компјутерот е на потег тој ќе ја избере најдобрата позиција после потегот на човекот. Генералната стратегија е да се користи функција на евалуација која ќе оцени колку е добра моменталната позиција. Еден едноставен пример е распоред на мебел по соби во празен стан. При тоа треба да се има на ум. Со анализа на сите можни потези кои можат да се играат во таа игра се добива стеблото на позиции на играта. дека идејата на оваа класа на алгоритми е да се овозможи на компјутерот да го избере најдобриот потег и при тоа алгоритмот да биде генерален за сите (или поголемиот дел) стратегиски игри. Една класа на проблеми кои се решаваат со оваа техника за развој на алгоритми се дел од проблемите од пресметовна геометрија (главно тополошки проблеми). оваа игра секогаш води кон нерешен резутат. Позиција која носи победа за компјутерот може да се означи со +1. Ако позицијата не е крајна (ако се можни следни потези).16. За да се одреди стратегијата на играта се врши евалуирање на сите вредности на позициите однапред. нерешено со 0. дадено на слика 10. Овој принцип се нарекува „минимакс“ стратегија. односно најдобрата позиција од множеството позиции кои човекот би ги играл за да ја намали вредноста на позициите кои се на избор. Разликата од тие алгоритми е тоа што. Распоредот на мебел вообичаено занчи разместување на мебелот низ собите се додека не се добие задоволителен распоред. Како пример да ја разгледаме играта „икс . Втора често користена класа проблеми кои ја употребуваат оваа парадигма се компјутерските стратегиски игри. во принцип се алгоритми кои се базираат на архетипот груба сила. Ова придонесува за зголемување на ефикасноста на оваа класа алгоритми. а загуба со -1. ретко се пробува комбинацијата која содржи сместување на трпезариска маса во купатило.5. Доколку се игра најдобро.

нула“ слика 10. Една често применувана техника е градење на стеблото на дрвото до одредена длабочина и евалуирање на терминалните јазли со функција која ги претпоставува вредностите на позициите со користење на некој хевристички алгоритам.17 Илустрација на „мин-макс“ стратегијата за бирање на следен потег во игра За покомлексни игри (како на пример шахот) не може да се изгради стеблото на сите можни потези и да се оцени со помош на минимакс стратегијата кој е најдобриот потег.16 Стебло на позиции на играта „икс . поради огромниот број на можни комбинации на потези.Доц. д-р Трајковиќ Владимир за интерна употреба слика 10. При тоа исто така може да се 18 . па користење на минимакс функцијата.

Може да се примети дека скоро половина од терминалните јазли не се проверени. Најзначајно намалување на бројот на проверки се добива со така нареченото α-β поткастрување. па да се искористи табела на вредности на некои чести позиции.18 е прикажана евалуацијата на моменталната позиција со користење на ова поткастрување. д-р Трајковиќ Владимир за интерна употреба случи комбинација од различни потези да доведе до иста ситуација. Тоа се должи на фактот дека вредностите на тие позиции не влијаат на вредноста на коренот доколку се примени мимимакс стратегијата. На слика 10.Доц. слика 10.18 Илустрација на „ α-β “ поткастрување 19 .

Sign up to vote on this title
UsefulNot useful