Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursova2012_Algorytmy_poshuku.doc
Скачиваний:
7
Добавлен:
29.08.2019
Размер:
438.78 Кб
Скачать

1.5.2. Приклад побудови скінченного автомата

Побудуємо кінцевий автомат, що допускає рядок ababaca. Оскільки довжина зразка m = 7 символів, то в автоматі буде m + 1 = 8 станів.

Знайдемо функцію переходів . Згідно із означенням (1), (q, a) = (Рqа), де — префікс-функція, а — довільний символ із алфавіта , q — номер стану. Таким чином, необхідно для кожного префікса Pq = P[0..q], q = 0 .. m зразка Р і для всіх символів а вхідного алфавіта знайти довжину максимального префікса Р, який буде суфіксом стрічки Рqа. Довжина цього префікса і буде значенням функції переходів (q,a). Якщо а=P[q + 1] (черговий символ текста співпав із наступним символом зразка), то Рqа = Рq+1 і (q, a) = q+1.

Такий випадок відповідає успішним етапам пошуку. Інакше, (q,a) q. Наприклад, для префікса Р[0..5] = ababa і символа b максимальным суфіксом стрічки Р[0..5]b=ababab, котрий одночасно являється префіксом Р, буде abab. Його довжина рівна 4, тому значення функції переходів (5, b) = 4.

Запишемо побудовану таким чином функцію переходів у вигляді таблиці1:

0

1

2

3

4

5

6

7

a

1

1

3

1

5

1

7

1

b

0

2

0

4

0

4

0

2

c

0

0

0

0

0

6

0

0

Таблиця 1: функція переходів автомату.

Рядки відповідають вхідним символам, стовбці - стани автомату. Комірки, що відповідають успішним етапам пошуку (вхідний символ співпадає з наступним символом зразка), виділені сірим кольором.

Побудуємо по таблиці граф переходів автомату (рис. 1), розпізнаного зразок ababaca. Перебуваючи в стані q і прочитавши черговий символ а, автомат переходить в стан (q, a). Звернемо увагу, що його кістяк позначений символами зразка (ці переходи виділені жирними стрілками).

Рис. 1

Тут 0 — початковий стан, 7 — єдино допускающий стан виходу із автомату. Якщо із вершини i в вершину j веде стрілка, навантажена буквою а, то це означає, що (i,a) = j. Відмітимо, що переходи, для которих (i,a) = 0, на графі переходів для його ж спрощення не позначені. Жирні стрілки, котрі ведуть зліва направо, відповідають успішним етапам пошуку подстрічки Р — наступний вхідний символ співпадає із черговим символом зразка. Стрілки, зправа наліво, відповідають невдачам — наступний вхідний символ відрізняється від чергового символа зразка.

Нижче приведений результат застосування автомата до тексту Т=abababacaba. Під кожним символом Т[і] записано стан автомата після прочитання цього символа (другими словами, значення (Тi)) (Табл. 2).

Знайдено одне входження зразку (починаючи з позиції 3). Найдений зразок в тексті помічений сірим кольором. Черним кольором помічено допускаючий стан автомата (стан із номером 7).

2. Експериментальний аналіз алгоритмів

2.1. Суть експерименту.

Ми розглянули кілька алгоритмів, провели оцінку їхньої часової та об’ємної складності. Однак, як уже говорилося, дані критерії оцінки не дозволяють нам напевно сказати, який з алгоритмів буде швидше працювати. Тому, для додаткової оцінки проведемо їх експериментальний аналіз, тобто відмірявши час, за який алгоритм виконує конкретно поставлену задачу.

Є декілька текстових файлів, котрі містять 100 записів виду: стрічка підстрічка (що є в даній стрічці) місце вхождення довжина підстрічки

із різними максимальними довжинами стрічок і підстрічок.

Алфавитом є 66 великих і маленьких літер кирилиці.

Нехай це будуть стрічки довжино. не більше 10, 100, 250 символів.

Проведемо пошук підстрічок в стрічках для каждого із алгоритмів і виміряєм час роботи програми. При цьому будемо враховувати наступне:

  • Стрічки попередньо загружаєм в оперативну пам’ять (у вигляді масиву), причому час зчитування в масив не враховується. Попередня обробка (створення таблиць переходу) входить в загальний час.

  • Кожний алгоритм запускається 5 раз, час вибирається найменший.

Стенд для експеримента.

Процессор Intel Pentium IV 2,66Ггц

1024 Мб ОЗУ

Компілятор Borland Delphi Enterprise, version 6.0 (Build 6.163)

Зрозуміло, що такий замір часу дасть нам дуже розпливчасті результати, так як він безпосередньо залежить від характеристик і завантаження процесора. Тому під час проведення експерименту, відключалися всі сторонні і фонові програми, які не впливають на роботу програми. При запуску одного і того ж завдання ми можемо отримати різний час, тому відбувається кілька запусків, з яких вибирається найкращий результат.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]