我有log n
行,每行包含n
个数字。
我希望找到所有行中每个位置的最小值:
[1, 2, 3, 4, 5, 6, 7, 8]
[2, 3, 4, 1, 2, 3, 4, 5]
[3, 6, 7, 8, 3, 4, 1, 2]
[9, 7, 2, 3, 2, 1, 3, 1]
应该会产生如下所示的数组:
[1, 2, 2, 1, 2, 1, 1, 1]
我很容易在O(nlogn)
时间
我甚至可以看到一个分而治之的解决方案,它将行分成两半并在每一侧递归运行算法,这需要花费O(nloglogn)
时间。
但是我找不到删除n
的方法。我看到它的方式,我需要至少在一行中查看每个位置至少一次。
有没有办法让复杂性更小?
答案 0 :(得分:3)
如果X大小的数组没有以某种已知的特殊方式排序或结构化,那么在其中查找元素y
的成本必须等于X,因为你不能跳过X中的任何元素(跳过的元素)可以是解决方案)。
搜索顺序也无关紧要。如果你拆分它并分而治之等,那么元素y
仍然是你访问的最后一个元素。
因此,如果您有一个大小为n*logn
的数组,则可能的最低复杂度为Omega(n* log n)
。