Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在一维数组中寻找局部极大值_Javascript_Arrays_Math - Fatal编程技术网

Javascript 在一维数组中寻找局部极大值

Javascript 在一维数组中寻找局部极大值,javascript,arrays,math,Javascript,Arrays,Math,有没有一种简单的方法可以找到一维数组中的局部极大值 假设我有一个数组: [ 0, 1, 10, <- max 8, <- (ignore) 3, 0, 0, 4, 6, <- (ignore) 10, <- max 6, <- (ignore) 1, 0, 0, 1, 4, <- max 1, 0 ] [0, 1. 10,maxes=[] 对于(变量i=1;i值[i+1]) 指数推送

有没有一种简单的方法可以找到一维数组中的局部极大值

假设我有一个数组:

[ 0,
  1,
  10, <- max
  8,  <- (ignore)
  3,
  0,
  0,
  4,
  6,  <- (ignore)
  10, <- max
  6,  <- (ignore)
  1,
  0,
  0,
  1,
  4,  <- max
  1,
  0 ]
[0,
1.
10,
maxes=[]
对于(变量i=1;ia[i+1])
最大推力(a[i])
} 

简单的迭代怎么样

var indexes = [];
var values = [0,1,10,8,3,0,0,4,6,10,6,1,0,0,1,4,1,0];
for (var i=1; i<values.length-1; i++)
    if (values[i] > values[i-1] && values[i] > values[i+1])
        indexes.push(i);
var索引=[];
var值=[0,1,10,8,3,0,0,4,6,10,6,1,0,0,1,4,1,0];
对于(变量i=1;i值[i-1]&&value[i]>值[i+1])
指数推送(i);

此代码查找局部极值(最小值和最大值,其中一阶导数为0,和),即使下列元素的值相等(非唯一极值-即“3”从1,1,1,3,3,2,2中选择)

var GoAsc=false;//向上移动
var GoDesc=false;//向下移动
var myInputArray=[];
var myExtremalsArray=[];
var firstDiff;
对于(索引=0;索引<(myArray.length-1);索引++){
//(myArray.length-1)是因为不超过数组边界,
//最后一个数组元素没有任何跟随器来测试它
firstDiff=(myArray[index]-myArray[index+1]);
如果(firstDiff>0){GoAsc=true;}
如果(firstDiff<0){GoDesc=true;}
如果(GoAsc==true&&GoDesc==true){
push(myArray[index]);
GoAsc=假;
GoDesc=假;
//如果firstDiff>0-->最大值
//如果firstDiff<0--->min
}
}

更具声明性的方法:

常量值=[3,2,3,6,4,1,2,3,2,1,2,3]; 常量findPeaks=arr=>arr.filter((el,索引)=>{ 返回el>arr[index-1]&el>arr[index+1] });
console.log(findPeaks(values));//=>[6,3]
这将返回给定整数数组中所有峰值(局部最大值)的数组,同时考虑高原:

function findPeaks(arr) {
  var peak;
  return arr.reduce(function(peaks, val, i) {
    if (arr[i+1] > arr[i]) {
      peak = arr[i+1];
    } else if ((arr[i+1] < arr[i]) && (typeof peak === 'number')) {
      peaks.push(peak);
      peak = undefined;
    }
    return peaks;
  }, []);
}

findPeaks([1,3,2,5,3])   // -> [3, 5]
findPeaks([1,3,3,3,2])   // -> [3]
findPeaks([-1,0,0,-1,3]) // -> [0]
findPeaks([5,3,3,3,4])   // -> []
函数findPeaks(arr){
var峰值;
返回arr.reduce(函数(峰值、值、i){
如果(arr[i+1]>arr[i]){
峰值=arr[i+1];
}否则如果((arr[i+1][3,5]
FindPeak([1,3,3,2])/->[3]
FindPeak([-1,0,0,-1,3])/->[0]
FindPeak([5,3,3,4])/->[]

请注意,数组的第一个和最后一个元素不被视为峰值,因为在数学函数的上下文中,我们不知道它们之前或之后是什么,因此无法判断它们是否为峰值。

这两种情况是当您有一个峰值时,它是一个大于上一个值、大于下一个值的值,并且平台,该值大于上一个值并等于下一个值,直到找到下一个必须小于的不同值

因此,当发现平台时,从该位置临时创建一个数组,直到结束,然后查找下一个不同的值(该方法返回与条件匹配的第一个值),并确保它小于第一个平台值

此特定函数将返回第一个平台值的索引

功能峰值(arr){
返回arr.reduce((res、val、i、self)=>{
如果(
//值大于上一个值且大于下一个值时的峰值
val>self[i-1]&val>self[i+1]
|| 
//当该值大于上一个值并等于下一个值,并且从该值开始下一个不同值较小时,出现平台
val>self[i-1]&&val==self[i+1]&&self.slice(i).find(item=>item!==val)log(pickPeaks([1,2,2,1])/{pos:[1],peaks:[2]}(plateau!)
一个Python实现,有几点

  • 避免使用reduce使算法更易于查看
  • 第一项和最后一项被视为峰值(这可能是一项要求,例如在面试中)
  • 平台中的所有值都将被添加
  • 可以在高原上开始或结束
def findPeaks(点:List[int])->List[int]:
峰值,峰值=[],[]
如果点[0]>=点[1]:#首先处理
peak.append(点[0])
对于范围(1,len(点))内的i:
prv=点[i-1]
cur=点[i]
如果cur>prv:#开始峰值
峰值=[cur]
elif cur==prv:#现有峰值(高原)
峰值追加(cur)
elif cur
您想要值或它们的索引?相当简单和整洁的解决方案。但是,如果您的最大值是一个平台(例如3,4,5,6,6,6,3,2),这将不起作用。它还会忽略第一个和最后一个元素。仅使用索引
i
推送
i
[1…n-2]中的元素
n
是输入数组的长度。例如,a=[3,2,1,2,3]将生成空数组作为输出。这种方法在实践中存在相当多的问题。因为min/max的定义可以在不同的时间窗口中定义,而此代码段仅将此窗口的大小设置为1。
findPeaks([-1,0,-1])
返回
[]
而不是
[0]
查找峰值([1,2,NaN,3,1])
返回
[2]
而不是
[]
@le_m我已经更新了我的
var GoAsc  = false;      //ascending move
var GoDesc = false;      //descending move
var myInputArray = [];
var myExtremalsArray = [];
var firstDiff;

for (index = 0; index < (myArray.length - 1); index++) {
    //(myArray.length - 1) is because not to exceed array boundary, 
    //last array element does not have any follower to test it

  firstDiff = ( myArray[index] - myArray[index + 1] );

   if ( firstDiff > 0 )   { GoAsc  = true;  }
   if ( firstDiff < 0 )   { GoDesc = true;  }

   if ( GoAsc === true && GoDesc === true )  {  
        myExtremalsArray.push(myArray[index]);
        GoAsc  = false ;     
        GoDesc = false;     
        //if firstDiff > 0 ---> max
        //if firstDiff < 0 ---> min
      }

 }
function findPeaks(arr) {
  var peak;
  return arr.reduce(function(peaks, val, i) {
    if (arr[i+1] > arr[i]) {
      peak = arr[i+1];
    } else if ((arr[i+1] < arr[i]) && (typeof peak === 'number')) {
      peaks.push(peak);
      peak = undefined;
    }
    return peaks;
  }, []);
}

findPeaks([1,3,2,5,3])   // -> [3, 5]
findPeaks([1,3,3,3,2])   // -> [3]
findPeaks([-1,0,0,-1,3]) // -> [0]
findPeaks([5,3,3,3,4])   // -> []