【发布时间】:2012-09-08 14:46:59
【问题描述】:
是否存在一种算法可以在 O(log n) 时间内找到未排序数组的最大值?
【问题讨论】:
-
@elyashiv 这叫做并行归约。每个核心/处理器都从少量元素的最大值开始,然后进行二叉树缩减。
-
@amit 因此是“非常多的内核/处理器”。即如
k > n. -
@amit 使用你的公式,当 n == k 时会发生什么? n/n + log(n) = 1 + log(n) = log(n)。所以,如果你有 n 个核心(实际上 n/2 个核心就足够了),你可以获得 O( log(n) )。尽管您可能需要添加一个术语来表示并行化开销(处理器之间的通信延迟)。
-
@Xantix, @Mystical:这是一个特殊情况,核心数与元素数线性。传统上,在并行分析中,我们有以下两种选择之一:(1) 将
k视为某个常数,因此忽略它。 (2) 明确使用k表示法。我从未见过任何书/文章分析算法假设某些功能k = f(n)的核心数量f(当然,除了常数)。如果有人这样做 - 请参考我这个来源,我会回复我的评论。 -
@Mystical,我认为线程分配复杂度仍然是
O(n),所以你最终得到O(n log n)。布伦特定理可能有助于此处的一些算法级联(证明很重要),但也许我误解了这个概念。请参阅uni-graz.at/~haasegu/Lectures/GPU_CUDA/Lit/reduction.pdf 第 30 张幻灯片。