Змінюй хід війни! Допомагай ЗСУ!

Помогите составить алгоритм

  • Автор теми Автор теми Ferox
  • Дата створення Дата створення
Царьков В.Б. Теория и методика построения регулярных выражений.
всё чушь
где практика?
вы уже автореферат пишите?
похоже вы слабы в научных исследованиях
- проблема
- анализ
- теория
- практика
- выводы

вот рекомендованая ваком структура, вы в курсе, что в перечне лимтератьуры на учебники нельзя ссылаться? подумайте почему, пожалуйста :D

А вы только сообщения на форумах читаете? Книги не любите?

это личный вопрос
хабу не должен отвечать
 
Царьков В.Б. Теория и методика построения регулярных выражений.

и где ТЕОРИЯ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ? у Вас как с пониманием слов??

по просьбам дворянства выкладываю индийский вариант:
PHP:
print_r(matchCharPatternIndian('12345', '12...,,,3.4,543534..1...,,,2.34...5'));

function matchCharPatternIndian($pattern, $subject)
{
    $result = array();
    $patternIndex = 0;
    $patternLen = strlen($pattern);
    $startPos = null;
 
    $count = strlen($subject); 
    for ($i=0; $i<$count; $i++) {
        $char = $subject[$i];
        
        if ($char != $pattern[$patternIndex]) {
            //Match not found
            if (!is_null($startPos) && !in_array($char, array('.', ','))) { //Reset search:  
                $patternIndex = 0;   
                $startPos = null;    
            } 
            continue;
        }
        
        //Match found:
        if (is_null($startPos)) { //First char in pattern
            $startPos = $i;      
        }
        
        $patternIndex++;
        if ($patternIndex >= $patternLen) {
            //Last char found
            $result[] = substr($subject, $startPos, $i-$startPos+1); 
            $patternIndex = 0;   
            $startPos = null;    
        }     
    }
    
    return $result;
}

ну чо, меряемся производительностью труда?
 
и где ТЕОРИЯ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ? у Вас как с пониманием слов??

по просьбам дворянства выкладываю индийский вариант:
PHP:
print_r(matchCharPatternIndian('12345', '12...,,,3.4,543534..1...,,,2.34...5'));

function matchCharPatternIndian($pattern, $subject)
{
    $result = array();
    $patternIndex = 0;
    $patternLen = strlen($pattern);
    $startPos = null;
 
    $count = strlen($subject); 
    for ($i=0; $i<$count; $i++) {
        $char = $subject[$i];
        
        if ($char != $pattern[$patternIndex]) {
            //Match not found
            if (!is_null($startPos) && !in_array($char, array('.', ','))) { //Reset search:  
                $patternIndex = 0;   
                $startPos = null;    
            } 
            continue;
        }
        
        //Match found:
        if (is_null($startPos)) { //First char in pattern
            $startPos = $i;      
        }
        
        $patternIndex++;
        if ($patternIndex >= $patternLen) {
            //Last char found
            $result[] = substr($subject, $startPos, $i-$startPos+1); 
            $patternIndex = 0;   
            $startPos = null;    
        }     
    }
    
    return $result;
}

ну чо, меряемся производительностью труда?

Антон, ну вот это уже АЛГОРИТМ. А то регулярные выражения, регулярные выражения.
 
Формализовать вашу веру в судьбу в виде исходного кода корректно работающего алгоритма, не?

Код:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static inline
int is_special(const char ch)
{
    return (ch == ',') || (ch == '.');
}

/*
 * remove special characters and store positions
 */
void strip_special(const char *input, char **packed, unsigned int **positions)
{
    /* allocation stuff */
    unsigned int packed_len = 0;
    const char *p;
    for(p = input; *p; p++)
    {
        if(!is_special(*p))
            packed_len++;
    }

    *packed = malloc(sizeof(char) * (packed_len + 1));
    *positions = malloc(sizeof(unsigned int) * (packed_len + 1));

    /* packing stuff */
    unsigned int packing_position = 0,
                 input_position = 0;
    for(; input[input_position]; input_position++)
    {
        if(!is_special(input[input_position]))
        {
            (*packed)[packing_position] = input[input_position];
            (*positions)[packing_position] = input_position;
            packing_position++;
        }
    }

    (*packed)[packing_position] = 0;
    (*positions)[packing_position] = input_position;
}

/*
 * find substrings
 */
int* search(const char *input, const char *pattern,
            unsigned int input_len, unsigned int pattern_len)
{
    /* KMP */
    unsigned int table_len = input_len + 1 + pattern_len;

    char *kmp_string = malloc(sizeof(char) * table_len);
    unsigned int *sublens = malloc(sizeof(unsigned int) * table_len);

    memcpy(kmp_string, pattern, pattern_len);
    kmp_string[pattern_len] = 0;
    memcpy(kmp_string + pattern_len + 1, input, input_len);
    
    sublens[0] = 0;

    unsigned int i = 1,
                 matched_len = 0,
                 match_count = 0;
    for(; i < table_len; i++)
    {
        while(matched_len > 0 && kmp_string[i] != kmp_string[matched_len])
            matched_len = sublens[matched_len - 1];

        if(kmp_string[i] == kmp_string[matched_len])
            matched_len++;

        sublens[i] = matched_len;

        if(matched_len == pattern_len)
            match_count++;
    }

    /* packing results */
    int *results = malloc(sizeof(unsigned int) * (match_count + 1));

    unsigned int match_number = 0;
    for(i = 0; i < table_len; i++)
    {
        if(sublens[i] == pattern_len)
        {
            results[match_number] = i - 2*pattern_len;
            match_number++;
        }
    }
    
    /* end of results mark */
    results[match_number] = -1;
    
    free(kmp_string);
    free(sublens);
    return results;
}

/*
 * extract result from unpacked string
 */
char* extract(unsigned int match, unsigned int pattern_len, 
             const char *input, unsigned int *positions)
{
    unsigned int start = positions[match],
                 end = positions[match + pattern_len - 1] + 1;
    char *result = malloc(sizeof(char) * (end - start + 1));
    memcpy(result, input+start, end - start);
    result[end - start] = 0;

    return result;
}

/*
 * testing stuff
 */
char *inputs[] =
{
    "1234",
    "123.4",
    "123.,4 asdfada",
    "asdfsad 23472.2423...4e",
    "123.3.,32.4,2.422",
    NULL
};

char *patterns[] = 
{
    "1",
    "42",
    "123",
    "345",
    "34",
    NULL 
};

int main()
{
    unsigned int input_number;
    for(input_number = 0; inputs[input_number]; input_number++)
    {
        char *input = inputs[input_number];

        printf("Processing \"%s\":\n", input);
        char *packed;
        unsigned int *positions;

        strip_special(input, &packed, &positions);

        unsigned int packed_len = strlen(packed);

        unsigned int pattern_number;
        for(pattern_number = 0; patterns[pattern_number]; pattern_number++)
        {
            char *pattern = patterns[pattern_number];
            unsigned int pattern_len = strlen(pattern);

            printf("  with pattern \"%s\":", pattern);
            int *matches = search(packed, pattern, packed_len, pattern_len);

            int match;
            for(match = 0; matches[match] != -1; match++)
            {
                printf("%s ", extract(matches[match], pattern_len, input, positions));
            }
            printf("\n");
            
            free(matches);
        }

        free(packed);
        free(positions);
    }
    return 0;
}

// vim: ts=4 sw=4 et

различия:
1. находит все вхождения подстрок, а не первое-единственное
2. оптимизированно под поиск большого кол-ва подстрок в исходной строке
3. код определения "специфичности" символа вынесен отдельно

так еще и идентификаторы информативненькие такие: k, d, s, pf, v1, v2..
Дима, это что за гуйня вообще? ты такому студентов учишь?
я за такое рожей по монитору размазываю.

а шо это за стандарты кодирования такие уникальные, что операторы for и if оформлены по разному?
блин, дилетансткое, потенциальное опасное, немасштабируемое...

просто это было скопиз[...]но с википедии
 
Антон, ну вот это уже АЛГОРИТМ. А то регулярные выражения, регулярные выражения.

Дима, это - программа.
алгоритм - это последовательность действий.
подтяни терминологию, пока никуда не годится. знаешь, как за это ипут??

в том, что ты не знаком с регулярными выражениями, нет ничего постыдного. стыдно - это когда в 21 веке пользуются Internet Explorer 6.0.
а еще стыднее, когда пытаются выдать его за мозиллу с исправленными "фатальными ошибками".
ты так и не ответил какую фатальную ошибку исправляет версия .NET Framework в user-agent. надо понимать - это личное, да?

просто это было скопиз[...]но с википедии

я быстрее написал с нуля и по-человечески, чем он колупал чужой примерчик.
и эти люди думают, что чему-то учат студентов.
 
просто это было скопиз[...]но с википедии

Да, модифицирован пример реализации КМП, я же писал. Антон то регулярные выражения за 5 мин составляет, набирать некогда :D

я быстрее написал с нуля и по-человечески, чем он колупал чужой примерчик.
и эти люди думают, что чему-то учат студентов.

Антон, ожидаю от реализации вашего алгоритма вот такой результат:
45,,,,,,,,,67..........8
 
Антон, ожидаю от реализации вашего алгоритма вот такой результат:
45,,,,,,,,,67..........8

чота машает поменять строку, передаваемую в аргумент $pattern???
опять не знаете как скомпилировать и интерпретировать?
 
та новая наука, теория индоевропейского оформления кода:
string pattern;
pattern = "45678";
а написать string pattern = "45678"; дворянское звание мешает.

Боюсь ваш "стандарт кодирования" нарушить :D

а что с ним не так? обоснуйте, пожалуйста.
мы приняли это:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

а Вы?

где производительность, Дима? сам же хотел сравнить. так давай же!
 
Назад
Зверху Знизу