在不拆分数组或创建新数组的情况下搜索数组以查找峰值的最佳方法,javascript
Best way to search through an array to find peaks, without splitting it or creating new arrays, javascript
我有一个有效的峰值搜索函数,它将一个数组作为参数,然后 returns 该数组的峰值。我需要找到主峰,然后是左峰和右峰。然后我需要能够继续找到峰值。这意味着,用户点击一个按钮,每次他们点击
按钮,传入数组寻找下一个峰值。例如
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 个值的主数组,然后是另外 2 个 250k 左右的数组。现在我掌握了一百万个值,而且这个数字只会随着我不断发现越来越多的峰值而增长。我只需要搜索主数组,搜索主峰,然后搜索左侧的 x 个值和右侧的 x 个值。我不确定我是否需要 2 个单独的函数,或者我是否可以从峰值递减并递增以获得两个值。或者用输入创建一个新的峰值搜索功能
数组的开始索引和停止索引并从那里搜索。我的峰值搜索功能工作正常,returns 在数组中传递时正确的峰值。
这是我目前使用的峰值搜索功能
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;
}, []);
};
这returns只是数组格式的峰列表。
我有一个有效的峰值搜索函数,它将一个数组作为参数,然后 returns 该数组的峰值。我需要找到主峰,然后是左峰和右峰。然后我需要能够继续找到峰值。这意味着,用户点击一个按钮,每次他们点击 按钮,传入数组寻找下一个峰值。例如
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 个值的主数组,然后是另外 2 个 250k 左右的数组。现在我掌握了一百万个值,而且这个数字只会随着我不断发现越来越多的峰值而增长。我只需要搜索主数组,搜索主峰,然后搜索左侧的 x 个值和右侧的 x 个值。我不确定我是否需要 2 个单独的函数,或者我是否可以从峰值递减并递增以获得两个值。或者用输入创建一个新的峰值搜索功能 数组的开始索引和停止索引并从那里搜索。我的峰值搜索功能工作正常,returns 在数组中传递时正确的峰值。
这是我目前使用的峰值搜索功能
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;
}, []);
};
这returns只是数组格式的峰列表。