LFU-кэш
Вытесняет ключи с наименьшим числом обращений.
1class LFUCache {2 private freq = new Map<string, number>()3 private capacity: number4 5 constructor(capacity: number) { this.capacity = capacity }6 7 touch(key: string): number {8 const f = (this.freq.get(key) ?? 0) + 19 this.freq.set(key, f)10 if (this.freq.size > this.capacity) {11 let least: string | null = null12 for (const [k, v] of this.freq) {13 if (least === null || v < (this.freq.get(least) ?? 0)) least = k14 }15 this.freq.delete(least!)16 }17 return f18 }19}Проблема
Вытесняет ключи с наименьшим числом обращений.
Что вы видите
У каждого ключа счётчик; лимит выталкивает минимальный.
Как это работает
Честнее LRU к «горячим» данным, но слеп ко времени: вчерашний хит не устареет без aging. Подбирается под паттерн доступа.
Пошаговый разбор
- 01
Счётчик
Каждое обращение +1.
- 02
Вытеснение
Минимальная частота уходит.
- 03
Слепота
Старые хиты не стареют сам собой.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Кэш по частоте: кто реже — тому выйти»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.