0

我正在研究二叉树!我的作业有问题。我不得不用二叉树来解决这个问题,这里的问题是:给你一个整数列表。然后您需要回答以下形式的若干问题:“A 索引和 B 索引之间的列表内容元素的最大值是多少?”。例子 :

INPUT :
10
2 4 3 5 7 19 3 8 6 7
4
1 5
3 6
8 10
3 9
OUTPUT:
7
19
8
19

时间限制和内存(语言:C++)

时间:在 1GHz 机器上为 0.5 秒。内存:16000 KB

约束

1 <= N <= 100000,其中 N 是列表中的元素数。

1 <= A, B <= N,其中 A, B 是范围的限制。

1 <= I <= 10 000,其中 I 是区间数。

请不要给我一个提示的解决方案!非常感谢 !

4

3 回答 3

2

正如评论中已经讨论的那样,为简单起见,您可以向数组添加条目以使其大小为 2 的幂,因此二叉树对于所有叶子具有相同的深度。添加到此列表中的元素并不重要,因为您不会在实际算法中使用这些计算值。

在二叉树中,您必须以自下而上的方式计算最大值。然后这些值会告诉您这些节点所代表的整个范围的最大值;这是树的主要思想。

剩下的就是将查询拆分成这样的树节点,因此它们使用比间隔大小更少的节点来表示原始间隔。找出树节点所代表的区间的“模式”。然后想办法将输入区间拆分为尽可能少的节点。也许从简单的解决方案开始:只需将输入拆分为离开节点,即单个元素。然后弄清楚如何使用树中的内部节点“组合”区间中的多个元素。通过不使用树来为您找到一个算法(因为这需要元素数量的线性时间,但树的整个想法是使其成为对数)。

于 2013-05-20T11:17:35.440 回答
0

编写一些间隔大小为 0 的代码。这将非常简单。

然后写一些大小为1的间隔。它仍然很简单。

然后写一些大小为2的区间。可能需要比较。它仍然很简单。

然后为大小为 3 的区间写一些。它可能涉及选择要比较的大小为 2 的区间。这不是太难。

完成此操作后,应该很容易使其适用于任何间隔大小。

于 2013-05-20T10:50:10.747 回答
0

数组将是解决此问题的最佳数据结构。

但是鉴于您需要使用二叉树,我会将 (index, value) 存储在二叉树中并在索引上存储键。

于 2013-05-20T11:29:47.077 回答