我有一个工作峰值搜索函数,它将数组作为参数,然后返回该数组的峰值。我需要找到主峰,然后是左峰和右峰。然后我需要能够继续寻找峰值。这意味着,用户点击一个按钮,每次点击
按钮,传入数组以查找下一个峰值。例如
arr = [1,5,25,7,8,3,34,8,9,9,91,7,3,7,8,4,1,39,0,3,7,8,14,2 ]
调用上面的寻峰功能,91为主峰,39为右峰,34为左峰。现在再次按下按钮,右峰值应为 14,左峰值应为 25。依此类推,每次向左或向右搜索峰值。我的问题是我的初始数组中有大约 500,000 个值。最初,我每次都拆分数组,所以我有 500,000 个值的主数组,然后是 250k 左右的数组。现在我持有一百万个值,这个数字只会随着我继续寻找越来越多的峰值而增长。我只需要搜索主数组,搜索主峰,然后向左搜索 x 值,向右搜索 x 值。我不确定我是否需要 2 个单独的函数,或者我是否可以从峰值递减并递增以获得两个值。或者使用输入创建一个新的峰值搜索功能
数组、起始索引和停止索引,然后从那里搜索。我的峰值搜索功能工作正常,并在传入数组时返回正确的峰值。
这是我当前的工作峰值搜索功能
function find_the_peaks(nums) {
if (!nums.length) return -1; //break
//else init variables to be used for specific points
var left = 0;
var right = nums.length - 1;
var mid1 = 0;
var mid2 = 0;
//compare points to find where there is the greatest difference in change, finding the highest delta
while (left < right) {
mid1 = Math.floor((left + right) / 2);
mid2 = mid1 + 1;
if (nums[mid1] < nums[mid2]) {
left = mid2;
} else {
right = mid1;
}
}
return left;
//return point with the greatest change, aka the next highest peak
};
我不认为这是重复的,因为尽管还有其他关于峰值搜索的问题,但所有这些都进行多次搜索需要您在某个点拆分数组。我的一个想法是找到每个峰值并将所有峰值存储在一个数组中,从那里找到峰值作为最大值,然后根据用户想要的方式向左或向右移动一个。但我不知道我将如何做到这一点。
最佳答案
function find_all_the_peaks(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;
}, []);
};
这仅返回数组格式的峰列表。
关于javascript - 在不拆分数组或创建新数组的情况下搜索数组以查找峰值的最佳方法,javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67571079/