我正在解决Segment树和Quad Tree相关的问题;虽然我注意到在分段树中我们将1D数组拆分为 2(2 ^ 1)段并递归执行此操作直到基本情况到达。类似地,在Quad树中,我们在每个步骤中将2D网格细分为 4(2 ^ 2)段。所有这些分而治之的机制都是为了实现对数时间复杂度。没有冒犯!
但为什么我们不将数组细分为 4(4 ^ 1)部分或更多部分而不是部分树中的2部分?为什么我们不将网格分成 16(4 ^ 2)部分而不是4?通过这样做,我们可以实现O(log(N))
性能,但它会更好log
,因为log(N)
(基数4)优于log(N)
(基数2)。
我知道在这种情况下,实施会有点困难。是否存在内存开销问题?还是什么?
如果我在任何地方都错了,请纠正我。谢谢!
答案 0 :(得分:1)
log 4(N)= log 2(N)/ log 2(4)= log 2(N)/ 2
一般来说,时间复杂度都是O(logn),而四个段要比维持两个段要困难得多。实际上,(在acm / icpc中)两个段很容易编码,而且工作起来很充分。
答案 1 :(得分:1)
它实际上不会更快。我们假设我们将它分为4个部分。然后我们必须在每个节点中合并4个值而不是2个来回答查询。假设合并4个值需要3倍(例如,要获得最多2个数字,我们需要1个调用max函数,但要获得最多4个值,需要3个调用),我们有log4(n)* 3 > log2(n)* 1.此外,它将更难实施(需要考虑更多案例等)。