Algorithm 查找增加或减少1的数组的所有局部最大值

Algorithm 查找增加或减少1的数组的所有局部最大值,algorithm,Algorithm,如何找到以O(k logn)次运行的算法,其中k是局部最大值的数目,n是数组的大小 例如: [1,2,3,4,5,6,5,6,7,8,7] 作为一个粗略的想法,您可以使用最大值的数量(这显然是已知的)作为一个附加参数。如果是局部最大值,则检查数组的中间值(如果元素数为偶数,则检查中间值的左侧或右侧)。如果不是局部最大值,则在左侧或右侧子阵列中搜索局部最大值。类C伪码中的公式如下:;如果需要最大值的位置,则必须另外进行一些指数计算 List<int> Input;

如何找到以
O(k logn)
次运行的算法,其中k是局部最大值的数目,n是数组的大小 例如:

[1,2,3,4,5,6,5,6,7,8,7]

作为一个粗略的想法,您可以使用最大值的数量(这显然是已知的)作为一个附加参数。如果是局部最大值,则检查数组的中间值(如果元素数为偶数,则检查中间值的左侧或右侧)。如果不是局部最大值,则在左侧或右侧子阵列中搜索局部最大值。类C伪码中的公式如下:;如果需要最大值的位置,则必须另外进行一些指数计算

List<int> Input;           // input array
List<int> Maxima;          // output for the maxima
int k;                     // num of local maxima

void SearchMaxima(List<int> iList, int NumOfMaxima)
{
   if (0 == iList.Count() || 0 == NumOfMaxima)
   {
     // do nothing
   }
   else
   {
      if (Middle point of iList is local Maximum)
      {
          Store middle point of iList to MaximaPositions
          SearchMaxima(left half of iList w/o middle point, NumOfMaxima - 1);
          SearchMaxima(right half of iList w/o middle point, NumOfMaxima - 1);
      }
      else
      {
          SearchMaxima(left half of iList w/o middle point, NumOfMaxima);
          SearchMaxima(right half of iList w/o middle point, NumOfMaxima);
      }
   }
}
列表输入;//输入阵列
列出最大值;//最大输出
int k;//局部极大值的个数
void SearchMaxima(列表iList,int NumOfMaxima)
{
如果(0==iList.Count()| | 0==numfmaxima)
{
//无所事事
}
其他的
{
if(iList的中点为局部最大值)
{
将iList的中点存储到最大位置
SearchMaxima(iList的左半部分,没有中间点,NumOfMaxima-1);
SearchMaxima(iList的右半部分,没有中间点,NumOfMaxima-1);
}
其他的
{
SearchMaxima(iList的左半部分,没有中间点,NumOfMaxima);
SearchMaxima(iList的右半部分,没有中间点,NumOfMaxima);
}
}
}

o(k log n)的复杂性是从哪里产生的?可能与此相关: