Алгоритм пошуку в рядках. Алгоритм Хорспула
Київський національний університет будівництва і архітектури
Кафедра інформаційних технологій проектування та прикладної математики
КУРСОВА РОБОТА
Теорія алгоритмів
На тему: «Алгоритм пошуку в рядках. Алгоритм Хорспула»
Студента 2 курсу 1 група
Керівник
Члени комісії
(підпис)
(підпис)
(підпис)
м. Київ – 2013 рік
Київський національний університет будівництва і архітектури
Кафедра інформаційних технологій проектування та прикладної математики
Спеціальність ІУСТ
Курс 2 Група 1 Семестр 3
ЗАВДАННЯ
На курсову роботу студентці
Мельник Ірині Михайлівні
- Тема курсової роботи: «Алгоритми на графах. Орієнтований граф»
- Термін здачі студентом закінченої роботи: 25 грудня 2013 р.
Вихідні дані до (роботи): Кількість шляхів заданої довжини. Загальна кількість шляхів між двома заданими вершинами.
- Довжина мінімального шляху між двома заданими вершинами.Зміст пояснювальної записки (перелік питань, які належить розробити): опис постановки задачі (вхідні, вихідні дані), обґрунтування вибору структури даних, побудова математичної моделі, схема алгоритму розв’язку задачі, оцінка коректності алгоритму, аналіз алгоритму, опис програми, контрольний приклад, список літератури і додатки.
- Перелік графічного матеріалу (з точним зазначенням обов’язкових креслень): схема алгоритму.
- Дата видачі завдання «1» листопада 2013 р.
Студентка Мельник І. М.
Керівник Білощицька С. В.
КАЛЕНДАРНИЙ ПЛАН
№ п/п |
Назва етапів курсової роботи |
Термін виконання етапів курсової роботи |
Примітки |
1 |
опис постановки задачі |
01.11.13. – 03.11.13. |
|
2 |
обґрунтування вибору структури даних |
04.11.13. – 05.11.13. |
|
3 |
побудова математичної моделі |
06.11.13. – 09.11.13. |
|
4 |
схема алгоритму розв’язку задачі |
10.11.13. – 13.11.13. |
|
5 |
оцінка коректності алгоритму |
14.11.13. – 16.11.13. |
|
6 |
аналіз алгоритму |
17.11.13. – 19.11.13. |
|
7 |
розробка програми |
20.11.13. – 27.11.13. |
|
8 |
опис програми |
28.11.13. – 10.11.13. |
|
9 |
контрольний приклад |
10.11.13. – 18.11.13. |
|
10 |
список літератури і додатки |
18.12.13. – 21.12.13 |
|
11 |
оформлення пояснювальної записки |
21.12.13. – 23.12.13 |
Студентка Мельник І. М.
Керівник Білощицька С. В.
Зміст:
- Завдання на курсову роботу.
- Постановка задачі.
- Теоретичні відомості.
- Аналіз поставленої задачі, вхідні та вихідні дані.
- Математична постановка задачі.
- Схема алгоритму.
- Оцінка складності алгоритму.
- Тестовий приклад.
- Опис програми.
- Результати роботи програми.
- Список літератури.
- Додаток 2: текст програми.
Постановка задачі:
Послідовність ДНК являє собою текст алфавіту {A, C, G, T}, а ген або відрізок гену – зразок пошуку.
З заданим зразком гену знайти:
- Ген в послідовності ДНК за допомогою алгоритму Хорспула.
Теоретичні відомості:
Алгоритими пошуку рядка (англ. string searching algorithms) — важливий клас рядкових алгоритмів, що намагаються знайти місце де один або декілька текстових рядків (зразків, англ. pattern) входять у довший рядок або текст. Формальна постановка задачі пошуку рядка (англ. string-matching problem) така:
Нехай текст задано у вигляді масиву довжини , а зразок — масиву довжини . Передбачається, що елементи масивів — символи із скінченного алфавіту . Наприклад, алфавіт може мати вигляд чи . Зразок зустрічається у тексті зі зсувом , якщо і (іншими словами ). Якщо зразок зустрічається у тексті зі зсувом , то величину називають допустимим зсувом; інакше її називають недопустимим зсувом. Задача полягає в знаходженні всіх допустимих зсувів, з якими зразок зустрічається у тексті .
Алгоритм Хорспула — алгоритм пошуку рядка — спрощений алгоритму Бояра — Мура. АБМХ працює краще алгоритму Бояра — Мура на випадкових текстах. До того ж, вимагає багатьох попередніх обчислень евристика співпала суфікса опускається.
Аналіз поставленої задачі, вхідні та вихідні дані:
Вхідні дані: |
Вихідні дані: |
Текст алфавіту символів A, C, G, T – char s1[]=”F” де F – текст алфавіту |
|
Зразок пошуку – char s2[]=”T”, де T – зразок тексту. |
Для розрахунку поточної позиції зразку s2 в тексті s1 використовується програма-функція Horspool(). В Пр-Ф використовуються так зміні:
int i, j, k, needle_len, haystack_len, needle_table[256], char *p,
i – лічильник поточного останнього символу в s1.
j – лічильник поточного символу в s2, k – в s1.
needle_len, haystack_len – довжина s2 та s1 відповідно.
*р – покажчик на символ
needle_table[256] – Для збереження таблиці символів використаємо статичний масив розміром 256, так як таблиця символів ASCII складається з 256-ти символів.
Математична постановка задачі:
- Будуємо таблицю символів:
for (i = 0; i < 256; i++) {needle_table[i] = needle_len;}
- Кожному символу з таблиці ставитися у відповідність його порядковий номер з needle:
for (i = 1; i < needle_len; i++) {needle_table[needle[i-1]] = needle_len-i;}
- Порівняння символів тексту та шаблону з кінця: Якщо вони однакові ()
while (j > 0 && haystack[k-1] == needle[j-1]) { --k; --j; }
Якщо вони однакові (haystack[k-1] == needle[j-1]) то переходимо до попередніх елементів (--k; --j;). Якщо j==0, то шаблон та текст співпали.
Схема алгоритму:
Рис. 1. Блок-схема алгоритму головної програми.
Рис. 2.1. Блок-схема алгоритму підпрограми Horspool.
Рис. 2.2. Блок-схема алгоритму підпрограми Horspool.
Рис. 2.3. Блок-схема алгоритму підпрограми Horspool.
Оцінка складності алгоритму:
Алгоритм Хорспула працює краще алгоритму Бойєр - Мура на випадкових текстах, оцінка в середньому від до на один символ тексту. До того ж, вимагає багатьох попередніх обчислень евристика совпавшего суфікса опускається.
Втім, оцінка (в гіршому
випадку на неперіодичних шаблонах)
у АХ становить |needle|·|haystack| (замість
3·|haystack| у Бойєр-Мура).
Тестовий
приклад:
Знайдемо зразок «ACGT» в тексті «ACTTGTCACGTACGTAC»
A |
C |
G |
T(та всі інші символи) |
1 |
2 |
3 |
4 |
Таблиця символів:
При першому порівнянні співпали 4-ті елементи, але не співпали 3-ті елементи. Стоп-символ в тексті «Т» – пересуваємо шаблон на 4.
Далі:
Стоп-символ «А» – на 1.
Стоп-символ «С» – на 2.
Текст повністю співпав с шуканим зразком. Результат 8.
Опис процедур і функцій програми:
Підпрограма int Horspool(char *haystack, char *needle) – будує таблицю символів, порівнює символи та пересуває шаблон на відповідну позицію, згідно таблиці символів.
Результати роботи програми:
Рис. 3. Виконання програми.
Список використаної літератури:
- Конспект лекцій з курсу «Алгоритми і структури даних» Білощицька С.В.
- Основы алгоритмизации и программирования. Голицына О.Л., Попов И.И. Москва – 2008.
- Абстракция данных и решение задач на Си++. Френк Каррано, Джанет Причард. М. - С. - К. – 2003.
Додаток 1: Текст програми.
#include <vcl.h>
#include <iostream>
#include <string>
#include <vector>
#pragma hdrstop
#define ASIZE 255
using namespace std;
typedef unsigned char byte;
typedef vector <int> arr;
//----------------------------
#pragma argsused;
int Horspool(char *haystack, char *needle)
{
int i,j,k, needle_len = 0,haystack_len = 0;
int needle_table[256]; // таблиця символів
char *p; // покажчик на символ
for ( p = needle; *p; *p++) // кіл-ть символів в needle
++needle_len;
for ( p = haystack; *p; *p++) // кіл-ть символів в haystack
++haystack_len;
if (needle_len < haystack_len) //
{
for (i = 0; i < 256; i++) // в таблицю заноситься для кожного символу довжина needle
needle_table[i] = needle_len;
for (i = 1; i < needle_len; i++) // кожному символу з таблиці ставиться у відповідність його порядковий номер із needle
needle_table[needle[i-1]] = needle_len-i;
i = needle_len; // i - лічильник поточного останього символа в haystack
j = i; // j - лічильник в needle кіл-ті однакових символів (співпавших з таблицею) з кінця
while (j > 0 && i <= haystack_len) // если j==0 то співпадання знайдено
{
j = needle_len; // заново виконуємо присвоєння, щоб порівняти рядки з кінця
k = i; // k - покажчик поточного символа в haystack
// j - покажчик поточного символа в needle
while (j > 0 && haystack[k-1] == needle[j-1]) // порівняння останніх символів
{ // якщо однакові, переходимо до попередніх
}
i+=needle_table[haystack[i-1]]
}
if (k > haystack_len - needle_len) // якщо k виходить за межі порівняння то...
return 0;
else return k+1; // інакше k== поточна позиція шаблону needle в рядку haystack
}
else return 0; // if (needle_len >= haystack_len)
}
//----------------------------
int main(int argc, char* argv[])
{
char s1[] = "ACTTGTCACGTACGTAC";
char s2[] = "ACGT";
printf("Text: %s\n", s1);
printf("Sample: %s\n", s2);
printf("Result: %i\n", Horspool(s1,s2));
system("pause");
return 0;
}

- Алгоритм принятия решений об увольнении сотрудников
- Алгоритм принятия управленческих решений
- Алгоритм принятия управленческого решения при различных типах менеджмента
- Алгоритм разработки анкеты
- Алгоритм разработки и реализации стратегии развития региона
- Алгоритм разработки маркетинговой стратегии для антикризисного управления
- Алгоритм разработки, принятия и реализации управленческих решений
- Алгоритм поиска гамильтонова пути в графе
- Алгоритм поиска кратчайшего пути
- Алгоритм поиска по бинарному дереву
- Алгоритм поиска экстремумов заданной функции методами Монте-Карло
- Алгоритм «Поразрядная сортировка»
- Алгоритм построения оптимального префиксного кода
- Алгоритм построения шкалы Лайкерта