Skip to content

Latest commit

 

History

History

readme.md

二分查找

时间复杂度
  • 时间复杂度:O(logN)
局限性
  • 二分查找依赖的是顺序表结构,简单来说就是数组
    • 二分查找算法需要按照下标随机访问元素,数组按下标访问的时间复杂度为O(1)
    • 链表随机访问的时间复杂度是O(n),所以,如果数据使用链表存储,二分查找的时间复杂度会变得很高
  • 二分查找针对的是有序数据
    • 数据必须是有序的
    • 如果数据是无序的,需要先排序。排序的时间复杂度O(nlogn)
    • 如果我们针对的是一组静态的数据,没有频繁地插入,删除,我们可以进行一次排序,多次二次查找。这样排序的成本可被均摊,二分查找的边际成本就会比较低
    • 如果我们的数据集合有频繁的插入和删除操作,要想用二分查找,要么每次插入,删除操作之后保证数据仍然有序,要么在每次二分查找之前都进行排序。针对这种动态数据集合,无论那种方法,维护有序的成本都是很高
    • 所以,二分查找只能用在插入,删除操作不频繁,一次排序多次查找的场景中。而动态变化的数据集合,二分查找将不再适用
  • 数据量太小不适合二分查找
    • 如果处理的数据量比较小,完全没必要用二分查找,顺序遍历就足够了
  • 数据量太大也不适合二分查找
    • 二分查找的底层需要依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻
    • 也正是这种“连续”,如果要查找的数据比较大又是零散的。这样就不能使用二分查找