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

Algorithm 设计一个在O(logn)时间内工作的数据结构,algorithm,data-structures,big-o,time-complexity,Algorithm,Data Structures,Big O,Time Complexity,我正在审核这个算法类的工作,我正在尝试做一些课堂上给出的练习题。这个问题把我难住了,我就是想不通。我的解决方案没有一个在O(logn)时间内出来。有人能帮我解决这个问题吗 问题: 假设给我们一个n值序列x1,x2,任意顺序的xn和 寻求快速回答重复询问的形式:给定任意一对i和j 1.≤ i

我正在审核这个算法类的工作,我正在尝试做一些课堂上给出的练习题。这个问题把我难住了,我就是想不通。我的解决方案没有一个在O(logn)时间内出来。有人能帮我解决这个问题吗

问题: 假设给我们一个n值序列x1,x2,任意顺序的xn和 寻求快速回答重复询问的形式:给定任意一对i和j
1.≤ i我认为关键的一步是您需要先对数据进行排序。然后可以将数据存储在数组/列表中。然后,你可以在O(Logn)中快速地进行二进制搜索,找出满足条件的第一个值(我假设你在席和XJ之间,而不是X1和XJ)。
编辑:再想一想,确保值满足条件可能不像我想的那么简单

人们对这一点想得太多了。假设您从以下列表开始:

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

我将这些列表的结构、正确用法以及它们为读者提供原始问题答案的证明留作练习。(这对你来说可能不是家庭作业,但对某人来说很容易,我不喜欢对家庭作业问题给出完整的答案。)

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

递归地构造树的其余部分

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

  • 确定i,j的最低共同祖先。顺其自然
  • 从i开始,一直移动直到你碰到k。在每次迭代中,检查子节点是否为左节点。如果是,则比较右侧子树的最小值,并相应地更新当前最小值
  • 类似地,对于j,检查它是否是正确的节点
  • 在节点k处,比较每个子树返回的值并返回最小值

  • 这个问题以前是以一种稍微不同的方式提出的:


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

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

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

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

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


    然后我们从中挑选最小的

    到目前为止,你的思维过程是什么?提示:数据结构很可能是某种二叉树。巴特,我只是坐在课堂上。在过去,我听说它被称为审计,这就是我特别使用这个词的原因。这很公平,但不管你参与的是什么:我很确定,如果你展示你迄今为止所做的事情(或解释你自己的想法),你会发现人们更愿意帮助你。“奥迪尔”只是指“倾听”,如果你碰巧在礼堂,这是你审计的理由。:)你怎么用二进制搜索呢?我想老师也会说席和XJ。我逐字抄写了这篇文章。这会更有意义,不是吗?:)如果数据已经排序,可以通过调整索引对其执行二进制搜索。IE:设置左=0,右=阵列长度,中=楼层(左右平均值)。然后,如果xO(n)空间(根据需要)?@ypercube是的。看起来ElKamina已经选择提供我故意遗漏的所有细节,作为这个解决方案的一个微小变化。啊,好吧,我想不出你是在建议。与列表或垂直列表相比,这更像一个树结构,这一点并不明显。@ypercube无论您将其视为一个树、列表、垂直列表,还是将其连接到单个数组中,都是个人的选择。它们都有效。任何不懂这个答案的人都可以看看我的答案,反之亦然。它们并不完全相同,但非常相似。我给出了图片并省略了细节,而这给出了细节并省略了图片。@b我想这个答案所说的是一个片段树。段树占用O(nlogn)空间,而不是O(logn)@Jack有两种不同的数据结构称为段树。这里描述的一个匹配wcipeg.com描述的一个,它使用O(n)空间。它可以用来有效地找到任何区间的最小值。维基百科描述的结构是为了不同的目的,即识别区间集合的哪个子集包含给定的点。这就是为什么我更关心事物是什么而不是它们的名称。因为不同的人把同一事物称为不同的事物,不同的事物称为同一事物。我认为分段树有O(nlogn)空间