求解波值的波峰和波谷「Javascript」
精选
原创
©著作权归作者所有:来自51CTO博客作者Jimmy_Pang的原创作品,请联系作者获取转载授权,否则将追究法律责任
So,这篇文章,我们来谈谈,在一系列的电波数据中,我们应该怎么求解这一系列的数据的波峰和波谷呢?
Now,我们有一系列的数据 [150, 230, 224, 218, 135, 147, 260]
来举例:
在这 7
个数据中,波峰是 230
和 260
,波谷是 150
和 135
。
PS:本文中知识点会应用到我的下一篇文章中
👌 Ok,那么我们应该如何通过代码来查找这些波峰和波谷呢?
思路
我们可以考虑如下的实现方式:
- 逐个遍历整个数组
- 设定数据是波峰记录为
1
,数据是波谷记录为-1
,也就是direction
为1 | -1
- (后一个数据 - 当前数据)* direction 是大于零的时候,对波峰波谷进行判断并累计统计
- 对数组第一个数据
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
进行预览:
参考