在每列中找到最小值的最快方法
Fastest way to find minimum value in each column
我有 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
的方法。在我看来,我需要至少查看其中一行中的每个位置至少一次。
有没有办法让复杂度变小?
如果大小为 X 的数组未按某种已知的特殊方式排序或构造,则在其中查找元素 y
的成本必须等于 X,因为您不能跳过 X 中的任何元素(跳过一个可能是解决方案)。
搜索的顺序也没有关系。如果你拆分它并分而治之等,元素 y
仍然可以是你访问的最后一个。
因此,如果您有一个大小为 n*logn
的数组,可能的最低复杂度是 Omega(n* log n)
。
我有 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
的方法。在我看来,我需要至少查看其中一行中的每个位置至少一次。
有没有办法让复杂度变小?
如果大小为 X 的数组未按某种已知的特殊方式排序或构造,则在其中查找元素 y
的成本必须等于 X,因为您不能跳过 X 中的任何元素(跳过一个可能是解决方案)。
搜索的顺序也没有关系。如果你拆分它并分而治之等,元素 y
仍然可以是你访问的最后一个。
因此,如果您有一个大小为 n*logn
的数组,可能的最低复杂度是 Omega(n* log n)
。