Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Алгоритм Боуера-Мура (смертельно срочно!)

16K
14 октября 2006 года
Жан
21 / / 30.09.2006
Друзья мои! Прошу вас, спасите человека от гибели!
Мне очень срочно нужен алгоритм Боуера-Мура. Я уже нашел вроде бы подходящую ссылку на эту тему, но не смог до конца с ней разобраться.
Ссылка такова: http://algolist.manual.ru/search/esearch/bm.php
Помогите мне, пожалуйста, составить полноценную, работающую программу, опираясь на эти материалы или на ваш собственный опыт.
Я очень нуждаюсь в вашей помощи. Пожалуйста, не покидайте меня в столь трудную минуту... :(
5.4K
14 октября 2006 года
Svyatozar
221 / / 11.09.2006
дык там же код уже прописан?
16K
14 октября 2006 года
Жан
21 / / 30.09.2006
Цитата:
дык там же код уже прописан?


Код-то, конечно, прописан, да не все так просто. В этом коде, если внимательно в него вглядеться, отсутствует функция void main(), которую нужно написать самому. Мне скажут: "А в чем же проблема? Сядь и напиши!"
Я поначалу тоже так думал и в приблизительно понимаю, как все это сделать. Но все мои попытки ни к чему не приводят, точнее сказать, не приводят к окончательному результату. Ведь в программировании нет понятия "почти правильно". Здесь есть только: сделал или не сделал, да или нет, 1 или 0.
И как я ни бился, мне не удалось сделать из этого кода нормально работающую программу, которая выполняла бы требумые команды.
Помогите мне, пожалуйста. Жизнь моя висит на волоске, и только благодаря помощи великодушного человека она может быть сохранена. :(

20K
14 октября 2006 года
luksor
8 / / 09.10.2006
я так понял, здесь никто за тебя писать "с нуля" не будет.
Поэтому приведи хотя бы то что ты уже сделал(правильно не правильно, не имеет значения), а опытные люди помогут чем смогут.
14K
14 октября 2006 года
fly_girl
13 / / 24.04.2006
[QUOTE=Жан]Код-то, конечно, прописан, да не все так просто. В этом коде, если внимательно в него вглядеться, отсутствует функция void main(), которую нужно написать самому. Мне скажут: "А в чем же проблема? Сядь и напиши!"
Я поначалу тоже так думал и в приблизительно понимаю, как все это сделать. Но все мои попытки ни к чему не приводят, точнее сказать, не приводят к окончательному результату. Ведь в программировании нет понятия "почти правильно". Здесь есть только: сделал или не сделал, да или нет, 1 или 0.
И как я ни бился, мне не удалось сделать из этого кода нормально работающую программу, которая выполняла бы требумые команды.
Помогите мне, пожалуйста. Жизнь моя висит на волоске, и только благодаря помощи великодушного человека она может быть сохранена. :([/QUOTE]
так вы все поняли, только вам нужна функция main?
а что в ней должно быть? (ну например должны вводиться какие-то данные и с ними выполняться этот алгоритм?)
16K
14 октября 2006 года
Жан
21 / / 30.09.2006
Цитата:
я так понял, здесь никто за тебя писать "с нуля" не будет.
Поэтому приведи хотя бы то что ты уже сделал(правильно не правильно, не имеет значения), а опытные люди помогут чем смогут.


А разве я прошу делать с нуля? На том сайте, который я указал, программа выполнена уже на 95%. Остается только правильно оформить главную функцию - void main(). Это должно составить всего лишь 3-5 строк, и тому, кто занет, что такое алгоритм поиска Боуера-Мура, придется затратить на весь процесс не более 5 минут.
Будет затрачено всего лишь 5 минут, а польза от этого будет огромна.
По-прежнему жду поддержки добрых людей. Каждая секунда приближает меня к гибели, но я надеюсь, что мне все-таки протянут руку помощи... :(

16K
14 октября 2006 года
Жан
21 / / 30.09.2006
Цитата:
а что в ней должно быть? (ну например должны вводиться какие-то данные и с ними выполняться этот алгоритм?)


Мне нужно считывать текстовый файл и находить в нем слово, введенное с клавиатуры.
Способ оформления - произвольный. Слово "поиск" - понятие расплывчатое, и можно выбрать любой вариант: выделение слова в тексте, указание номеров символов, которые входят в это слово, печать слов, в которые входит заданная символьная последовательность и т.д.
Способ не важен. Главное - рабочая программа. :(

5.4K
15 октября 2006 года
Svyatozar
221 / / 11.09.2006
Код:
#include <stdio.h>
#include <string.h>

#define ASIZE 1024
#define XSIZE 1024
#define MAX_FILE_SIZE 65000
#define MAX_WORD_LENGTH 1024
#define MAX(A, B) (((A) > (B))? (A): (B))

/* Preprocessing of the Bad Character function shift */
void 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  */
void 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 ) {
       printf("%d ", i);
      i += bm_gs[ j+1 ];
    }
    else i += MAX(( bm_gs[ j+1 ]), ( bm_bc[ (unsigned char)y[ i+j ] ] - m + j + 1 ) );
   }
  printf("\n");
}

int main(int argc, char **argv) {
    if(argc < 2) {
        printf("error: no input file specified\n"
            "usage: %s filename\n", argv[0]);
        goto done;
    }
    FILE *fi;
    if(!(fi = fopen(argv[1], "r"))) {
        printf("error: can't open file %s\n", argv[1]);
        goto done;
    }
    // loading file into buffer
    char buf[MAX_FILE_SIZE];
    int file_size; // actual number of characters read
    if((file_size = fread(buf, 1, MAX_FILE_SIZE, fi)) < 1) {
        printf("error: input file is empty\n");
        goto close;
    }
//  printf("contents of file:\n%s\n", buf);
    printf("enter search word: ");
    char word[MAX_WORD_LENGTH];
    int word_length = scanf("%s", word); // actual size of word entered
    printf("looking for word '%s'...\n", word);
    BM(word, buf, file_size, word_length);
close:
    fclose(fi);
done:
    return 0;
}
16K
15 октября 2006 года
Жан
21 / / 30.09.2006
Svyatozar, огромное тебе спасибо! Ты мне здорово помог.
Но мне хотелось бы спросить, почему при запуске программы выдаюстя ошибки. Эти ошибки можно увидеть во вложенном файле.
Посмотрите, пожалуйста. :confused:
5.4K
16 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=Жан]Svyatozar, огромное тебе спасибо! Ты мне здорово помог.
Но мне хотелось бы спросить, почему при запуске программы выдаюстя ошибки. Эти ошибки можно увидеть во вложенном файле.
Посмотрите, пожалуйста. :confused:[/QUOTE]
Если компилятор не находит stdio.h значит что-то не так в настройках компилятора. Что за компилятор?

Если справишься, попробуй это:
Код:
int main(int argc, char **argv) {
    FILE *fi;
    char buf[MAX_FILE_SIZE];
    int file_size; // actual number of characters read
    char word[MAX_WORD_LENGTH];
    if(argc < 2) {
        printf("error: no input file specified\n"
            "usage: %s filename\n", argv[0]);
        goto done;
    }
    if(!(fi = fopen(argv[1], "r"))) {
        printf("error: can't open file %s\n", argv[1]);
        goto done;
    }
    // loading file into buffer
    if((file_size = fread(buf, 1, MAX_FILE_SIZE, fi)) < 1) {
        printf("error: input file is empty\n");
        goto close;
    }
//  printf("contents of file:\n%s\n", buf);
    printf("enter search word: ");
    int word_length = scanf("%s", word); // actual size of word entered
    printf("looking for word '%s'...\n", word);
    BM(word, buf, file_size, word_length);
close:
    fclose(fi);
done:
    return 0;
}
Мой совет: не использовать старые компиляторы.
16K
16 октября 2006 года
Жан
21 / / 30.09.2006
Все, я разобрался! Спасибо за помощь! :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог