用于在优于O(log n)预期时间内找到子阵列的最大值的数据结构

时间:2016-10-19 21:28:13

标签: arrays data-structures language-agnostic time-complexity

给定一个值数组,如何构建一个数据结构,让您快速找到任何连续子数组的最大值?理想情况下,构建此结构的开销应该很小,并且结构应该允许单个元素的有效附加和变异。

示例数组是use。请求可能是从索引2到7(子数组[6, 2, 3, 7, 4, 5, 1, 0, 3])找到切片的最大值,这将导致[3, 7, 5, 1, 0]

1 个答案:

答案 0 :(得分:1)

我巧妙地发现了这个问题的术语:

范围最小查询

不出所料,这是一个经过充分研究的问题,尽管似乎很难找到。 Wikipedia gives some solutions与我的明显不同。

O(1)时间,O(n log n)空间解决方案尤其比我的类似空间解决方案更有效,因为它允许在O(log n)时间附加,这可能就足够了,而不是可怕{我引起了{1}}。

其他方法渐近得体,最终结果特别好。 O(n)时间O(log n)空间解决方案在技术上比我的最终结果弱,但O(n)从不大,并且由于其线性内存扫描,它在搜索上具有更好的常数因子。两种情况下的附加元素都是摊销log n,维基百科变体在充分谨慎的情况下做得更好。我希望将块大小设置为固定的,并且直接应用算法将是一个实际的胜利。在我的情况下,即使是过多的块大小,比如128,对于搜索来说也会非常快,并且最小化附加的开销和空间开销的恒定因子。

最终的恒定时间方法似乎是一种实用性很低的学术成果。