我正在审核这个算法类的工作,我正在尝试做一些在课堂上给出的练习题。这个问题让我感到困惑,我无法绕过它。我的解决方案都没有在O(logn)时间内出现。任何人都可以帮我解决这个问题吗?
问题: 假设我们以任意顺序给出n个值x1,x2,...,xn的序列 寻求快速回答表格的重复查询:给出任意一对i和j 1≤i<1。 j≤n,找到x1,...,xj中的最小值。设计一个使用O(n)空间的数据结构,并在O(log n)时间内回答每个查询。
答案 0 :(得分:3)
对于a1,a2,a3,... an的输入,构造一个节点,其中包含(a1,..,ak)的最小值和(ak + 1,..,an)的最小值,其中k = n / 2。
递归构造树的其余部分。
现在,如果你想找到ai和aj之间的最小值:
答案 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。
然后我们挑选最小的这些。