一天一个仿lodash函数实现-sortedIndex
拖了一周了,上周一直在忙(其实是sortedIndex没咋理解好)
sortedIndex 从有序数组中找到指定数该插入的位置,用的是二分法的方式解决。
有两个关键点:有序数组,二分法
所以实现上是这样的:
function sortedIndex(arr, value){
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(arr[mid]<value){
head = mid + 1;
} else {
tail = mid;
}
}
return tail;
}
在二分法中,我有个模糊的疑问,就是为什么head要mid+1,而tail不用mid-1?
配套的几个不必多说,其实就是多了判断条件或者返回罢了,实际上这几个函数在lodash源码里是抽离出底层逻辑函数,来分开调用的。
function sortedIndexBy(arr, val, it){
const iteratee = typeof it === 'string'?a=>a[it]:it
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(iteratee(arr[mid])<iteratee(val)){
head = mid + 1;
} else {
tail = mid;
}
}
return tail;
}
function sortedIndexOf(arr, val){
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(arr[mid]<val){
head = mid + 1;
} else {
tail = mid;
}
}
return arr[tail]===val?tail:-1;
}
关于sortedLastIndex则是查找出最后的一个index,假设数组中间有许多相等的匹配元素,函数则需要返回最后的一个的位置,这个其实很简单,在原有的判断中加多一个=判断即可。
function sortedLastIndex(arr, val){
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(arr[mid]<=val){
head = mid + 1;
} else {
tail = mid;
}
}
return tail
}
function sortedLastIndexBy(arr, val, it){
const iteratee = typeof it === 'string'?a=>a[it]:it
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(iteratee(arr[mid])<=iteratee(val)){
head = mid + 1;
} else {
tail = mid;
}
}
return tail;
}
function sortedLastIndexOf(arr, val){
let head = 0;
let tail = arr.length - 1;
let mid;
while(head<tail){
mid = Math.floor((head+tail)/2);
if(arr[mid]<=val){
head = mid + 1;
} else {
tail = mid;
}
}
return arr[tail]===val?tail:-1;
}
分类:
一天一个函数实现
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律