这是关于1D峰值发现的问题(如果元素大于数组中的邻居,则元素是峰值)。我正在观看麻省理工学院的开放式课程讲座,他谈到了从索引0开始到最后的天真解决方案。
然后他说分而治之的解决方案要好得多。我不明白这是怎么回事。这不是根据数组的内容做出假设吗?如果它只是随机数,那它会有什么不同?
讲师说他写了一个Python脚本,天真的解决方案需要13秒,而log(N)解决方案只用了0.001秒。我写了一些C#代码,朴素算法在前20个左右的元素中找到一个峰值并运行一毫秒。我在这里错过了什么吗?
答案 0 :(得分:2)
具有高峰的事情是,在左半部分的中间或者在右半部分中都存在一个峰值。
想象一下,您发现中间元素为5
,其左侧为6
。然后是6
峰值?不,如果6
的左侧元素更大,请说7
。然后是7
峰值?不,如果7
的左侧元素更大,请说8
。您可以继续此过程,直到找到峰值或到达最左边的元素。在后一种情况下,您会得到一个递增的序列号,因此最左边的元素是一个峰值。
因此,如果您发现中间元素小于左邻居,那么您当然知道在左半边寻找一个峰值。如果在右半部分有另一个峰值,你不在乎,无论数字的分布是随机的。如果中间元素小于它的右邻居,则同样成立。
让我们再举一个例子:假设你在路中间。你向左看,你看到更高的一点。然后你知道可能发生的两件事之一。要么你总是向左走,找到越来越高的点,否则你会找到一个高峰。但你永远不能离开。如果你到达路的尽头那么这必定是一个高峰。所以在你右边发生的事情并不重要。如果你向左旅行,你有信心找到一个高峰。
至于您的实施的运行时间。如果天真算法在开头附近找到峰值,它将快速完成。从1
到1000000
的序列进行测试,然后峰值位于最后一个元素。
答案 1 :(得分:0)
划分征服更好,因为在最坏的情况下它具有O(log n)
时间复杂度。这个渐近上限不依赖于数组的内容。朴素算法具有O(n)
时间复杂度。它可以在大型阵列上产生巨大的差异。
关于您的基准的部分非常不清楚。你运行了什么样的测试?你是如何衡量执行时间的?天真算法的实现很快就会在一个特定阵列中找到一个峰值这一事实并不意味着它通常是有效的。
答案 2 :(得分:-2)
坦率地说,我不相信这个算法,除了教育目的。
通常当你寻找一个"峰值"时,你实际上想要一个全局最大值,除非你的数据已经被排序,否则只能在o(n)中获得。
如果用于处理来自真实传感器的输入,该算法将锁定随机噪声并且经常错过实际信号指示。
速度是一件好事,但如果它允许在忽略有用值的同时返回随机垃圾则不那么好。