特定的数据结构

时间:2010-12-26 09:57:36

标签: data-structures complexity-theory

嗯,这个问题有点具体,但我认为有一些一般性的想法,我无法得到它。

假设我有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树,跳过列表,哈希表,联合查找,排名树,当然还有所有基础知识,如数组等。

3 个答案:

答案 0 :(得分:1)

考虑一个由两部分组成的数据结构:

  • 从客户端ID到作业 ID的有限地图(AVL树等)
  • union-find数据结构,用于对作业ID进行分组,并使用服务器ID标记每个组

最初,作业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的平衡。