代码小工蚁的#《算法图解》#学习笔记-C1

代码小工蚁的#《算法图解》#学习笔记-C1

什么是算法

算法是一组完成任务的指令。任何代码片段都可视为算法。
计算机科学的名句:

算法+数据结构=程序

大神的故事:牛B轰轰的存在
算法+数据结构=程序(Algorithms + Data Structures = Programs),
它由瑞士计算机科学家、Pascal之父Nicklaus Wirth(尼克劳斯·埃米尔·维尔特,有译作尼古拉斯·沃斯或尼克劳斯·威茨)提出,此名句是其1976一学术著作的名字。
大神Nicklaus Wirth提出了“结构化程序设计”的概念,他是Pascal、Modula-2等几种编程语言的主设计师!!!
Modula语言中提出了“模块化”、“进程”等概念。
同时他还参与开发了世界上第一个具有图形用户界面的个人计算机系统Alto。[1]

算法使用示例

图算法:计算前往目的地的最短路径
图算法:编写跟踪游戏用户的AI系统
动态规划:编写国际跳棋的AI算法
K最近邻算法:编写推荐系统

猜数游戏玩一玩———我的“心灵感应术”

你在1-100的数字中随便选一个,你最多只要回答我7个问题,我就能“感应”到你心中的数字。

二分查找

简单查找Simple search
二分查找binary search
结论:一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。
二分查找的速度比简单查找快得多。

代码片断:二分查找

def binary_search(list, item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (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 = [1, 3, 5, 7, 9]
print(binary_search(my_list, 7))
print(binary_search(my_list, -1))

相关数学知识:幂与对数[2]
24 = 16
log216 = 4
对数是幂运算的逆运算
以10为底的,叫做常用对数(common logarithm)
以无理数e=2.71828……为底的对数,称为自然对数(natural logarithm)

python中的对数实现:
python算术运算符//(取整除,返回商的整数部分,数据类型可能是整数,也可能是浮点数,取决于运算数据)

python交互环境下使用:

import math
math.log(100)  # 默认是以e为底的自然对数
math.log(100,2)  # 以2为底的对数
math.log2(100)  # 以2为底的对数
math.log(100,10)  # 以10为底的常用对数
math.log10(100)  # 以10为底的常用对数

# 四舍五入处理,round()遵循向偶数舍入,即向最靠近的偶数舍入
round(3.5)  # 3
round(3.6)  # 4
round(2.5)  # 2
round(2.6)  # 3

# 取整处理,返回整数
int(3.5)  # 3
int(-3.5)  # -3
math.floor(3.5)  # 3
math.floor(-3.5)  # -4

# 阶乘n!
math.factorial(5)  # 120
math.factorial(100)  # 长达158位的惊天数字,作者说,太阳都要毁灭

# 太阳的寿命约100亿年,100e8=1e10
life = math.factorial(100)
life_year = life / 1000 /3600 / 24 /365
life_year / 1e10  # 需要多少个太阳呢,哈哈

大O表示法Big O notation

时间复杂度:time-complexity[3]
大O表示法标示出算法的(操作)数量,它能反映出随着数量增加,算法运行时间的变化关系。
大O表示法指出了算法在最糟情况下的运行时间。

五种常见的大O运行时间:
O(logn),对数时间,如:二分查找
O(n),线性时间,如:简单查找
O(n * logn),如:快速排序(速度较快)
O(n2),如:选择排序(速度较慢)
O(n!),如:旅行商问题(非常慢的算法)

(注意:此书log约定以2为底。python默认以e为底的。)

注意:
算法的速度不以秒来衡量,而是指(操作)数量的增长。
当我们谈论算法的速度时,实际上是在说,随着输入数据的增加,算法运行时间将以多快的速度增加。


参考:
[1]Niklaus Wirth的主页,老先生1999年4月已退休。
https://www.inf.ethz.ch/personal/wirth/
http://www.baike.com/wiki/%E5%B0%BC%E5%8F%A4%E6%8B%89%E6%96%AF%C2%B7%E6%B2%83%E6%96%AF

[2]对数的视频教程:
https://www.khanacademy.org/math/algebra2/exponential-and-logarithmic-functions/introduction-to-logarithms/a/intro-to-logarithms

[3]python数据操作的时间复杂度:time-complexity
https://wiki.python.org/moin/TimeComplexity

你可能感兴趣的:(代码小工蚁的#《算法图解》#学习笔记-C1)