当前位置: 首页 > 知识库问答 >
问题:

该算法的渐近时间复杂度是O(log n)?

司徒经纶
2023-03-14

查找p的伪码算法为:

peakreturn(H)
for p=1 to m //m is the length of H
    if H[p-1] ≤ H[p] and H[p] ≥ H[p+1] then return p
return nil // only returns this if there is no peak

假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果:

H[p] ≥ H[p+1] if p = 1,
H[p-1] ≤ A[p] ≥ H[p+1] if 1 < p < m,
H[p] ≥ H[p-1] if p = m.

基本上,如果H【p】大于或等于其相邻元素,则H【p】为峰值。

假设数组H在开始和结束时都大于1个元素,数组为H[0到m 1],其中H[0]=H[m 1]=无穷大。因此,H[0]和H[m 1]是哨兵。然后是元素p,其中1≤ p≤ n、 是一个峰值,如果H【p-1】≤ H【p】≥ H【p 1】。

我认为渐近时间复杂度是O(log n),但我不确定。如果可以的话,请帮忙,非常感谢。

共有1个答案

融建树
2023-03-14

不,不是O(log m)。例如,如果H正在增加,那么循环执行m次,因为唯一的峰值是最后一个元素。所以最坏的情况是O(m)。

O(log m)的解决方案如下所示:要在数组中找到末端元素小于其邻居的峰值,请考虑数组的中间元素。如果它是峰值,则停止。否则,如果它小于其左侧的元素,请在数组的左半部中找到一个峰值。如果它小于其右侧的元素,请在数组的右半部中找到一个峰值。它必须小于一个或另一个,因为它不是峰值。这几乎每次都将数组的大小减半,并且保证终止,因为一旦数组达到大小3,中间元素就保证是峰值,因为结束元素(通过构造)小于它们的邻居——中间元素。

 类似资料:
  • 问题内容: 这是第 5章破解编码面试中的问题9.4 问题: 编写一种方法以返回集合的所有子集。 这是我用Java编写的解决方案(经过测试,它可以正常工作!!!) 我看了这个问题的解决方案,作者说该算法的解决方案以 _O(2 n)_时间复杂度和 _O(2 n)_空间复杂度运行。我同意她的观点,该算法运行时间为 _O(2 n),_因为要解决此问题,您必须考虑以下事实:对于任何元素,您都有两种可能性,它

  • 就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市? 我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?

  • 做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。

  • 问题内容: 我对未索引数据集上的GroupBy操作的渐近复杂度(大O)感兴趣。最著名的算法的复杂性是什么,SQL Server和LINQ使用的算法的复杂性是什么? 问题答案: 可以对已排序的行(n log(n)复杂度) 进行一次遍历(n复杂度)分组,因此分组的 复杂度为n log(n),其中n是行数。如果group by语句中使用的每个列都有索引,则不需要排序,并且复杂度为n。

  • 注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)