构建数据结构

时间:2014-04-20 16:25:44

标签: algorithm data-structures runtime time-complexity avl-tree

  

给定自然数m≥2,我需要考虑一个数据结构,对于一组支持以下函数的自然数,具有运行时限制:

     

Init() - 初始化数据结构 - O(1)
  插入(k) - 将新数字k插入数据结构(仅当不存在时)。 - O(登录)
  delete(k) - 从数据结构中删除数字k。 - O(登录)
  sumDivM() - 返回m除以余数的数字量。 - O(1)
  equi(k) - 找到数字x,其中(x-k)除以m而没有余数。如果没有这样的号码,则返回FALSE。 - O(log(min(m,n)))
  pairDivM() - 如果数据结构包含它们的和除以m而没有余数的数字对,则返回TRUE,否则返回FALSE。 - O(1)

n是结构中当前元素的数量。

我想到了AVL树 - 其中Init,insert和delete与运行时限制一致 对于sumDivM,我将有一个int字段,每当我们插入一个除以m而没有余数的数字时,它将增加1(插入函数将检查这个)。这样我可以通过O(1)返回金额 对于equi(k)和pairDivM() - 如果没有在运行时禁止的树上运行,我找不到解决方案。任何想法?

1 个答案:

答案 0 :(得分:1)

首先要注意的是,给定一个数字x,你真的只关心x mod m,所以你不妨计算它并将其作为一个键输入x到AVL树中,它充当地图用键(x mod m)和一组数字,它们都等于x,mod m。

对于equi(k),只需查找(-k mod m)。

对于pairDivM(),当你在数据结构中输入数字x时,查找(-x mod m)集合的大小,因为对于所有这些数字,你要创建一对新的数字,这样( x + y)= 0 mod m。如果你保持对这些对的数量,你可以以O(1)成本回答pairDivM(),在插入和删除数字时修改它。

对于其他操作,我认为你已经覆盖了它们,或者它们相当明显,因为你有(x mod m)的AVL树。