《算法图解》chapter1(算法简介)笔记和习题

男朋友推荐了《算法图解》这本萌萌的书作为我的算法启蒙书,简单翻了翻,似乎对新手很友好的样子,而且使用语言也是我最近正在学习的Python。既然决定了要走技术路线,就要好好学习数据结构与算法呀~~~

Chapter1 算法简介

算法是一组完成任务的指令。

1. 二分查找

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

注意:仅当列表是有序的时候,二分查找才管用。

  • Q:如果名字不是按顺序排列的,结果将如何呢?
  • Q:二分查找算法中,当中位数不是整数时,是向上取整还是向下取整?(https://cloud.tencent.com/developer/article/1434845)
- 对于有n个元素的有序列表:

简单查找:最多需要n步(线性时间)
二分查找:最多需要logn步(对数时间)

- Python实现:

书里面的代码是基于Python2.7版本的,我自己运行的时候使用的是3.7版本。

# binary search algorithm

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
		elif guess > item:
			high = mid - 1
		else:
			low = mid + 1

my_list = range(1,101)

print(binary_search(my_list,3))  # element "3" is at index 2
print(binary_search(my_list,-1)) # result:None

2. 大O表示法:

大O表示法是一种特殊的表示法,指出了算法的速度有多快。

算法的运行时间以不同的速度增加——

假设每检查一个元素需要1毫秒:

简单查找二分查找
100个元素100ms7ms
10000个元素10000ms14ms
1000000000个元素1000000000ms32ms

(观察:随着列表的增长,二分查找的速度比简单查找快得多。)

有鉴于此,仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。
大O表示法指出了最糟情况下的运行时间

・用大O法表示运行时间:
简单查找:O(n)
二分查找:O(logn)

注意:除最糟情况下的运行时间外,还应考虑平均情况的运行时间,这很重要。

- 启示:

・ 算法的速度指的并非时间,而是操作数的增速。
・谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
・算法的运行时间用大O表示法表示。
・O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

  • “阅读电话簿中姓名以A打头的人的电话号码”,运行时间是多少?(O(n) - ref.本书4.3节)

3. 旅行商:

问题:旅行商要前往n个城市,同时要确保旅程最短,怎样制定方案?

算法:考虑前往这些城市的各种可能顺序,对于每种顺序都计算总旅程,再挑选出旅程最短的路线。
运行时间: O(n!)

旅行商问题是计算机科学领域待解的问题之一。对于这个问题,目前还没有找到更快的算法。面对这个问题,我们能做的只是去找出近似答案。
(更详细的信息请参阅第10章)

@ 小结:

  • 二分查找的速度比简单查找快得多。
  • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
  • 算法运行时间并不以秒为单位。
  • 算法运行时间是从其增速的角度度量的。
  • 算法运行时间用大O表示法表示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值