Ну, этот вопрос немного конкретен, но я думаю, что в нем есть какая-то общая идея, что я не могу его получить.
Допустим, я получил K серверов (это константа, по которой я знаю его размер). У меня есть программа, которая получает запросы, и каждый запрос имеет идентификатор и идентификатор сервера, который будет обрабатывать его. У меня n запросов - неизвестного размера и может быть любым числом.
Мне нужна структура данных для поддержки следующих операций в рамках данной сложности:
GetServer - функция получает идентификатор запроса и возвращает идентификатор сервера, который должен обрабатывать этот запрос в текущей ситуации, а не обязательно на исходном сервере (см. Ниже).
Сложность : O (log K) в среднем.
KillServer - функция получает в качестве входных данных идентификатор сервера, который должен быть удален, и идентификатор другого сервера, на который следует передавать все запросы удаленного сервера.
Сложность : O (1) в худшем случае.
-
Место сложность для всей структуры O (K + n)
-
Функция KillServer заставила меня задуматься об использовании Union-Find, поскольку я могу выполнить объединение в O (1) по запросу, но моя проблема - первая операция. Почему это LogK? На самом деле, независимо от того, как я «сохраняю» запросы, если я хочу получить доступ к любому запросу (скажем, это дерево AVL), поэтому сложность будет O (log n) в худшем случае и сказал, что я не могу предположить K > n (и, вероятно, K
Пытался обдумать это пару часов, но я не могу найти никакого решения.
Известные структуры, которые можно использовать: дерево B +, дерево AVL, список пропусков, хэш-таблица, Union-Find, дерево рангов и, конечно, все основы, такие как массивы и тому подобное.