Algorithm 设计一个在O(logn)时间内工作的数据结构
我正在审核这个算法类的工作,我正在尝试做一些课堂上给出的练习题。这个问题把我难住了,我就是想不通。我的解决方案没有一个在O(logn)时间内出来。有人能帮我解决这个问题吗 问题: 假设给我们一个n值序列x1,x2,任意顺序的xn和 寻求快速回答重复询问的形式:给定任意一对i和jAlgorithm 设计一个在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
1.≤ i
编辑:再想一想,确保值满足条件可能不像我想的那么简单人们对这一点想得太多了。假设您从以下列表开始:
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之间的最小值:
这个问题以前是以一种稍微不同的方式提出的:
然而,要快速回答,您面临的问题是一个经过充分研究的单范围最小查询。段树是一种数据结构,可以解决O(N)空间和O(logN)时间要求的问题。您可以在中看到更多详细信息,其中对结构和涉及的复杂性进行了解释。尝试解释建议的数据结构: 对于每对数字,计算并保留较小数字的值。 对于每四个连续的数字,计算并保留其中最小的值。通过选择两对值中较小的一个,可以快速完成此操作。 对于每八个连续数字,计算并保留八个数字中最小的数值。 等等 假设我们想要最小的值x19到x65 我们查看以下存储值: x32到x63中最小的。 x24到x31中最小的。 x20到x23中最小的。 x19。 x64到x65中最小的
然后我们从中挑选最小的 到目前为止,你的思维过程是什么?提示:数据结构很可能是某种二叉树。巴特,我只是坐在课堂上。在过去,我听说它被称为审计,这就是我特别使用这个词的原因。这很公平,但不管你参与的是什么:我很确定,如果你展示你迄今为止所做的事情(或解释你自己的想法),你会发现人们更愿意帮助你。“奥迪尔”只是指“倾听”,如果你碰巧在礼堂,这是你审计的理由。:)你怎么用二进制搜索呢?我想老师也会说席和XJ。我逐字抄写了这篇文章。这会更有意义,不是吗?:)如果数据已经排序,可以通过调整索引对其执行二进制搜索。IE:设置左=0,右=阵列长度,中=楼层(左右平均值)。然后,如果x
O(n)
空间(根据需要)?@ypercube是的。看起来ElKamina已经选择提供我故意遗漏的所有细节,作为这个解决方案的一个微小变化。啊,好吧,我想不出你是在建议。与列表或垂直列表相比,这更像一个树结构,这一点并不明显。@ypercube无论您将其视为一个树、列表、垂直列表,还是将其连接到单个数组中,都是个人的选择。它们都有效。任何不懂这个答案的人都可以看看我的答案,反之亦然。它们并不完全相同,但非常相似。我给出了图片并省略了细节,而这给出了细节并省略了图片。@b我想这个答案所说的是一个片段树。段树占用O(nlogn)空间,而不是O(logn)@Jack有两种不同的数据结构称为段树。这里描述的一个匹配wcipeg.com描述的一个,它使用O(n)空间。它可以用来有效地找到任何区间的最小值。维基百科描述的结构是为了不同的目的,即识别区间集合的哪个子集包含给定的点。这就是为什么我更关心事物是什么而不是它们的名称。因为不同的人把同一事物称为不同的事物,不同的事物称为同一事物。我认为分段树有O(nlogn)空间