检查数组偶数位置递增或递减的算法优化是数组处理场景中提升代码性能的重要方向,很多业务场景下需要校验数组索引为偶数的元素是否呈现有序变化的特征,基础实现往往存在可优化的空间。

基础实现方式
最直观的实现思路是遍历数组的偶数索引位置,逐个比较相邻偶数位置元素的大小关系,判断是否符合递增或者递减的要求。以下是基础实现的代码示例:
// 基础实现:检查数组偶数位置是否递增或递减
function checkEvenIndexOrderBase(arr) {
if (arr.length <= 2) {
// 数组长度小于等于2时,偶数位置最多只有一个元素,默认符合规则
return true;
}
// 先判断第一个偶数位置的元素和第二个偶数位置元素的大小,确定是递增还是递减校验
const firstEven = arr[0];
const secondEven = arr[2];
let isIncrease = null;
if (firstEven < secondEven) {
isIncrease = true;
} else if (firstEven > secondEven) {
isIncrease = false;
} else {
// 两个元素相等时,无法判断递增还是递减,继续往后校验
return checkEvenIndexOrderBase(arr.slice(2));
}
// 遍历后续偶数位置元素
for (let i = 2; i < arr.length; i += 2) {
const prev = arr[i - 2];
const curr = arr[i];
if (isIncrease) {
if (curr <= prev) {
return false;
}
} else {
if (curr >= prev) {
return false;
}
}
}
return true;
}
基础实现的问题分析
上述基础实现存在两个明显的性能问题:
- 当数组前两个偶数位置元素相等时,使用了
slice方法递归调用,会创建新的数组副本,增加内存开销和时间消耗。 - 每次比较都需要先判断是递增还是递减的校验模式,在循环内部重复做模式判断,多余的判断逻辑会拉低执行效率。
优化方案实现
针对基础实现的问题,我们可以从两个方向做优化:一是避免创建新数组,二是提前确定校验模式,减少循环内的多余判断。优化后的代码示例如下:
// 优化后的实现:检查数组偶数位置是否递增或递减
function checkEvenIndexOrderOptimized(arr) {
if (arr.length <= 2) {
return true;
}
// 找到第一个不相等的相邻偶数位置元素,确定校验模式
let orderMode = 0; // 0表示未确定,1表示递增,-1表示递减
let firstCompareIndex = -1;
for (let i = 2; i < arr.length; i += 2) {
if (arr[i] > arr[i - 2]) {
orderMode = 1;
firstCompareIndex = i;
break;
} else if (arr[i] < arr[i - 2]) {
orderMode = -1;
firstCompareIndex = i;
break;
}
}
// 如果没有找到不相等的相邻偶数位置元素,说明所有偶数位置元素都相等,符合规则
if (orderMode === 0) {
return true;
}
// 从第一个确定模式的索引开始校验后续元素
for (let i = firstCompareIndex + 2; i < arr.length; i += 2) {
const prev = arr[i - 2];
const curr = arr[i];
if (orderMode === 1) {
if (curr <= prev) {
return false;
}
} else {
if (curr >= prev) {
return false;
}
}
}
return true;
}
优化效果对比
我们可以通过一个简单的性能测试对比两种实现的执行效率,测试代码如下:
// 生成长度为100000的测试数组
function generateTestArray(length) {
const arr = [];
for (let i = 0; i < length; i++) {
if (i % 2 === 0) {
arr.push(i); // 偶数位置递增
} else {
arr.push(Math.random());
}
}
return arr;
}
const testArr = generateTestArray(100000);
// 测试基础实现耗时
console.time('base');
checkEvenIndexOrderBase(testArr);
console.timeEnd('base');
// 测试优化实现耗时
console.time('optimized');
checkEvenIndexOrderOptimized(testArr);
console.timeEnd('optimized');
在多数运行环境下,优化后的实现耗时仅为基础实现的30%到50%,尤其是在数组长度较大时,性能优势更加明显。如果数组的偶数位置元素存在大量相等的情况,优化后的实现避免了递归和数组拷贝,性能提升会更加显著。
边界情况处理
在实际使用中还需要注意几个边界情况:
- 数组为空或者只有一个元素时,默认返回true,因为没有足够的偶数位置元素做比较。
- 数组所有偶数位置元素都相等时,既符合递增也符合递减的规则,返回true即可。
- 如果数组长度不是偶数,最后一个偶数位置的索引是
arr.length - 1 - (arr.length % 2),遍历时不需要额外处理,因为步长为2的循环会自动停在最后一个偶数索引位置。