设计在O(logn)时间内工作的数据结构

时间:2012-02-21 20:48:49

标签: algorithm data-structures big-o time-complexity

我正在审核这个算法类的工作,我正在尝试做一些在课堂上给出的练习题。这个问题让我感到困惑,我无法绕过它。我的解决方案都没有在O(logn)时间内出现。任何人都可以帮我解决这个问题吗?

问题: 假设我们以任意顺序给出n个值x1,x2,...,xn的序列 寻求快速回答表格的重复查询:给出任意一对i和j 1≤i<1。 j≤n,找到x1,...,xj中的最小值。设计一个使用O(n)空间的数据结构,并在O(log n)时间内回答每个查询。

5 个答案:

答案 0 :(得分:3)

对于a1,a2,a3,... an的输入,构造一个节点,其中包含(a1,..,ak)的最小值和(ak + 1,..,an)的最小值,其中k = n / 2。

递归构造树的其余部分。

现在,如果你想找到ai和aj之间的最小值:

  1. 确定i,j的最低共同祖先。让它成为k
  2. 从i开始并继续前进,直至击中k。在每次迭代时检查子节点是否为左节点。如果是,则比较正确的子树的min并相应地更新当前min。
  3. 同样,对于j,检查它是否是正确的节点....
  4. 在节点k处比较每个子树返回的值并返回min

答案 1 :(得分:1)

人们正在过度思考这一点。假设您从列表开始:

47, 13, 55, 29, 56, 9, 17, 48, 69, 15

制作以下清单清单:

47, 13, 55, 29, 56, 9, 17, 48, 69, 15
13,     29,     9,     17,     15
13,             9,             15
9,                             15
9

我留下这些列表的构造,正确的用法,并证明他们提供原始问题的答案作为读者的练习。 (这可能不是你的功课,但它可能很容易成为某人,我不喜欢给作业问题的完整答案。)

答案 2 :(得分:0)

我认为关键的一步是你需要事先对数据进行排序。然后,您可以将数据存储在数组/列表中。然后你可以在O(logn)中运行快速二进制搜索,挑选满足条件的第一个值(我假设你的意思是xi和xj之间,而不是x1和xj)。

编辑:第二个想法,确保价值满足条件可能不像我想象的那样微不足道

答案 3 :(得分:0)

之前以稍微不同的方式询问了这个问题:What data structure using O(n) storage with O(log n) query time should I use for Range Minimum Queries?

然而,为了快速回答,你所面临的问题是一个经过充分研究的问题 - 范围最小查询。段树是一种数据结构,可以解决O(N)空间和O(logN)时间要求的问题。您可以在here中查看更多详细信息,其中包含对结构和所涉及的复杂性的解释。

答案 4 :(得分:0)

尝试解释建议的数据结构:

对于每对数字,计算并保留较小数字的值。 对于每四个连续的数字,计算并保持四个中最小的一个的值。通过选择两对值中较小的一个来快速完成。 对于每八个连续的数字,计算并保持八个中最小的值。 等等。

假设我们想要x19到x65的最小值。

我们查看以下存储值:    最小的x32到x63。    最小的x24到x31。    最小的x20到x23。    X19。    最小的x64到x65。

然后我们挑选最小的这些。