впоследствии поддерживает кэш LRU на основе самых последних данных, потому что люди с большей вероятностью будут повторять поиск
Это может быть разумным выбором дизайна, но в интервью я бы сформулировал это больше как вопрос к интервьюеру: «Было бы разумно предположить, что вызовы будут больше походить на последние значения, или есть другая ожидаемая группировка (большие числа будут запрашиваться чаще, чем маленькие или наоборот)? "
Например, может иметь смысл кэшировать LRU, но никогда не выбрасывать значения для 10, 20, 30, 40 и т. Д. Таким образом, наихудший случай для вычисления факториала после заполнения кэша этими значениями - выполнить 10 умножений.
Еще одно соображение, которое вы можете сделать, заключается в том, что компьютеры могут очень легко справляться с определенными факториалами:
- 12! является самым большим, который может содержаться в 32-разрядном слове.
- 20! является самым большим, что может содержаться в 64-битном слове.
- 34! это самое большое, что может быть в 128-битном слове.
Поскольку современные машины могут легко работать с 64-битной арифметикой (может быть, даже 128-битной арифметикой), также может иметь смысл никогда не кэшировать значение для 20! или ниже, как только кеш заполняется значениями, превышающими это.
Наихудший случай поиска пропущенного кэша будет зависеть от того, как вы храните кэш. Это массив, отсортированный по аргументу функции? (поиск O (log n)) Это массив в порядке LRU? (посмотрите на отсутствие кэша O (n)). Я думаю, вы также хотели бы прояснить, что вы хотите, чтобы поиск в кэше всегда возвращал самое высокое значение в кэше, которое меньше, чем вы ищете - это значение кэша представляет собой работу, которую вам не нужно делать для этого конкретного факторного расчета.