10 2013  · 2017-09-14 · Глава 1 - Компютърна информатика,...

740
Скъпи читатели, Поради постоянното изчерпване на книгата и трудностите с намирането й в мрежата за разпространение решихме да ви направим малък „подарък“, като публикуваме книгата безплатно в електронен вид (лицензът за рапространение се намира на страница 2). С пожелание за много успехи, 10 февруари 2013 Панайот и Преслав За контакти с нас (авторите): Уеб сайт на книгата: http://www.programirane.org Facebook група: http://www.facebook.com/groups/168112146541301

Upload: others

Post on 10-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Скъпи читатели,

    Поради постоянното изчерпване на книгата и трудностите с намирането й в мрежата

    за разпространение решихме да ви направим малък „подарък“, като публикуваме книгата

    безплатно в електронен вид (лицензът за рапространение се намира на страница 2).

    С пожелание за много успехи, 10 февруари 2013

    Панайот и Преслав

    За контакти с нас (авторите):

    Уеб сайт на книгата: http://www.programirane.org

    Facebook група: http://www.facebook.com/groups/168112146541301

    http://www.programirane.org/http://www.facebook.com/groups/168112146541301

  • Глава 1 - Компютърна информатика, алгоритми и програмиране 2 от 740

    ©Автори: Преслав Наков и Панайот Добриков, 2012.

    Всички запазени марки, използвани в тази книга, са собственост на техните притежатели.

    Всички права запазени. Никоя част от съдържанието на тази книга не може да бъде

    репродуцирана или предавана под каквато и да е форма или по какъвто и да е повод без

    писменото съгласие на авторите.

    Авторите на книгата „Програмиране = ++Алгоритми;“ Преслав Наков и Панайот Добриков ви

    предоставят заедно с настоящия pdf файл еднократен, безсрочен, персонален, нетрансферуем

    лиценз за ползване на книгата за лични и некомерсиални цели. В допълнение настоящият лиценз

    дава право на преподаватели в български училища и университети да използват същата в процеса

    на обучение, например като учебник или за подготовка на учебни материали. Настоящият лиценз

    не позволява книгата да се разпространява допълнително под каквато и да е форма, както и да се

    променя съдържанието на този pdf файл.

  • Съдържание

    СЪДЪРЖАНИЕ ............................................................................................................................. 3

    ПРЕДГОВОР ОТ НАУЧНИЯ РЕДАКТОР .......................................................................... 13

    ПРЕДГОВОР КЪМ ТРЕТОТО ИЗДАНИЕ........................................................................... 15

    ГЛАВА 0 КОМПЮТЪРНА ИНФОРМАТИКА, АЛГОРИТМИ, ПРОГРАМИРАНЕ 17 0.1. ПЕРСПЕКТИВНИ НАПРАВЛЕНИЯ В КОМПЮТЪРНАТА ИНФОРМАТИКА .................................... 18

    0.1.1. Връзка компютър-потребител ................................................................................... 18 0.1.2. Компютърни комуникации и сигурност .................................................................... 19 0.1.3. Новаторски компютърни архитектури ................................................................... 20 0.1.4. Моделиране на сложни феномени ............................................................................... 20 0.1.5. Изкуствен интелект ...................................................................................................... 21 0.1.6. Нетрадиционни методи за изчисление ...................................................................... 21 0.1.7. Фундаментална компютърна информатика ........................................................... 22

    0.2. ПОНЯТИЕТО ЛЕЙМЪР................................................................................................................ 23 0.3. РАЗВИТИЕ НА АЛГОРИТМИТЕ ................................................................................................... 24

    0.3.1. Произход на думата “алгоритъм”............................................................................. 24 0.3.2. Алгоритмите през вековете......................................................................................... 25 0.3.3. Анализ на алгоритмите ................................................................................................. 25 0.3.4. Изчислимост .................................................................................................................... 26

    0.4. ПРОГРАМИРАНЕ = ++АЛГОРИТМИ........................................................................................... 26 0.4.1. За кого е предназначена книгата ................................................................................ 26 0.4.2. Кратко представяне на съдържанието ................................................................... 27 0.4.3. Защо Cи? .......................................................................................................................... 28 0.4.4. Конвенция на изходните текстове ............................................................................. 29

    0.5. “СЛЕДГОВОР” ........................................................................................................................... 29 Посвещение ................................................................................................................................. 29 0.5.1. Благодарности ................................................................................................................ 29 0.5.2. Търсене на грешки........................................................................................................... 30 0.5.3. Коментари и въпроси .................................................................................................... 30

    ГЛАВА 1 ВЪВЕДЕНИЕ В АЛГОРИТМИТЕ ...................................................................... 33 1.1. ОСНОВНИ МАТЕМАТИЧЕСКИ ПОНЯТИЯ И АЛГОРИТМИ........................................................... 33

    1.1.1. Основни математически понятия .............................................................................. 33 - Множества ...........................................................................................................................33 - Числа....................................................................................................................................35 - Целочислено деление и остатък. Брой цифри на естествено число ...................................37 - Сума и произведение...........................................................................................................38 - Степен, логаритъм, n-ти корен ............................................................................................39 - Факториел. Рекурентни функции ........................................................................................40 - Матрици ...............................................................................................................................41

    1.1.2. Намиране броя на цифрите на произведение ........................................................... 43 1.1.3. Прости числа................................................................................................................... 44

    - Проверка дали дадено число е просто................................................................................45 - Решето на Ератостен. Търсене на прости числа в интервал...............................................47 - Разлагане на число на прости делители ..............................................................................50 - Намиране на броя на нулите, на които завършва произведение ........................................51

  • Съдържание 4

    1.1.4. Мерсенови и съвършени числа...................................................................................... 52 - Мерсенови числа .................................................................................................................52 - Съвършени числа. “Големи” числа.....................................................................................54

    1.1.5. Биномни коефициенти, триъгълник на Паскал. Факторизация ........................... 56 1.1.6. Бройни системи и преобразуване ................................................................................ 59

    - Преминаване от десетична в p-ична бройна система .........................................................61 - Преминаване от p-ична в десетична бройна система. Формула на Хорнер .......................63

    1.1.7. Римски цифри .................................................................................................................. 65 - Представяне на десетично число с римски цифри .............................................................65 - Преобразуване на римско число в десетично ....................................................................66

    1.2. РЕКУРСИЯ И ИТЕРАЦИЯ ............................................................................................................ 67 1.2.1. Факториел ....................................................................................................................... 68 1.2.2. Редица на Фибоначи ...................................................................................................... 69 1.2.3. Най-голям общ делител. Алгоритъм на Евклид........................................................ 74 1.2.4. Най-малко общо кратно ............................................................................................... 76 1.2.5. Връщане от рекурсията и използване на променливите ....................................... 77

    1.3. ОСНОВНИ КОМБИНАТОРНИ АЛГОРИТМИ ................................................................................ 80 1.3.1. Пермутации ..................................................................................................................... 80

    - Генериране...........................................................................................................................81 - Кодиране и декодиране .......................................................................................................84 - Пермутации с повторение ...................................................................................................86

    1.3.2. Вариации .......................................................................................................................... 86 - Видове, генериране .............................................................................................................86 - Сума нула.............................................................................................................................88

    1.3.3. Комбинации ..................................................................................................................... 90 1.3.4. Разбиване на числа ......................................................................................................... 92

    - Генериране на всички разбивания на число като сума от дадени числа ...........................92 - Генериране на всички разбивания на число като произведение от числа .........................93 - Генериране на всички разбивания на число като сума от дадени числа ...........................94

    1.3.5. Разбиване на множества ............................................................................................. 96 - Числа на Бел и Стирлинг .....................................................................................................96

    1.4. ОЦЕНКА И СЛОЖНОСТ НА АЛГОРИТМИ ................................................................................... 97 1.4.1. Размер на входните данни ............................................................................................ 99 1.4.2. Асимптотична нотация ............................................................................................... 99 1.4.3. O(F): Свойства и примери..........................................................................................100 1.4.4. (F): Свойства и примери .........................................................................................102 1.4.5. (F): Свойства и примери .........................................................................................103 1.4.6. Асимптотични функции и реални числа ..................................................................105 1.4.7. Нарастване на основните функции ..........................................................................106 1.4.8. Определяне на сложност на алгоритъм ..................................................................107

    - Елементарна операция ....................................................................................................... 107 - Последователност от оператори ....................................................................................... 107 - Композиция на оператори ................................................................................................ 107 - if-конструкции ................................................................................................................... 107 - Цикли ................................................................................................................................. 108 - Вложени цикли .................................................................................................................. 108 - Още примери от вложени цикли ....................................................................................... 109 - Логаритмична сложност ................................................................................................... 110 - Рекурсия ............................................................................................................................ 110

    1.4.9. Характеристични уравнения .....................................................................................112 - Линейни хомогенни уравнения с прости корени ............................................................. 112

  • Съдържание 5

    - Линейни хомогенни уравнения с кратни корени .............................................................. 114 - Линейни нехомогенни уравнения ..................................................................................... 114

    1.4.10. Специални техники за анализ на алгоритми ........................................................117 - Използване на барометър .................................................................................................. 117 - Амортизационен анализ .................................................................................................... 118 - Основна теорема ............................................................................................................... 118

    1.4.11. Проблеми на асимптотичната нотация ..............................................................120 1.5. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................120

    1.5.1. Задачи от текста ........................................................................................................120 1.5.2. Други задачи ..................................................................................................................133

    - Задачи от числа, редици, функции.................................................................................... 133 - Задачи от матрици и общи задачи .................................................................................... 137 - Комбинаторни задачи ....................................................................................................... 138

    ГЛАВА 2 ВЪВЕДЕНИЕ В СТРУКТУРИТЕ ОТ ДАННИ ...............................................143 2.1. СПИСЪК, СТЕК, ОПАШКА ........................................................................................................144

    - Стек.................................................................................................................................... 145 - Опашка............................................................................................................................... 146 - Дек ..................................................................................................................................... 147

    2.1.1 Последователна (статична) реализация..................................................................147 - Стек.................................................................................................................................... 147 - Опашка............................................................................................................................... 149

    2.1.2 Свързана (динамична) реализация .............................................................................151 - Включване на елемент ....................................................................................................... 152 - Обхождане на списък ........................................................................................................ 153 - Включване след елемент, сочен от даден указател ........................................................... 153 - Включване пред елемент, сочен от даден указател........................................................... 154 - Изтриване по зададен ключ и указател към начало на списъка ....................................... 154 - Изтриване на елемент, сочен от даден указател................................................................ 155

    2.2. ДВОИЧНИ ДЪРВЕТА ................................................................................................................158 - Търсене по даден ключ ..................................................................................................... 163 - Включване на нов връх ..................................................................................................... 164 - Изключване на връх по даден ключ .................................................................................. 164 - Обхождане ......................................................................................................................... 168

    2.3. БАЛАНСИРАНИ ДЪРВЕТА ........................................................................................................169 2.3.1. Ротация. Червено-черни дървета.............................................................................172 2.3.2. B-дървета ......................................................................................................................174

    2.4. ХЕШ-ТАБЛИЦИ ........................................................................................................................176 - Хеш-функция ..................................................................................................................... 176 - Колизии ............................................................................................................................. 177

    2.4.1. Класически хеш-функции .............................................................................................178 - Остатък при деление с размера на таблицата ................................................................... 178 - Мултипликативно хеширане .............................................................................................. 178 - Хеш-функции върху части от ключа ................................................................................. 179 - Сравнение на някои от разгледаните хеш-функции .......................................................... 179 - Хеш-функции върху символни низове .............................................................................. 180

    2.4.2. Справяне с колизии .......................................................................................................184 - Затворено хеширане ............................................................................................................184

    - Линейно пробване ............................................................................................................. 184 - Квадратично пробване ...................................................................................................... 185 - Двойно хеширане .............................................................................................................. 185

    - Отворено хеширане..............................................................................................................185

  • Съдържание 6

    - Допълнителна памет за колизии........................................................................................ 185 - Списък на препълванията.................................................................................................. 186

    2.4.3. Реализации на хеш-таблица .......................................................................................186 2.5. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................192

    2.5.1. Задачи от текста ........................................................................................................192 2.5.2. Други задачи ..................................................................................................................196

    ГЛАВА 3 СОРТИРАНЕ...........................................................................................................199 3.1. СОРТИРАНЕ ЧРЕЗ СРАВНЕНИЕ................................................................................................200

    3.1.1. Дърво на сравненията .................................................................................................200 3.1.2. Сортиране чрез вмъкване ...........................................................................................201 3.1.3. Сортиране чрез вмъкване с намаляваща стъпка. Алгоритъм на Шел .............203 3.1.4. Метод на мехурчето ....................................................................................................206 3.1.5. Сортиране чрез клатене .............................................................................................207 3.1.6. Бързо сортиране на Хоор ...........................................................................................208 3.1.7. Метод на “зайците и костенурките” .....................................................................213 3.1.8. Сортиране чрез пряк избор ........................................................................................215 3.1.9. Пирамидално сортиране на Уилямс .........................................................................216 3.1.10. Минимална времева сложност на сортирането чрез сравнение .....................219

    3.2. СОРТИРАНЕ ЧРЕЗ ТРАНСФОРМАЦИЯ......................................................................................221 3.2.1. Сортиране чрез множество ......................................................................................221 3.2.2. Сортиране чрез броене................................................................................................223 3.2.3. Побитово сортиране ..................................................................................................226 3.2.4. Метод на бройните системи .....................................................................................229 3.2.5. Сортиране чрез пермутация......................................................................................232

    3.3. ПАРАЛЕЛНО СОРТИРАНЕ ........................................................................................................233 3.3.1. Принцип на нулите и единиците ...............................................................................235 3.3.2. Битонични последователности.................................................................................236 3.3.3. “Изчисти наполовина” ...............................................................................................237 3.3.4. Сортиране на битонична последователност ........................................................237 3.3.5. Сливаща схема ..............................................................................................................237 3.3.6. Сортираща схема.........................................................................................................238 3.3.7. Транспозиционна сортираща схема .........................................................................238 3.3.8. Четно-нечетна сливаща схема на Бетчер ...............................................................239 3.3.9. Четно-нечетна сортираща схема.............................................................................239 3.3.10. Пермутационна схема ...............................................................................................239

    3.4. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................240 3.4.1. Задачи от текста ........................................................................................................240 3.4.2. Други задачи ..................................................................................................................243

    ГЛАВА 4 ТЪРСЕНЕ .................................................................................................................245 4.1. ПОСЛЕДОВАТЕЛНО ТЪРСЕНЕ .................................................................................................246

    4.1.1. Последователно търсене в сортиран списък .........................................................248 4.1.2. Последователно търсене с преподреждане ...........................................................249

    4.2. ТЪРСЕНЕ СЪС СТЪПКА. КВАДРАТИЧНО ТЪРСЕНЕ..................................................................251 4.3. ДВОИЧНО ТЪРСЕНЕ.................................................................................................................252 4.4. ФИБОНАЧИЕВО ТЪРСЕНЕ .......................................................................................................256 4.5. ИНТЕРПОЛАЦИОННО ТЪРСЕНЕ ..............................................................................................258 4.6. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................260

    4.6.1. Задачи от текста ........................................................................................................260

  • Съдържание 7

    4.6.2. Други задачи ..................................................................................................................261

    ГЛАВА 5 ТЕОРИЯ НА ГРАФИТЕ.......................................................................................263 5.1. ОСНОВНИ ПОНЯТИЯ ...............................................................................................................263 5.2. ПРЕДСТАВЯНЕ И ПРОСТИ ОПЕРАЦИИ С ГРАФ ........................................................................267

    5.2.1. Списък на ребрата .......................................................................................................267 5.2.2. Матрица на съседство, матрица на теглата .......................................................268 5.2.3. Списък на наследниците (списък на инцидентност) .............................................268 5.2.4. Матрица на инцидентност между върхове и ребра ............................................269 5.2.5. Компоненти на свързаност ........................................................................................269 5.2.6. Построяване и прости операции с графи...............................................................270

    5.3. ОБХОЖДАНЕ НА ГРАФ ............................................................................................................271 5.3.1. Обхождане в ширина...................................................................................................271 5.3.2. Обхождане в дълбочина..............................................................................................274

    5.4. ОПТИМАЛНИ ПЪТИЩА, ЦИКЛИ И ПОТОЦИ В ГРАФ................................................................276 5.4.1. Директни приложения на алгоритмите за обхождане .......................................277

    - най-кратък път между два върха по брой на върховете ................................................... 277 - проверка дали граф е цикличен......................................................................................... 279 - намиране на всички прости пътища между два върха...................................................... 281

    5.4.2. Екстремален път в граф .............................................................................................283 - неравенство на триъгълника ............................................................................................. 284 - алгоритъм на Форд-Белман ............................................................................................... 284 - алгоритъм на Флойд .......................................................................................................... 285 - обобщен алгоритъм на Флойд........................................................................................... 288 - алгоритъм на Дейкстра...................................................................................................... 290 - повдигане в степен на матрицата на съседство ................................................................ 293 - алгоритъм на Уоршал и матрица на достижимост ........................................................... 293 - най-дълъг път в ацикличен граф ....................................................................................... 294 - най-дълъг прост път между два върха в произволен граф ............................................... 297

    5.4.3. Цикли ...............................................................................................................................297 - намиране на фундаментално множество от цикли............................................................ 297 - минимален цикъл през връх .............................................................................................. 300

    5.4.4. Хамилтонови цикли. Задача за търговския пътник .............................................300 5.4.5. Ойлерови цикли .............................................................................................................303 5.4.6. Потоци ...........................................................................................................................306

    - Максимален поток ............................................................................................................. 307 - повече от един източник и консуматор ............................................................................ 311 - капацитет на върховете...................................................................................................... 312

    5.5.ТРАНЗИТИВНОСТ И ПОСТРОЯВАНЕ. ТОПОЛОГИЧНО СОРТИРАНЕ .........................................312 5.5.1. Транзитивно затваряне. Алгоритъм на Уоршал ...................................................313 5.5.2. Транзитивно ориентиране .........................................................................................314 5.5.3. Транзитивна редукция.................................................................................................317 5.5.4. Контрол на компании ..................................................................................................318 5.5.5. Топологично сортиране ..............................................................................................320 5.5.6. Пълно топологично сортиране..................................................................................322 5.5.7. Допълване на ацикличен граф до слабо свързан .....................................................324 5.5.8. Построяване на граф по дадени степени на върховете ......................................325

    5.6. ДОСТИЖИМОСТ И СВЪРЗАНОСТ .............................................................................................326 5.6.1. Компоненти на свързаност ........................................................................................326 5.6.2. Компоненти на силна свързаност в ориентиран граф .........................................328 5.6.3. Разделящи точки в неориентиран граф. Двусвързаност .....................................330

  • Съдържание 8

    5.6.4. k-свързаност на неориентиран граф........................................................................333 5.7.ОПТИМАЛНИ ПОДМНОЖЕСТВА И ЦЕНТРОВЕ .........................................................................334

    5.7.1. Минимално покриващо дърво ....................................................................................334 - алгоритъм на Крускал ....................................................................................................... 334 - алгоритъм на Прим............................................................................................................ 338 - частично минимално покриващо дърво ........................................................................... 340

    5.7.2. Независими множества ..............................................................................................340 - максимални независими множества.................................................................................. 341

    5.7.3. Доминиращи множества ............................................................................................343 5.7.4. База..................................................................................................................................346 5.7.5. Център, радиус и диаметър .......................................................................................348

    - p-център и p-радиус .......................................................................................................... 350 5.7.6. Двойкосъчетание. Максимално двойкосъчетание ................................................353

    5.8. ОЦВЕТЯВАНИЯ И ПЛАНАРНОСТ..............................................................................................354 5.8.1. Оцветяване на граф. Хроматично число.................................................................354

    - ограничаване отдолу на хроматичното число .................................................................. 355 - намиране на върховото хроматичното число ................................................................... 355

    5.8.2. Планарност на графи ..................................................................................................355 5.9. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................357

    5.9.1. Задачи от текста ........................................................................................................357 5.9.2. Други задачи ..................................................................................................................363

    ГЛАВА 6 ТЪРСЕНЕ С ВРЪЩАНЕ. NP-ПЪЛНИ ЗАДАЧИ ..........................................369 6.1. КЛАСИФИКАЦИЯ НА ЗАДАЧИТЕ .............................................................................................369

    6.1.1. Сложност по време .....................................................................................................369 6.1.2. Сложност по памет ....................................................................................................370 6.1.3. Нерешими задачи..........................................................................................................370 6.1.4. Примери ..........................................................................................................................370

    6.2. NP-ПЪЛНИ ЗАДАЧИ ................................................................................................................373 6.3. ТЪРСЕНЕ С ВРЪЩАНЕ .............................................................................................................374

    6.3.1. Удовлетворимост на булева функция ......................................................................376 6.3.2. Оцветяване на граф .....................................................................................................380 6.3.3. Най-дълъг прост път в цикличен граф ....................................................................383 6.3.4. Разходка на коня ...........................................................................................................385 6.3.5. Задача за осемте царици ............................................................................................388 6.3.6. Разписание на училищна програма ...........................................................................391 6.3.7. Побуквено превеждане................................................................................................395

    6.4. МЕТОД НА РАЗКЛОНЕНИЯТА И ГРАНИЦИТЕ...........................................................................398 6.4.1. Задача за раницата (оптимална селекция).............................................................398

    6.5. ОПТИМАЛНИ СТРАТЕГИИ ПРИ ИГРИ ......................................................................................401 6.5.1. Игра "X"-чета и "O".....................................................................................................402 6.5.2. Принцип на минимума и максимума .........................................................................405 6.5.3. Алфа-бета отсичане ....................................................................................................406 6.5.4. Алфа-бета изследване до определена дълбочина ...................................................408

    6.6. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................409 6.6.1. Задачи от текста ........................................................................................................409 6.6.2. Други задачи ..................................................................................................................413

    - NP-пълни задачи................................................................................................................ 413 - Изчерпващи задачи ........................................................................................................... 425

    ГЛАВА 7 РАЗДЕЛЯЙ И ВЛАДЕЙ .......................................................................................427

  • Съдържание 9

    7.1. НАМИРАНЕ НА K-ИЯ ПО ГОЛЕМИНА ЕЛЕМЕНТ......................................................................427 7.2. МАЖОРАНТ .............................................................................................................................434 7.3. СЛИВАНЕ НА СОРТИРАНИ МАСИВИ .......................................................................................445 7.4. СОРТИРАНЕ ЧРЕЗ СЛИВАНЕ....................................................................................................450 7.5. БЪРЗО ПОВДИГАНЕ В СТЕПЕН ................................................................................................456 7.6. АЛГОРИТЪМ НА ЩРАСЕН ЗА БЪРЗО УМНОЖЕНИЕ НА МАТРИЦИ .........................................458 7.7. БЪРЗО УМНОЖЕНИЕ НА ДЪЛГИ ЧИСЛА .................................................................................461 7.8. ЗАДАЧА ЗА ХАНОЙСКИТЕ КУЛИ .............................................................................................464 7.9. ОРГАНИЗИРАНЕ НА ПЪРВЕНСТВА ..........................................................................................466 7.10. ЦИКЛИЧНО ИЗМЕСТВАНЕ НА ЕЛЕМЕНТИТЕ НА МАСИВ ......................................................471 7.11. ПОКРИВАНЕ С ШАБЛОН .......................................................................................................474 7.12. ВЪПРОСИ И ЗАДАЧИ .............................................................................................................475

    7.12.1. Задачи от текста ......................................................................................................475 7.12.2. Други задачи ................................................................................................................478

    ГЛАВА 8 ДИНАМИЧНО ОПТИМИРАНЕ.........................................................................481 8.1.ВЪВЕДЕНИЕ .............................................................................................................................481 8.2.КЛАСИЧЕСКИ ОПТИМИЗАЦИОННИ ЗАДАЧИ ...........................................................................484

    8.2.1. Задача за раницата .....................................................................................................484 8.2.2. Братска подялба ..........................................................................................................495 8.2.3. Умножение на матрици ..............................................................................................497 8.2.4. Триангулация на многоъгълник. Числа на Каталан ...............................................504 8.2.5. Оптимално двоично дърво за претърсване ............................................................508 8.2.6. Най-дълга обща подредица ........................................................................................513 8.2.7. Най-дълга ненамаляваща подредица........................................................................517 8.2.8. Сравнение на символни низове ...................................................................................522 8.2.9. Задача за разделянето.................................................................................................526

    8.3.НЕОПТИМИЗАЦИОННИ ЗАДАЧИ ..............................................................................................528 8.3.1. Числа на Фибоначи.......................................................................................................528 8.3.2. Биномни коефициенти .................................................................................................532 8.3.3. Спортни срещи .............................................................................................................533 8.3.4. Представяне на сума с неограничен брой монети .................................................537 8.3.5. Представяне на сума с ограничен брой монети .....................................................539 8.3.6. Разбиване на естествено число .................................................................................540 8.3.7. Числа без две съседни нули ..........................................................................................542 8.3.8. Разпознаване на контекстно свободен език ...........................................................543 8.3.9. Хедонийски език ............................................................................................................548 8.3.10. Символно умножение.................................................................................................549

    8.4. ДРУГИ ИНТЕРЕСНИ ОПТИМИЗАЦИОННИ ЗАДАЧИ .................................................................551 8.4.1. Такси компания .............................................................................................................552 8.4.2. Билети за влак ...............................................................................................................553 8.4.3. Числов триъгълник .......................................................................................................555 8.4.4. Представяне на сума с минимален брой монети....................................................559 8.4.5. Опроводяване на платка ............................................................................................561 8.4.6. На опашка за билети ...................................................................................................564 8.4.7. Разпределение на ресурси ............................................................................................565 8.4.8. Семинарна зала .............................................................................................................568 8.4.9. Крайпътни дървета ....................................................................................................571 8.4.10. Разрязване на материали .........................................................................................574

    AcerAspireHighlight

    AcerAspireHighlight

    AcerAspireHighlight

  • Съдържание 10

    8.4.11. Зациклен израз .............................................................................................................576 8.4.12. Домино-редица ............................................................................................................579 8.4.13. Трионообразна редица ..............................................................................................582

    8.5. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................584 8.5.1. Задачи от текста ........................................................................................................584 8.5.2. Други задачи ..................................................................................................................591

    ГЛАВА 9 ЕВРИСТИЧНИ И ВЕРОЯТНОСТНИ АЛГОРИТМИ..................................595 9.1. АЛЧНИ АЛГОРИТМИ ...............................................................................................................595

    9.1.1. Египетски дроби...........................................................................................................596 9.1.2. Максимално съчетание на дейности ........................................................................598 9.1.3. Минимално оцветяване на граф и дърво .................................................................601 9.1.4. Алгоритми на Прим и Крускал ...................................................................................604 9.1.5. Дробна задача за раницата .......................................................................................605 9.1.6. Задача за магнитната лента.....................................................................................607 9.1.7. Процесорно разписание ...............................................................................................608 9.1.8. Разходката на коня. Хиперкуб. Код на Грей...........................................................610

    9.2. ТЪРСЕНЕ С НАЛУЧКВАНЕ .......................................................................................................616 9.2.1. Алгоритми Монте Карло и Лас Вегас ......................................................................617

    - проверка дали число е просто .......................................................................................... 618 9.2.2. Числени алгоритми с приближение ..........................................................................621 9.2.3. Генетични алгоритми..................................................................................................622

    9.3. ДОСТИГАНЕ НА ФИКСИРАНО ПРИБЛИЖЕНИЕ........................................................................627 9.3.1. Върхово покритие на граф .........................................................................................628

    9.4. ВЪПРОСИ И ЗАДАЧИ ...............................................................................................................629 9.4.1. Задачи от текста ........................................................................................................629 9.4.2. Други задачи ..................................................................................................................633

    ГЛАВА 10 КОМПРЕСИРАНЕ ..............................................................................................637 10.1. КОДИРАНЕ ............................................................................................................................637 10.2. ОБЩА КЛАСИФИКАЦИЯ........................................................................................................638 10.3. КОДИРАНЕ НА ПОСЛЕДОВАТЕЛНОСТИ ................................................................................640

    10.3.1. Премахване на нулите ...............................................................................................640 10.3.2. Компресиране с битови карти................................................................................641 10.3.3. Полубайтово пакетиране ........................................................................................643 10.3.4. Съвместно използване на битови карти и полубайтово пакетиране ...........646 10.3.5. Двуатомно кодиране .................................................................................................646 10.3.6. Замяна на шаблони .....................................................................................................648 10.3.7. Относително кодиране .............................................................................................649 10.3.8. Математическо очакване. Кодиране с линейно предсказване .........................650 10.3.9. Кодиране на последователности ............................................................................653 10.3.10. Един представителен пример: PackBits ..............................................................655

    10.4. СТАТИСТИЧЕСКИ МЕТОДИ....................................................................................................656 10.4.1. Алгоритъм на Шенън-Фано ......................................................................................656 10.4.2. Алгоритъм на Хъфман ...............................................................................................660 10.4.3. Обобщен алгоритъм на Хъфман .............................................................................671 10.4.4. Kод с разделители ......................................................................................................672 10.4.5. Аритметично кодиране ............................................................................................673

    10.5. АДАПТИВНО КОМПРЕСИРАНЕ ..............................................................................................681 10.5.1. Адаптивно компресиране по Хъфман ....................................................................683

  • Съдържание 11

    10.5.2. Модели на Марков......................................................................................................686 10.5.3. Един представителен пример: MNP-5...................................................................688

    10.6. РЕЧНИКОВО КОДИРАНЕ .......................................................................................................690 10.6.1. Ентропия .....................................................................................................................691 10.6.2. Малко история ...........................................................................................................695 10.6.3. Стандарти и патенти .............................................................................................696 10.6.4. Статични срещу адаптивни методи ....................................................................697 10.6.5. LZ77. Компресиране с плъзгащ се прозорец ..........................................................698 10.6.6. LZSS. Едно подобрение..............................................................................................698 10.6.7. FLZ. Друг вариант на LZ77 ......................................................................................699 10.6.8. LZW. Модификацията на Уелч ................................................................................700 10.6.9. GIF. Гледната точка на CompuServe .....................................................................706 10.6.10. Оптимални срещу алчни алгоритми ....................................................................707 10.6.11. Компресиране в реално време ................................................................................708 10.6.12. LZW срещу Марков ..................................................................................................709

    10.7. КОМПРЕСИРАНЕ СЪС ЗАГУБА ..............................................................................................710 10.7.1. Изрязване и квантифициране ..................................................................................710 10.7.2. JPEG ..............................................................................................................................711 10.7.3. Компресиране на видеоизображение. MPEG .......................................................713 10.7.4. Уейвлети ......................................................................................................................715 10.7.5. Компресиране с фрактали .......................................................................................716

    10.8. ВЪПРОСИ И ЗАДАЧИ .............................................................................................................717 10.8.1. Задачи от текста ......................................................................................................717 10.8.2. Други задачи ................................................................................................................725

    ЛИТЕРАТУРА ...........................................................................................................................727

    ПРЕДМЕТЕН УКАЗАТЕЛ......................................................................................................733

  • Съдържание 12

  • Предговор от научния редактор С настоящата книга се продължава уникалното явление в нашата учебна и научна литера-

    тура (а, може би и в световната) — студенти да пишат оригинални учебници за компютърната ин-форматика на изключително високо ниво, новаторски съчетавайки практика и теория. Първата книга, започнала този стил, беше "Основи на компютърните алгоритми" на Преслав Наков. Сега авторът ѝ заедно с Панайот Добриков правят следваща стъпка, като предлагат на читателя значи-телно разширен и видоизменен труд, който по качества се доближава до такава основна книга за съставители на алгоритми, каквато е "библията" Introduction to Algorithms от Cormen, Leiserson и Rivest, но притежаващ и много свои специфични черти.

    Забележимата разлика с повечето университетски учебници и ръководства по алгоритми и структури от данни е, че авторите използват подход "отдолу-нагоре", тръгвайки от самото програмиране, за да стигнат до теорията. И това е естествено за тях, защото и двамата са навлезли в компютърната информатика чрез състезанията по програмиране и са преминали успешно през многобройните кръгове на националната и международната олимпиади по информатика. Това обяснява и значителното присъствие в книгата на цялостно завършени, елегантно оформени програми с изходен текст на езика Си. Те са написани от авторите и носят отпечатъка им на елитни алгоритмисти и програмисти-практици.

    Оттук следва и основното предназначение на книгата — да бъде учебник за състезатели — ученици и студенти. Разбира се, това никак не изключва възможността тя да бъде ползвана от професионални програмисти, на които е възложено или им се е наложило да програмират нещо, което надхвърля леймърското ниво (за "леймър" — виж въведението на авторите) — т.е. нещо, за което се изисква да се помисли предварително и да се потърси теория, преди да се започне с програмирането.

    Книгата може да служи и като превъзходен университетски курс за въведение в алгорит-мите и структурите от данни. Може да се каже, че научното и педагогическото ѝ ниво е значително. Всъщност тя е експериментирана от авторите ѝ именно за такъв курс, защото са я ползвали, когато е била в още незавършения си вид, за да преподават по нея. Така предложеният учебник има достойнствата, че споделя едновременно опита на доскорошни активни състезатели по информатика с по-новия им опит да преподават на студенти основите на компютърната информатика. Авторите са водили курса си "Проектиране и анализ на компютърни алгоритми", когато самите те са били студенти и по всеобщо признание този курс, който е тясно свързан с настоящата книга, е оценен много високо.

    В книгата са застъпени няколкото основни линии, по които могат да се разглеждат и пре-подават алгоритми. Въпреки, че е трудно да се правят методологически класификации, може да приемем най-общо, че двете възможни гледни точки са — от позицията на предмета и от позици-ята на метода. Традиционно към предмета, върху който работят алгоритмите, се причисляват обекти като числа, множества и по-общи структури от данни, графи и т.н., а към предмета на самите алгоритми могат да бъдат отнесени темите за сортиране и търсене, компресиране, получаване на комбинаторни конфигурации и т.н., докато методите за съставяне на алгоритми са рекурсия и итерация, търсене с връщане, разделяй и владей, динамично оптимиране, евристични алгоритми и др.

    Подробното съдържание на книгата дава много добра представа за включения материал. За начинаещия читател то може да служи като пътеводител в една обширна област, а за запознатия с тази област опитен програмист то има качества на справочник.

    Книгата е оригинално българско творение, неотстъпващо от световното ниво в раз-глежданата бързо развиваща се съвременна област на компютърната информатика. Тя съчетава програмистка практика с теория, изградена върху математически методи, което допринася за по-добро разбиране и прилагане на многобройните алгоритми, съдържащи се в нея. Предназначена е за читатели, които биха оценили този синтез — ученици и техните учители, студенти и техните преподаватели, професионални програмисти и техните ръководители и разбира се, тя е за всички любители.

    1 Август 2002 Емил Келеведжиев

  • Предговор 14

    Институт по математика и информатика Българска академия на науките

  • Предговор 15

    Предговор към третото издание

    Скъпи читатели,

    Поради големия интерес и изчерпване на предишните два тиража се наложи поредното

    трето издание на настоящата книга. Разбира се, всяко преиздаване ни дава възможност за:

    подобрения и промени, продиктувани от развитието в различни алгоритмични области;

    корекции на грешки, които открихме сами или получихме по е-mail и на Интернет страницата на книгата.

    Бихме искали да благодарим на всички читатели, които се свързаха с нас (или използваха

    форума на Интернет страницата) – както за топлите и приятелски писма, така и за препоръките и

    откритите грешки и пропуски.

    За някои от най-активните сме приготвили специален подарък, с който искаме да изразим

    своята признателност за показаната съпричастност – “Авторско издание” с различна (и твърда)

    корица и автограф от авторите.

    Благодарим Ви!

    Имаме удоволствието да ви съобщим, че в периода от първото издание досега, няколко

    големи университета и средни училища избраха книгата като основен учебник или допълнителна

    литература в курсове по алгоритми и структури от данни. Бихме се радвали да помогнем, напри-

    мер с:

    възможност за отстъпки при закупуване на книгата от студентите от курса;

    осигуряване на контакт с други преподаватели, водещи подобни курсове;

    помощ при подбор и организиране на подходящ учебен материал;

    други.

    Пишете ни! Вашите идеи, препоръки и коментари са изключително ценни за нас!

    С пожелание за много успехи,

    Панайот и Преслав

    3 януари 2005 г.

  • Предговор 16

  • Глава 0

    Компютърна информатика,

    алгоритми, програмиране

    "Think of all the psychic energy expended in seeking a

    fundamental distinction between 'algorithm' and 'program'".

    ~ Epigrams in Programming

    Според една добре известна теория [Adams-1980] планетата Земя представлява един

    огромен компютър, построен с единствената цел да разкрие въпроса за “смисъла на живота,

    Вселената и всичко останало”. Тази щура мисъл, родила се в главата на Дъглас Адамс още през

    1975 (докато се е излежавал в тръстиката), може би не е най-точното описание на състоянието на

    нещата, но, както и други негови “хипотези”, проектира една обща допирателна между минало,

    настояще и бъдеще. Ще отбележим, че построяването на обща допирателна през повече от два, и

    то не толкова закръглени, обекта, каквито са състоянията на времето, е една доста трудна и често

    нерешима задача.

    Трудно е да се избегнат клишетата, когато трябва да се описва ефектът, който компютър-

    ните системи и технологии оказват върху съвременното общество. Забележителните им темпове

    на развитие оставят дълбока следа в организационните и оперативните процеси в индустрията,

    бизнеса, управлението и обучението. Целта на настоящата уводна глава не е разсъждения върху

    това как след 10 години компютрите ще се хранят и [цензурирано, ред.] вместо нас, а да запознае

    накратко читателя с аспектите на съвременните компютърни технологии, както и да го подготви

    за света на компютърните алгоритми, който ще изследваме на страниците на тази книга.

    В основата на развитието на компютърните технологии стои компютърната информати-

    ка — термин, който многократно ще използваме по-нататък. Ще отбележим, че в английски език

    (особено в американски английски) се предпочита използването на термина computer science,

    който се превежда на български буквално като компютърна наука. В Европа има по-различно

    разбиране, например: в бившия социалистически блок (руски и български: информатика), във

    Франция (френски: informatique), Германия (немски: informatik) и др. Тук свободно циркулира и

    английското название informatics — вероятно първоначално появило се като буквален превод

    някъде извън Великобритания, но с тенденцията да се наложи. Въпреки това, informatics е силно

    дискриминирано: липсва в повечето речници на съвременния английски език, университетската

    специалност във Великобритания най-често се нарича computer science (макар напоследък да се

    използва и информатика), дори вградената в Microsoft Word стандартна програма за правописна

    корекция в момента систематично подчертава с червено тази дума. Въпреки това понятието

    постепенно се налага и на международно ниво: така например международната олимпиада е по

    информатика (англ. International Olympiad in Informatics), така е и с Балканиадата (англ. Balkan

    Olympiad in Informatics). В САЩ обаче продължават категорично да отричат правото му на

    съществуване... В основата на понятието информатика стои осъзнатият факт, че всъщност става

    въпрос за по-широкия процес на обработване на информация, докато от американска гледна

    точка е важна не информацията, а конкретното средство за обработката ѝ — компютърът.

  • Глава 0 - Компютърна информатика, алгоритми и програмиране 18

    0.1. Перспективни направления в

    компютърната информатика

    Областите, в които има поле за по-нататъшно развитие и научно-изследователска дейност

    през следващото десетилетие, могат условно да бъдат разграничени както на фигура 0.1. (Защо

    са оставени празни полета? Какво би могло да стои там?)

    Фигура 0.1. Основни области на компютърната информатика.

    0.1.1. Връзка компютър-потребител

    Когато се използва добре известното клише “компютрите са навсякъде”, в най-голяма

    степен се има предвид връзката между компютър и потребител. Макар за момента да не съ-

    ществува общоприета дефиниция какво обхваща, това е една от най-важните области на компю-

    търната информатика. Жизнено необходимо е по-нататъшното ѝ развитие, тъй като настоящите

    ограничения при това взаимодействие се чувстват осезателно. Съвсем естествено е желанието за

    много по-интерактивно взаимодействие с компютъра: да може да разбира печатен и ръкописен

    текст, човешка реч и жестове, както и да изразява свои собствени идеи в общуването си с нас. В

  • Глава 0 - Компютърна информатика, алгоритми и програмиране 19

    момента възможностите за подобно “общуване” са тромави, неудобни или най-малкото бавни.

    Въпреки някои опити за подобрения в тази насока засега практиката определя компютърните

    системи като “слепи” и “глухи”.

    Компютърна графика

    Може би най-разпространеното схващане за компютърна графика е: "почти всичко, свър-

    зано с компютрите, което не е текст и звук". На практика става въпрос за сериозна научна област,

    свързана с редица традиционни математически науки като: линейна алгебра, аналитична геомет-

    рия, диференциална геометрия, диференциални уравнения, (комплексен) анализ и други, както и с

    множество фундаментални компютърни алгоритми. Целите, поставени в тази насока, включват

    развитието и експлоатацията на графични хардуерни и софтуерни системи, както и съставянето

    на нови методи за моделиране, рендериране, симулиране, визуализиране и др. (виж фигури

    0.1.1а., 0.1.1б. и 0.1.1в.).

    Фигура 0.1.1а. Рендериране: визуализиране на модели на обекти така, че да изглеждат

    триизмерни.

    Фигура 0.1.1б. Някои от най-често използваните техники за засилване на реализма на

    компютърни графични обекти: прозрачност, отражение и сянка.

    Фигура 0.1.1в. Проследяване на лъча, светлоусещане и светлоотражение.

    0.1.2. Компютърни комуникации и сигурност

    Компютърната комуникация е процес, при който се създават, разменят и получават дан-

    ни и информация, като се използват компютърни системи, свързани в мрежа. Например взаимо-

  • Глава 0 - Компютърна информатика, алгоритми и програмиране 20

    действията между различни “локални” изчислителни процеси, компютърни конференции,

    електронни бюлетини, глобалната мрежа Интернет (във всички аспекти, включително прости

    неща като електронната поща). Основните проблеми тук са начинът на кодиране, предаване,

    транспортиране и декодиране на данните, изпращани по мрежата, абстракцията на предаваните

    съобщения (протоколи) и др. Разпределянето и организирането на информацията са обект на

    усилени изследвания, а едно от челните места заема въпросът за сигурността на предаваните

    данни.

    Компютърна сигурност

    В ранните дни на “компютърната ера”, поради ограничения достъп до компютърните сис -

    теми, както и поради малкия им брой, проблемите, свързани със сигурността, почти не се раз -

    глеждат. Първите “пробиви” датират от средата на века, когато се поставя въпросът за повери-

    телността и личната неприкосновеност на информацията. Малко по-късно Масачузетският техно-

    логичен институт, наред с множеството постижения в областта на компютърните системи и тех-

    нологии, става известен и с първия хакер. Ще отбележим, че понятията хакер (от англ. hacker,

    hacking) и кракер (от англ. cracker, cracking) често се бъркат. Днес в значението на последното се

    влага смисъл на извършване на незаконни действия, докато за първото това не е задължително.

    От тази гледна точка (поверителност и лична неприкосновеност), под сигурност на

    информацията се разбират, грижите, полагани за “опазването” й.

    В настоящия момент защитата на компютърната информация е от първостепенно значение

    както по отношение на операционните системи, така и на целия компютърен софтуер.

    Предпоставките за разрастване на проблема със сигурността са много — като се започне

    от използването на общи ресурси и се стигне до широкото разпространение и използване на ком-

    пютърни системи в най-разнообразни сфери на живота. Вече става въпрос не само за пробиви в

    неприкосновенос