《算法图解》第一章——算法简介

补足基本功,特此作为读书记录。特此感谢深度眸博主的资料与博客技术分享

资料链接:http://cuijiahua.com/resource.html

目录

二分查找

大O表示法

旅行商问题

书中最后的小结


  • 二分查找

书中以一个例子引入该算法。例:在一个电话簿中找名字以K打头的联系人,方法一:从头开始翻直到以K打头的该联系人。(简单查找);方法二:先从中间找翻到字母K,然后再去找该联系人(二分查找)。需要注意的是:电话本一定是已经按照A到Z的顺序排好序的,不然方法二将无法实现。

二分查找是一种算法:输入一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null

《算法图解》第一章——算法简介_第1张图片

                                                                                          图1. 图解二分查找法

书中接着提出个问题,来练习加强理解该算法,例:1~100让你猜数字,每次你猜测后我会说大了还是小了还是对了。两种解决方法如下:一.简单查找(傻找):从数字1开始猜,每次排除一个数字,直到猜测正确;二.二分查找:每次都从中间猜,每次排除一半,直到猜测正确。所以如果所猜数字是99的话,那么我们用法一将会进行99次操作,而使用二分法,则最多进行7次操作。二分查找法的优势凸显出来了。

一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步

测试代码如下:

#!/usr/bin/env python3 
# -*- coding:utf-8 -*-
def binary_search(list,item): #两个位置参数
    low = 0      #列表的头
    high = len(list)-1  #列表的尾
    while low <= high:  #循环条件
        mid = int((low + high) / 2) #获取列表的中间位置
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None
        
my_list = range(1,101)
print(binary_search(my_list,7)) #测试7在哪里
print(binary_search(my_list,-1))#测试-1在哪里
  • 大O表示法

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

《算法图解》第一章——算法简介_第2张图片

大O表示法的现阶段启示:

  1. 算法的速度指的并非时间,而是操作数的增速。

  2. 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。

  3. 算法的运行时间用大O表示法表示。

  4. O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。(log2n书中之后都写作log n)

 

  • 旅行商问题

旅行商前往n座城市,有A_{n}^{n}种排列组合,需要执行n!次操作才能计算结果。运行时间为O(n!)对该问题的优化依旧是个计算机界的难题。

 

  • 书中最后的小结

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

 

初次码字,如有错误欢迎指正

 

你可能感兴趣的:(算法图解)