Algorithm 优于O(log(N))基2

Algorithm 优于O(log(N))基2,algorithm,language-agnostic,time-complexity,segment-tree,Algorithm,Language Agnostic,Time Complexity,Segment Tree,我正在解决段树和四叉树相关的问题;我注意到在段树中,我们将1D数组分割成2(2^1)段,并递归地执行此操作,直到基本情况出现。类似地,在四叉树中,我们在每个步骤中将二维网格细分为4(2^2)段。所有这些分治机制都是为了实现对数时间复杂度。无意冒犯 但是为什么我们不将数组细分为4(4^1)部分或更多部分,而不是分段树中的2部分呢?为什么我们不把网格分成16(4^2)部分而不是4部分?通过这样做,我们可以实现O(log(N))性能,但这将是一个更好的log,因为log(N)(base 4)比log(

我正在解决段树和四叉树相关的问题;我注意到在段树中,我们将1D数组分割成2(2^1)段,并递归地执行此操作,直到基本情况出现。类似地,在四叉树中,我们在每个步骤中将二维网格细分为4(2^2)段。所有这些分治机制都是为了实现对数时间复杂度。无意冒犯

但是为什么我们不将数组细分为4(4^1)部分或更多部分,而不是分段树中的2部分呢?为什么我们不把网格分成16(4^2)部分而不是4部分?通过这样做,我们可以实现
O(log(N))
性能,但这将是一个更好的
log
,因为
log(N)
(base 4)比
log(N)
(base 2)更好

我知道在这种情况下,实施会有点困难。是否存在内存开销问题?还是别的什么

如果我哪里做错了,请纠正我。谢谢

log4(N)=log2(N)/log2(4)=log2(N)/2


一般来说,时间复杂度都是O(logn),而四段比两段更难维护。事实上,(在acm/icpc中)两个段很容易编码,而且工作效率很高。

它实际上不会工作得更快。假设我们把它分成4部分。然后,我们必须在每个节点中合并4个值,而不是2个值来回答查询。假设合并4个值需要3倍长的时间(例如,为了获得最多2个数字,我们需要对max函数进行1次调用,但是为了获得最多4个值,需要3次调用),我们有log4(n)*3>log2(n)*1。此外,这将更难实现(需要考虑更多的情况等等)。

更改所用对数的基数不会改变计算复杂性。想想你是如何改变对数的底的。您使用的乘法器是
1/log\u newbase(old\u base)
,本质上与表达式中的常量乘法器相同,例如
O(k*n^2)
。计算复杂性忽略了这些因素,尽管程序员通常被建议认真关注它们。从
log2
log4
将步骤数减半,但每一步的工作量通常是
log2(4)=2
倍,因此没有净收益。如果一个步骤内的工作远低于一个步骤的成本,那么这确实是一个净收益。由于这个原因,像B-树这样的数据结构使用了高分支因子;这是理论上的。试试看,它基本上也是的复制品。请参阅。我想你可以用并行处理做一些类似的事情,用P处理器提供O(log_P(N))性能,这可能也适用于。尽管如前所述,如果使用单个处理器,通常会在一个区域加速,而在另一个区域则会减慢速度。