IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Алгоритм Боуера-Мура. "c" -> "pascal"
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


SOS Народ!! дайте пожалуйста у кого естя Алгоритм Боуера-Мура НА ПАСКАЛЕ!!!
Я в инете находил... но они все не работают (2).... ...(а у меня осталось всего три дня!!!!)
Или переведите вот с языка СИ на Паскаль:) с комментариями, если можно, пожалуйста!!!
:thanks:

/* Preprocessing of the Bad Character function shift */
PRE_BC( char *x, int m, int bm_bc[] ) {
int a, j;

for ( a=0; a < ASIZE; a++ ) bm_bc[ a ] = m;
for ( j=0; j < m-1; j++ ) bm_bc[ (unsigned char)x[ j ] ] = m - j - 1;
}

/* Preprocessing of the Good Suffix function shift */
PRE_GS( char *x, int m, int bm_gs[] ) {
int i, j, p, f[XSIZE];

memset( bm_gs, 0, ( m + 1 ) * sizeof( int ) );
f[ m ] = j = m + 1;
for (i=m; i > 0; i-- ) {
while ( j <= m && x[ i - 1 ] != x[ j - 1 ] ) {
if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = j - i;
j = f[ j ];
}
f[ i - 1 ] = --j;
}
p=f[ 0 ];
for ( j=0; j <= m; ++j ) {
if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = p;
if ( j == p ) p = f[ p ];
}
}

/* Boyer-Moore string matching algorithm */
void BM( char *x, char *y, int n, int m ) {
int i, j, bm_gs[XSIZE], bm_bc[ASIZE];

/* Preprocessing */
PRE_GS( x, m, bm_gs );
PRE_BC( x, m, bm_bc );
i=0;
while ( i <= n-m ) {
for ( j=m-1; j >= 0 && x[j] == y[ i+j ]; --j );
if ( j < 0 ) {
OUTPUT(i);
i += bm_gs[ j+1 ];
}
else i += MAX(( bm_gs[ j+1 ]), ( bm_bc[ (unsigned char)y[ i+j ] ] - m + j + 1 ) );
}
}



Заранее спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


volvo, Интересно получилось.
Но больше пытаюсь понять, тем больше вопросов.

1. А где мы задаём образ для поиска ?
2 where: pchar; а что это ?
3. uses strings; и где мы это используем эту библиотеку ?


  assign(f, 'c:\f.txt'); reset(f, 1);
n := filesize(f);

getmem(where, succ(n));
blockread(f, where[1], n);
close(f);

А что мы тут делаем ? И куда мы чего переписываем ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(Dron671 @ 17.02.2006 20:46)
1. А где мы задаём образ для поиска ?

function bmSearch(start: integer;
const s: pchar; const p: string): integer;
Параметр P это и есть образ для поиска...


Цитата(Dron671 @ 17.02.2006 20:46)
2 where: pchar; а что это ?

А это PChar - для работы с длинными строками... Теорию читать здесь:
FAQ: Строки. Краткая теория


Цитата(Dron671 @ 17.02.2006 20:46)
3. uses strings; и где мы это используем эту библиотеку ?
А вся работа с типом PChar (все процедуры и функции) реализована в модуле Strings, поэтому как только я в программе использую тип PChar, я сразу добавляю в список модулей и Strings тоже...


Цитата(Dron671 @ 17.02.2006 20:46)
А что мы тут делаем ? И куда мы чего переписываем ?

  assign(f, 'c:\f.txt'); reset(f, 1);
{ размер файла - именно столько символов нужно для хранения строки }
n := filesize(f);

{
тут запрашиваем динамическую память, достаточную для
хранения строки + 1 символ - завершающий #0
}
getmem(where, succ(n));

{
Читаем блок даннях из файла (для доп. информации - TP Help) длиной N символов,
то есть все содержимое файла в выделенную память начиная с первой позиции
}
blockread(f, where[1], n);

{ закрываем файл, он нам больше не нужен... }
close(f);
 К началу страницы 
+ Ответить 

Сообщений в этой теме
eprsteklmn   Алгоритм Боуера-Мура. "c" -> "pascal"   10.12.2004 0:01
volvo   eprsteklmn Плохо искал: Здесь лежит полностью раб…   10.12.2004 0:36
eprsteklmn   volvo ПОльзовался я Поиском!!.... он как …   10.12.2004 0:52
eprsteklmn   volvo А можно для меня-как глупого и неопытного е…   10.12.2004 1:55
volvo   eprsteklmn Я оставил {result}, т.к. не имею поня…   10.12.2004 2:00
eprsteklmn   volvo Пасиба...теперь все пучком!!!   10.12.2004 2:05
Dron671   Посмотрел программку. И и не понял. Можете немного…   17.02.2006 5:52
volvo   Что тут комментировать? Теория хорошо описана вот…   17.02.2006 5:55
Dron671   Хех. Как быстро. Описание подробнее не куда. Вот …   17.02.2006 6:06
volvo   Dron671, я конечно тоже извиняюсь, но я попробовал…   17.02.2006 16:54
volvo   Вот то, что я нашаманил: uses strings; type arrT…   17.02.2006 19:45
Dron671   volvo, Интересно получилось. Но больше пытаюсь пон…   18.02.2006 1:46
volvo   1. А где мы задаём образ для поиска ? function bmS…   18.02.2006 1:57
Dron671   volvo, Спасибо большое. Всё работает.   19.02.2006 7:24
Dron671   Кажись не всё понятно. Точнее опят туплю. for i …   1.03.2006 5:50
Dron671   ну кто ни-будь ! Byte(p[i]) что это такое ?   2.03.2006 5:13
volvo   Ну что ты, про приведение типов (typecast) никогда…   2.03.2006 5:56
Dron671   А что получается из этого bmT[Byte(p[i])] ? Код A…   2.03.2006 15:55
volvo   Byte(p[i]) = Ord(p[i])... Кодом Ascii ты НЕ МОЖЕШ…   2.03.2006 16:18


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.12.2025 21:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name