Боюсь, что разрыв строки не подойдет.
Вообще говоря, рано убежать сложно, поэтому лучше разбить текст на куски.
Но давайте сначала попросим Херба Саттера объяснить поиск параллельными алгоритмами на Доктор Доббс . Идея состоит в том, чтобы использовать неравномерность распределения, чтобы иметь ранний доход. Конечно, Саттер заинтересован в любом совпадении, что не является проблемой, так что давайте адаптироваться.
Вот моя идея, скажем, у нас есть:
- Текст длины
N
p
Процессоры
- эвристика:
max
- максимальное количество символов, которое должен содержать чанк, возможно, на порядок больше, чем M
длина шаблона.
Теперь вам нужно разделить текст на k
равных кусков, где k
минимально, а size(chunk)
максимально, но хуже max
.
Затем у нас есть классический шаблон Producer-Consumer
: процессы p
передаются кусками текста, каждый процесс ищет шаблон в полученном фрагменте.
Ранний побег осуществляется с помощью флага. Вы можете либо установить индекс чанка, в котором вы нашли шаблон (и его положение), либо вы можете просто установить логическое значение и сохранить результат в самих процессах (в этом случае вам придется пройти через все процессы, как только они прекратились). Дело в том, что каждый раз, когда запрашивается порция, производитель проверяет флаг и прекращает подачу процессов, если найдено совпадение (поскольку процессам даны порции в порядке).
Давайте рассмотрим пример с 3 процессорами:
[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ]
x x
Куски 6
и 8
содержат строку.
Производитель сначала подает 1, 2 и 3 на процессы, затем каждый процесс продвигается в своем собственном ритме (это зависит от сходства искомого текста и шаблона).
Допустим, мы находим шаблон в 8
, прежде чем найдем его в 6
. Затем процесс, работавший над 7
, завершается и пытается получить другой кусок, производитель останавливает его -> это не имеет значения. Затем процесс, работающий над 6
, заканчивается результатом, и, таким образом, мы знаем, что первое вхождение было в 6
, и у нас есть его позиция.
Ключевая идея в том, что вы не хотите смотреть на весь текст! Это расточительно!