欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法讲解--二分查找、大O表示法

程序员文章站 2022-05-23 09:58:05
...

算法讲解--二分查找、大O表示法


首先,祝各位大朋友和小朋友6。1 快乐哈,happy~

从今天起会陆续更新算法相关的笔记,记录一下自己学习《算法图解》的笔记,欢迎多多指教。

二分查找

二分查找是一种算法,其输入是一个有序的元素列表(必须有序,稍后会做解释)if 查找的元素包含在列表中,二分查找返回其位置,else return null;
exp: 你从电话簿中找姓q的人,可以从头开始找,傻呀你,为啥不从中间开始呢???因为你知道q位于电话簿中间位置。
exp: 从1~100中猜一个数字,目标最少的次数猜到该数字。 最佳方式从50开始猜。这样就排除了一半。看到这里,二分查找的精髓就展现了,没错,那就是每次都将余下的数字排除一半哈。
为啥要有序的列表呢?
because 仅当列表有序时,二分查找才有用。
exp: 电话簿的名字是按照字母排序的 ABCDEFG…,因此可以使用二分查找来查找名字。if not 按照顺序排列。结果就如何呢,xixi

大O表示法

大O表示法是一种特殊的表示法,指出了算法的速度有多快。
exp:假设列表包含n个元素,简单查找需要检查每个元素,因此需要执行n 词操作。此时,使用大O表示法,这个运行时间为O(n)。-------大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速哈。
exp:为检查长度为n的列表,二分查找需要执行log n 次操作,使用大O表示法,这个运行时间为O(log n)
注意哈:大O表示法指出了最糟糕情况下的运行时间
exp: 电话簿找人最佳情况下1次就找到了,最早情况下n次才能找到。对应运行时间O(n)

二分查找核心代码

function binary_search(list,number){
   low =0;   //下标
   high=list.length-1;
   while (low <high) {
       mid = (low+high)/2;
       guss=list[mid];   
       if(guess  == number) {
            return mid;
	   }
	   if(guess > number) {
           high =mid -1;
       }else {
          low=mid+1;
      }
   }
   return None;
}

小结

1、二分查找速度比简单查找快
2、O(logn)比O(n) 快,需要搜索的元素越多,前者比后者就快的越多。
3、算法运行时间不以秒为单位
4、算法运行时间以用O表示法表示。
5、算法运行时间以增速角度度量的。

扩展

O(log n) 也叫对数时间   exp  二分查找
O(n) 也叫线性时间   exp  简单查找  for(int i=0;i<n;i++)
O(n*log n)    exp   快速排序 [每一层排序n 一共logn层 后续会讲解]
O(n2)    exp  选择排序----一种较慢的排序算法
O(n!)   旅行商问题
相关标签: 算法图解 算法