给定一个值数组,如何构建一个数据结构,让您快速找到任何连续子数组的最大值?理想情况下,构建此结构的开销应该很小,并且结构应该允许单个元素的有效附加和变异。
示例数组是use
。请求可能是从索引2到7(子数组[6, 2, 3, 7, 4, 5, 1, 0, 3]
)找到切片的最大值,这将导致[3, 7, 5, 1, 0]
。
答案 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,对于搜索来说也会非常快,并且最小化附加的开销和空间开销的恒定因子。
最终的恒定时间方法似乎是一种实用性很低的学术成果。