在对一个数组进行查找某个特定值时,我们往往是需要处理边界值的问题的,例如以下情况:
查找arr中是否有K这个值,是则返回对应索引,否则返回-1。
一般的思路是分情况:
// js实现代码
const search_for_K = (arr, k) => {
for(let i=0;i<arr.length;i++) {
if(arr[i] === k) return i;
else if(arr.length-1 === i) return -1;
}
};
使用哨兵,即在数组边界加入目标值K,以此将对比次数减半:
// js实现代码
const search_for_K = (arr,k) => {
arr.unshift(k);
for(let i=arr.length-1;i>=0;i--){
if(arr[i] === k) return i-1;
}
};
因为哨兵的设置让程序减少了一步判断,因此查找的效率会有所提升,在数据量大的情况下,这种提升会十分明显。
后续如果学习到哨兵的更多应用场景,会继续更新本文的。
网友评论