So,这篇文章,我们来谈谈,在一系列的电波数据中,我们应该怎么求解这一系列的数据的波峰和波谷呢?

Now,我们有一系列的数据 ​​[150, 230, 224, 218, 135, 147, 260]​​ 来举例:

求解波值的波峰和波谷「Javascript」_数组

在这 ​​7​​​ 个数据中,波峰是 ​​230​​​ 和 ​​260​​​,波谷是 ​​150​​​ 和 ​​135​​。

PS:本文中知识点会应用到我的下一篇文章中

👌 Ok,那么我们应该如何通过代码来查找这些波峰和波谷呢?

思路

我们可以考虑如下的实现方式:

  1. 逐个遍历整个数组
  2. 设定数据是波峰记录为​​1​​​,数据是波谷记录为​​-1​​​,也就是​​direction​​​ 为​​1 | -1​
  3. (后一个数据 - 当前数据)* direction 是大于零的时候,对波峰波谷进行判断并累计统计
  4. 对数组第一个数据​​arr[0]​​​ 和数组最后一个数据​​arr[arr.length - 1]​​ 进行判断

实现

思路我们有了,那么,我们来进行代码实现,这里我采用了 ​​Javascript​​ 语言进行编写:

function getCrestAndTrough(arr) { // arr 是一维数组,且元素类型是数字
let crestCount = 0; // 波峰计数
let crestArr = []; // 波峰值
let troughCount = 0; // 波谷计数
let troughArr = []; // 波谷值
// 从右往左遍历
let j = arr.length, // 数组长度
i = j - 1,
last, // 上一个元素的值
current, // 当前元素的值
next, // 下一个元素的值
difference; // 下一个元素对当前元素的差值
let direction = arr[j] < 0 ? -1 : 1; // 假设是波峰的方向 1
while(arr[i]) {
next = arr[i - 1]; // 下一个元素
current = arr[i]; // 当前元素
difference = next - current; // 差值
if(difference * direction > 0) {
direction *= -1;
if(direction === 1) {
crestCount += 1; // 波峰
crestArr.push(current);
} else {
troughCount += 1; // 波谷
troughArr.push(current);
}
last = current;
} else if(i === j - 1 && current !== next) { // 如果开始时候是曲线向下走的趋势,则 direction = 1 成立,最右年的点是波峰点
crestCount += 1; // 波峰
crestArr.push(current);
}
// 最左侧点判断
if(next == undefined) {
if(last < current) {
crestCount += 1; // 波峰
crestArr.push(current);
}
if(last > current) {
troughCount += 1; // 波谷
troughArr.push(current);
}
// 如果两点相等,则什么都不用做
}
i--; // 跳出循环的关键点
}
console.log(`波峰 => ${ crestArr },波谷 => ${ troughArr }`)
}

上面👆的代码已经讲解得很详细,读者跟着代码一步步读下来,应该很容易理解。

下面👇我们来验证下时候正确。我们依旧是拿数据 ​​[150, 230, 224, 218, 135, 147, 260]​​ 来进行验证:

let array = [150, 230, 224, 218, 135, 147, 260];
getCrestAndTrough(array);
// 波峰 => 260,230,波谷 => 135,150

你也可以通过掘金平台的线上 ​​IDE​​ 进行预览:

参考