嗯,这个问题有点具体,但我认为有一些一般性的想法,我无法得到它。
假设我有K台服务器(这是我知道它的大小的常量)。我有一个获取请求的程序,每个请求都有一个id和服务器ID来处理它。我有n个请求 - 未知大小,可以是任何数字。
我需要一个数据结构来支持给定复杂性中的下一个操作:
GetServer - 该函数获取请求ID并返回当前情况下应该处理此请求的服务器ID,而不一定是原始服务器(见下文)。
复杂性: O(日志K)平均。
KillServer - 该函数获取应删除的服务器ID和另一个服务器ID作为输入,该服务器ID应删除已删除服务器的所有请求。
在最糟糕的情况下,复杂性: O(1)。
-
所有结构的位置复杂度为O(K + n)
-
KillServer函数让我想到使用Union-Find,因为我可以按照要求在O(1)中进行并集,但我的问题是第一个操作。为什么它是LogK?实际上,无论我如何“保存”请求,如果我想访问任何请求(假设它是一个AVL树),那么在最坏的情况下复杂性将是O(log n)并且说我不能假设K> ; n(可能是K.
尝试了几个小时,但我找不到任何解决方案。 可以使用的已知结构是:B +树,AVL树,跳过列表,哈希表,联合查找,排名树,当然还有所有基础知识,如数组等。
答案 0 :(得分:1)
考虑一个由两部分组成的数据结构:
最初,作业ID等于服务器ID。删除服务器后,服务器将处理多个作业。
换句话说,您只需添加一个小的间接client -> job -> server
,以便您的操作只触及第一个箭头或仅触及第二个箭头。
答案 1 :(得分:0)
从服务器分区的请求开始的Union-find应该有效。您从每个请求开始指向它的服务器,然后将服务器(而不是请求)联合在一起。因此,GetServer的摊销成本将是O(alpha(K))而不是O(alpha(n)),其中O(alpha(K))<< O(log K)。
答案 2 :(得分:0)
您可以尝试使用哈希表(哈希表的每个条目都是对列表的引用):
让哈希表的大小为大于K的最小素数(p
)。
然后,requestID的哈希函数为requestID % p
。这会使GetServer
O(1)的复杂性。但是,这样做的缺点是没有requestID的平衡。