У меня есть большая последовательность кортежей на диске в виде
(t1, k1)
(t2, k2)
...
(тн, кн)
ti - это монотонно увеличивающаяся временная метка, а ki - это ключ (если необходимо, примите строку фиксированной длины). Ни ти, ни ки не гарантированно являются уникальными. Тем не менее, количество уникальных тис и поцелуев огромно (миллионы). Сам по себе n очень большой (100 миллионов +), а размер k (около 500 байт) делает невозможным хранение всего в памяти.
Я хотел бы выяснить периодические появления ключей в этой последовательности.
Например, если у меня есть последовательность
(1, а)
(2, б)
(3, с)
(4, б)
(5, а)
(6, б)
(7, д)
(8, б)
(9, а)
(10, б)
Алгоритм должен излучать (a, 4) и (b, 2). То есть происходит с периодом 4, а b происходит с периодом 2.
Если я соберу хэш всех ключей и сохраню среднее значение разницы между последовательными временными метками каждого ключа и стандартным отклонением одного и того же, я смогу сделать пропуск и сообщить только о тех, которые имеют приемлемый стандартное отклонение (в идеале, 0). Однако для каждого уникального ключа требуется одна корзина, тогда как на практике у меня может быть очень мало действительно периодических шаблонов. Есть ли лучшие способы?