【问题标题】:Find the index of an element in a fixed amount of time O(1)在固定时间 O(1) 内找到元素的索引
【发布时间】:2017-04-15 17:51:47
【问题描述】:

我试图解决这个问题一个小时,但找不到任何方法。 问题如下:

排序列表,长度N。列表中可能有重复项。 给定一个元素x,你需要在列表中找到x的最新索引。 如果x 不存在,则返回相关消息。

注意:模型是CREW(Concurrent Read Exclusive Write)——表示允许并发读,但是write is Exclusive表示不允许并发写。

1) 描述一个使用 N 个 CPU 并在固定时间内解决问题的并行算法(我猜它们的意思是 O(1))。

2) 解释为什么描述的算法是正确的。

【问题讨论】:

  • 我不认为这是可能的,因为与访问第 i 个元素的数组不同,对于列表来说访问第 i 个元素是 O(1),它是 O(n)。
  • 如果你有一个数组,那么每个进程都会从数组中读取其对应的值,如果它是 x,那么如果你的 id 高于当前值(compareAndSet),则更新一个原子变量。您可以将该值初始化为 -1,这样您就可以知道在所有进程完成后是否找到了 x。
  • 但我不知道这是否是一个解决方案,因为如果列表中的每个值都是 x 那么你有 n 个进程在等待彼​​此更新原子变量,所以我仍然会调用它 O(n)。
  • @maraca,忘了提到模型是 CREW(并发读取 - 独占写入),所以我无法更新原子变量。
  • 更新原子变量是同步操作,没有并发写入

标签: algorithm parallel-processing


【解决方案1】:

我假设输入是一个 0 索引、排序(递增)数组 A[],长度为 N

用值UNSET初始化一个共享结果变量:

RESULT := "UNSET"

使用以下程序启动N CPU,由i 参数化(从0N-1):

CPU(i):
if i==0 and A[0] > x {
    RESULT = "NO SOLUTION"
} else if A[i] == x and (i + 1 == N or A[i+1] > x) {
    RESULT = i
} else if A[i] < x and (i + 1 == N or A[i+1] > x) {
    RESULT = "NO SOLUTION"
}

RESULT 更新时程序已终止。

请注意,只有一个 CPU 写入 RESULT(因为输入已排序),因此永远不会有并发写入,但除第一个之外的每个数组位置都由两个 CPU 读取。每个 CPU 做固定的工作量,所以程序在固定的时间内终止。

【讨论】:

  • 请注意,尽管列出了数组,但数组中可能存在重复,因此此解决方案仍然无法解决并发写入问题,因为可能有 2 个 CPU 写入 RESULT。
  • @SKriheli:不是很明显,你能举个反例吗?由于额外的A[i+1] &gt; x 条件,此处仅报告下一个值的交叉点处的 CPU,实例跨越相等的值保持沉默。至少我认为是这样的。
猜你喜欢
  • 2018-10-07
  • 2012-10-24
  • 2011-10-12
  • 2016-10-04
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多