Как найти часто встречающиеся тексте последовательности?
Есть большой текстовый файл. Около 120 гигабайт русскоязычного текста.
Нужно найти 30-40 наиболее часто встречающихся последовательностей символов, длиной более 4-5 символов.
С помощью чего можно решить эту задачу?
Если есть стандартные программы - отлично.
Если есть исходники на c\c++, rust, nim - хорошо.
На худой конец подскажите алгоритм (писать очень не хочется, занятость сильная, но куда деться в крайнем случае)
anikavoi дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац). В противном случае, ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.
Модератор, прошу прощения, но мне действительно подойдет любое из решений, или алгоритм, или исходник, или решение средствами утилит линукс, поэтому я и поставил три тэга.
Буду аккуратнее.
Обратите внимание, что std::string использует SBO, то есть не выделяет доп. память в куче для коротких строк. Ещё стандартные мапы в C++ крайне неэффективны, подключите библиотеку. Идея такова:
Хешмап "строки -> счётчики" для строк длины 3
Хешмап "строки -> счётчики" для строк длины 4, но добавляем туда только строки, у которых начало длины 3 входит в мапу из (1) не менее 2 раз
Хешмап "строки -> счётчики" для строк длины 5, но добавляем туда только строки, у которых начало длины 4 входит в мапу из (2) не менее 2 раз
anikavoi, вовсе нет. Если смущает размер можно заменить std::string на целочисленный хэш. После нахождения хэшей-лидеров можно восстановить исходные символьные последовательности вторым проходом.
120 гигабайт - это размер еще не Биг-дата но уже близкий к выходу за рамки оперативной памяти. Если исходный материал побит на файлы (небольшого размера) то я-бы предложил решать эту задачу через map-reduce.
Если удасться это сделать то реализация написанная на Python может работать быстрее во много раз за счет параллелизма. Я не говорю что на С++ не надо делать. Я просто акцентирую внимание что задача имеет специфику распаралелливания. Грубо говоря задача тяготеет к big-data и шаблонам паралельного процессинга для которых язык не особо важен а важна имеено эта опция.