вот и очередная задачка появилась, связанная с поиском одинаковой последовательности байтов, при чем эта последовательность неизвестна. Пример:
Цитата:
45 23 78 97 ff d3 a5 b2 bb 78
cc 32 98 ff d3 d5 23 43 aa 00
cd 99 00 12 33 51 43 ff d3 00
00 22 33 44 55 66 77 88 33 22
как видно, тут есть один блок, состоящий из 2х байтов, который присутствует во всех строчках, кроме последней:
ff d3. Для нахождения такой последовательности первое, что приходит - это решение "в лоб", тоесть:
сравнение первого символа первой строки со всеми символами второй, если совпадений не найдено, то поиск в третей строке, если совпадение найдено, то к первому символу добавляется второй и сравнивается в строке там где найдено совпадение, если совпадений с добавленным символом нет, то поиск продолжается снова с одним символом и так до последней строчки. Если после проверки последней строчки совпадений нет, то поис происходит уже со второго байта первой строки и т.д. Если блок найден, то этот блок ищется уже во всех оставшихся строчках и если он встречается более чем в 50% всех строк, то можно считать, что блок найден тот.
При не большом количестве строк поиск должен быть успешным вроде бы... Но если строк много, а строки длинные (200 байт), то обилие вложенных циклов существенно увеличит время нахождения таких блоков..
**
Из литературы на эту тему что можно почитать?
Вопрос темы звучит так: Алгоритм поиска последовательности байтов, которая встречается в 50и процентах всех строк.
Добавлено спустя 58 минут 36 секунд:я вот еще чуть подумал и придумал новый алгоритм, как думаете, он будет лучше вышенаписанного?
Суть заключается вот в чем, берется, сравнивается первая строка со второй:
Код:
MainBufA^[j]:=MainBufA^[j] and x[MainBufA^[j] xor Curr^.field1[j]];
(код, который вы мне порекомендовали)
Если сравниваемая строка полностью обнулилась, то такая последовательность нам не подходит.
следующим этапом вторую строку сдвигаем влево на один байт, тоесть было:
Цитата:
cc 32 98 ff d3 d5 23 43 aa 00
стало
Цитата:
32 98 ff d3 d5 23 43 aa 00 cc
и так до тех пор, пока не получим (для примера первую строку тоже напишу)
Цитата:
45 23 78 97 ff d3 a5 b2 bb 78
00 cc 32 98 ff d3 d5 23 43 aa
соответственно после очередного сравнения у нас будет
Цитата:
00 00 00 00 ff d3 00 00 00 00
Это то что найдено относительно второй строки. Далее последовательность
ff d3 ищем в оставшихся строках..
Такой способ лучше первого?
Сдвиг скорее всего будет осуществляться опять же с использованием цикла...