假设我有一个数组,大小为40.我想要的元素位于第38位。 有一个简单的循环,它将需要38步? 但是,有2个循环,并行运行,变量,“找到” 设置为false,并在找到元素时更改为true。
第一个循环,将从索引0开始 第二个循环将从索引40开始。
所以基本上只需4步就可以了吗?找到元素。最糟糕的情况是元素是否在数组的中间。正确?
答案 0 :(得分:2)
这取决于在两个线程之间同步状态所需的工作量。
如果需要0工作,那么这将比直通算法快50%。
另一方面,如果它需要比X更多的工作,它将开始变慢(这很可能是这种情况)。
从算法的角度来看,我认为这不是你想要的。即使是2个线程仍然是O(n)运行时。您可能希望对数据进行排序(n log n),然后执行二进制搜索以获取数据。特别是你可以对它进行一次排序并将其用于许多搜索......
答案 1 :(得分:2)
如果你在谈论算法的复杂性,这仍然是一个线性搜索。仅仅因为你在每次迭代中搜索两个元素并没有改变算法是O(n)的事实。
就您将看到的实际性能而言,此算法可能比使用单个处理器的线性搜索慢。由于搜索中每个元素的工作量非常少,因此算法将受内存限制,因此使用多个处理器没有任何好处。此外,由于您在两个位置进行搜索,因此该算法不会像缓存一样高效。然后,正如bwawok指出的那样,在同步中会有很多时间丢失。
答案 2 :(得分:0)
当您并行运行时,您将CPU功率分成两个+创建一些开销。如果你的意思是你正在运行搜索,多核机器,使用你提出的算法,那么更糟糕的情况是20步。你没有在复杂性类中做任何改变。那么你提到的那4个步骤来自哪里?
答案 3 :(得分:0)
平均而言在运行时没有什么不同。
例如,如果您正在搜索10中的项目。
原始算法将按以下搜索顺序处理:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
最糟糕的情况是最后一项(采取10个步骤)。
第二种算法将按以下搜索顺序处理:
1, 3, 5, 7, 9, 10, 8, 6, 4, 2
在这种情况下最糟糕的情况是第6项(采取10个步骤)。
在某些情况下,算法1更快 在某些情况下,算法2更快。
两者同时花费平均 - O(n)。
在旁注中,将它与二进制搜索顺序(在排序数组上)进行比较是很有趣的。
4, 3, 2, 3, 1, 4, 3, 2, 4, 3
最多需要4个步骤才能完成。