二分查找

1.二分查找

假设你要在字典中查找一个单词,而该字典包含240 000个单词,
你认为每种查找最多需要多少步?
如果要查找的单词位于字典末尾,使用简单查找将需要240 000步。使用二分查找时,每次排除一半单词,直到最后只剩下一个单词。

二分查找_第1张图片因此,使用二分查找只需18步——少多了!
一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。

二分查找_第2张图片编写二分查找法的Java代码:

int low = 0;//数组的开始项
int high = array.length - 1;//数组的结束项
while(low <= high)
        {
            int middle = (low + high) / 2;//数组分割数
            if(goal == array[middle])
            {
                return middle;
            }
            if(goal > array[middle])//目标值大于中值,增大low,缩小范围
            {
                low = middle + 1;
            }
            if(goal < array[middle])//目标值小于中值,减小high,缩小范围
            {
                high = middle - 1;
            }
        }
        return -1;

二分查找_第3张图片
二分查找_第4张图片

2.运行时间

简单查找逐个地检查数字,如果列表包含100个数字,最多需要猜100次如果列表包含40亿个数字,最多需要猜40亿次。换言之,最多需要猜测次数与列表长度相同,这被称为线性时间(linear time)。
二分查找则不同。如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多需猜32次。二分查找的运行时间为对数时间(或log时间)。

3.大O表示法

用处:用来反映运行时间如何随列表增长而增加。

大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

为检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法,
这个运行时间怎么表示呢?O(log n)。一般而言,大O表示法像下面这样。
二分查找_第5张图片
大 O 表示法指出了最糟情况下的运行时间

  •  O(log n),也叫对数时间,这样的算法包括二分查找。
  •  O(n),也叫线性时间,这样的算法包括简单查找。
  •  O(n * logn),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。
  •  O(n2 ),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。
  • O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。

假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择,这些算法的运行时间如
上所示。如果你选择第一种算法,绘制该网格所需的操作数将为4(log 16 = 4)。假设你每秒可执
行10次操作,那么绘制该网格需要0.4秒。如果要绘制一个包含1024格的网格呢?这需要执行10 (log 1024 =
10)次操作,换言之,绘制这样的网格需要1秒。这是使用第一种算法的情况。
第二种算法更慢,其运行时间为O(n)。即要绘制16个格子,需要执行16次操作;要绘制1024
个格子,需要执行1024次操作。执行这些操作需要多少秒呢?

二分查找_第6张图片

4.小结

 二分查找的速度比简单查找快得多。
 O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
 算法运行时间并不以秒为单位。
 算法运行时间是从其增速的角度度量的。
 算法运行时间用大O表示法表示。

你可能感兴趣的:(二分查找)