3 回答

TA貢獻1830條經驗 獲得超9個贊
這是一個查找樣本數組中所有峰值的函數:
const chart = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141]
const findPeaks = chart => chart.reduce((agg, current, i) => {
const prev = chart[i - 1];
const next = chart[i + 1];
return current > prev && current > next ? [...agg, current] : agg;
}, []);
const peaks = findPeaks(chart);
console.log('peaks', peaks);
這記錄: [1301, 1380, 2462, 2456, 1532, 2407, 2392, 1537, 2214, 1383]
這與您的問題的預期輸出不匹配,但它確實對“峰值是什么”給出了準確的答案。
在這種情況下,“峰值”被定義為任何前任和后繼都低于自身的數字。即 [1, 100, 1] 給出 100。 [1, 2, 3, 100, 3, 2, 100, 1] 給出 [100, 100]
更新
根據您的反饋,這里有一個函數,它需要一個峰的每邊距離為 2 。結果仍然與您的問題不同,但這符合新表達的標準:
const findPeaks = chart => chart.reduce((agg, current, i) => {
const twoBack = chart[i - 2];
const prev = chart[i - 1];
const next = chart[i + 1];
const twoForward = chart[i + 2];
return (twoBack < prev && prev < current) && (current > next && next > twoForward )
? [...agg, current]
: agg;
}, []);
對于上述輸入,這會產生:
[2462, 2456, 1532, 1537, 1383]
更新 2
這是找到所有峰值、計算出中值并返回大于中值的所有峰值的代碼版本。這是與您在問題中要求的最接近的結果:
const findPeaks = chart => {
const peaks = chart.reduce((agg, current, i) => {
const twoBack = chart[i - 2];
const prev = chart[i - 1];
const next = chart[i + 1];
const twoForward = chart[i + 2];
return (prev < current) && (current > next)
? [...agg, current]
: agg;
}, []);
const mean = peaks.reduce((a, b) => a + b) / peaks.length;
return peaks.filter(peak => peak > mean);
}
這個的輸出是:
[2462, 2456, 2407, 2392, 2214]

TA貢獻1836條經驗 獲得超4個贊
沒有更精確地定義所需的輸出(例如,什么被認為是一個組?),這是一個簡單的算法:
1) 將數組拆分為“低”和“高”序列。
例如[1, 10000, 100, 101, 20000, 20050, 30, 10, 2]=> [1], [10000], [100, 101], [20000, 20050], [30, 10, 2]。
2) 返回每個高序列的最大值。
let peaks = arr => {
let isHigh = a => a >= 2000;
let isLow = a => !isHigh(a);
let groups = [];
while (arr.length && arr.some(isHigh)) {
arr.splice(0, arr.findIndex(isHigh));
groups.push(arr.splice(0, arr.findIndex(isLow)));
}
return groups.map(group => Math.max(...group));
};
const arr = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141];
console.log(peaks(arr));
const arr2 = [1365, 1324, 1013, 1220, 1259, 2204, 2212, 1938, 1882, 1545, 1236, 2090, 2614, 1949, 1307, 1628, 1780, 1263, 1184, 2184, 1411, 1306, 2010, 2057, 1339, 1624, 2480, 2575, 2425, 2617, 2479, 1929, 1805, 1869, 1341, 1104, 2195, 1661, 1174, 1447, 1761, 1362, 1430];
console.log(peaks(arr2));

TA貢獻1831條經驗 獲得超4個贊
為什么不保持簡單?
var arr = [1,6,4,3,9,11];
var peaks = arr.sort((a, b) => a - b).reverse();
輸出為:[11, 9, 6, 4, 3, 1]
然后:
var top5 = peaks.slice(0,5);
結果是:[11, 9, 6, 4, 3]
或者你的數學的整個代碼:
const peaks1 = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141];
const peaks2 = [1365, 1324, 1013, 1220, 1259, 2204, 2212, 1938, 1882, 1545, 1236, 2090, 2614, 1949, 1307, 1628, 1780, 1263, 1184, 2184, 1411, 1306, 2010, 2057, 1339, 1624, 2480, 2575, 2425, 2617, 2479, 1929, 1805, 1869, 1341, 1104, 2195, 1661, 1174, 1447, 1761, 1362, 1430];
const peaks = [peaks1, peaks2];
function getPeaks(arr){
let peaks = [];
for(let i=0;i<arr.length;i++){
let currPeak = arr[i].sort((a, b) => a - b).reverse().slice(0,1)[0];
peaks.push(currPeak);
}
return peaks.sort((a, b) => a - b).reverse();
}
let result = getPeaks(peaks);
結果應該是:[2617, 2462]
添加回答
舉報