课程名称:2周刷完100道前端优质面试真题
课程章节:第2章 前端面试技能拼图1 :数据结构和算法(上),大厂面试必考
主讲老师:双越
课程内容:
今天学习的内容包括:
2-15 用 JS 实现二分查找-分析时间复杂度
2-16 用 JS 实现二分查找-代码演示和单元测试
2-17 用 JS 实现二分查找-递归和循环哪个更好
这几节主要是讲二分查找是啥,时间复杂度,两种实现方式和比较。
课程收获:
主要内容大致复述如下。
用于已排序的数据。
假设表中元素是按升序排列,中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
这个非常常见了,基本按照定义写就行。注意取中间值的 Math.floor 和 边界判断。
const search = (arr, target) => { const len = arr.length; if (len) { let l = 0, r = len - 1; while (l <= r) { let mid = Math.floor((l + r) / 2); if (target === arr[mid]) { return mid; } else if (target > arr[mid]) { l = mid + 1; } else { r = mid - 1; } } return -1; } else { return -1; } }; const arr = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]; const target = 40; console.info("二分结果", search(arr, target));
每次比较中间位置记录的关键字与查找关键字,如果不相等,则修改范围再次调用。
const search1 = (arr, target, l, r) => { const len = arr.length; if (!len || l > r) return -1; if (l == null) l = 0; if (r == null) r = len - 1; const m = Math.floor((l + r) / 2); if (target === arr[m]) { return m; } else if (target > arr[m]) { return search1(arr, target, m + 1, r); } else { return search1(arr, target, l, m - 1); } };
时间复杂度都是O(logn)
console.time 实际测试结果循环更快。
原因:递归增加了函数调用次数。
以上,结束。