为何Array.prototype.includes未采用二分查找算法?
为什么Array.prototype.includes不使用二分查找?
嘿,这个问题问到点子上了!咱们从几个核心角度来掰扯清楚:
二分查找有个硬前提:数组必须是有序的
includes的设计目标是能处理任意数组——不管你是有序的、乱序的,甚至里面混着各种类型的元素,它都得能正常工作。如果includes底层用二分查找,那用户在调用前必须先把数组排序,但排序本身会带来额外的开销(时间复杂度O(n log n)),甚至还可能改变原数组的顺序(除非你先拷贝一份),这完全违背了includes“简单判断存在性”的初衷。通用性优先,避免使用门槛
JS的API设计一直倾向于“开箱即用”,includes就是给开发者提供一个最直观的工具:给我一个数组和元素,告诉我有没有就行。要是换成二分查找,那开发者每次用之前都得记着“先排序”,这无疑增加了使用成本,反而不如线性遍历直接。性能的实际权衡
二分查找的O(log n)优势只在超大有序数组里才明显。但大多数日常开发场景中,数组的长度都不大,线性遍历的O(n)开销其实可以忽略不计,甚至比“排序+二分”的总开销更小。而且JS引擎早就对数组的线性遍历做了大量优化,实际运行效率并不差。
顺便提下你的示例代码
你写的这个BinarySearch函数其实并没有用到二分查找哦,内部还是调用了includes(本质是线性遍历)。如果真要实现二分查找,得先确保数组是有序的,然后手动写二分逻辑,比如:
function binarySearch(names, requiredName) { // 假设names已经按字典序排序完成 let left = 0; let right = names.length - 1; while (left <= right) { const midIndex = Math.floor((left + right) / 2); const currentName = names[midIndex]; if (currentName === requiredName) { return true; } else if (currentName < requiredName) { left = midIndex + 1; } else { right = midIndex - 1; } } return false; }
内容的提问来源于stack exchange,提问作者omar asi
相关产品推荐
相关产品推荐

