Задайте последовательность данных (с дубликатами), переместите окно фиксированного размера вдоль последовательности данных и найдите режим в окне на каждой итерации, где самые старые данные удаляются и новые данные вставляются в окно.
Я не могу найти лучшего решения здесь.
Моя идея:
Используйте хеш-таблицу, ключ - это данные, ключ - это частота данных, появляющихся в окне.
На первой итерации повторяйте все данные в окне и помещайте их в хеш-таблицу, в то же время определяйте частоту каждого из данных. После этого пройдитесь по хеш-таблице и верните данные с самой высокой частотой.
Для каждой следующей итерации ищите самые старые данные в хеш-таблице и уменьшайте их частоту на 1, если они находятся в hahstable, если они становятся 0, используйте новые данные для замены старых. В противном случае просто вставьте новые данные в hahstable. Пройдите через стол и вернитесь в режим.
Это O (n * m), где n - размер данных seq, а m - размер окна.
Недостатком является то, что размер хеш-таблицы не является фиксированным, возможно, он имеет размер при изменении размера. Каждая итерация, таблица должна быть пройдена, она не эффективна.
Возможно ли сделать это с помощью O (n lg m) или O (n)?
Любая помощь приветствуется.
спасибо
Другое решение:
На первой итерации создайте хеш-таблицу с данными в качестве ключа и его частотой в качестве значения, связанного с ключом. На основе хеш-таблицы создайте мультикарту с частотой в качестве ключа и связанными данными в качестве значения.
После этого на каждой итерации в окне удаляйте самые старые данные и обновляйте хэш-таблицу, а затем обновляйте мультикарту, используя новейшую обновленную таблицу в хеш-таблице. Если ключ карты содержит несколько данных, замените его новым только данными, частота которых не изменилась. Но добавьте новую пару с новой частотой и данными.
В появившемся окне получите новые данные, а также обновите хеш-таблицу, обновите мультикарту, добавив новейшую обновленную таблицу в хеш-таблицу.
Запись, расположенная в самой правой части мультикарты (двоичное дерево поиска), является режимом, поскольку ее значение является самой высокой частотой в текущем окне.
Время O (m + m * lg m + n * lg m), если n >> m, O (n lg m).
Пространство: O (м)
Есть идея получше?