《算法图解》学习笔记(第一章)

《算法图解》学习笔记-第一章-算法简介



前言

本文为自己的算法学习笔记,用来将所学知识及时输出
所用书籍:《算法图解》


1.1 什么是算法

算法是一组完成任务的指令。任何代码片段都可视为算法。
算法的定义:计算机按照一定规则解决一类问题的明确有限的步骤


1.2 二分查找法

二分查找和小时候玩的猜数字游戏有些类似,玩家A在一组数字中任选一个数字,由玩家B去猜测,怎样才能最快的去猜到这个数字,这就和二分查找的思想有关了。

假设共有100个数字,由1-100正序排列,玩家B第一次猜测数字为100/2=50,玩家A回答大了或者小了,若大了玩家B下一次猜测数字为50/2=25,若小了数字为50+(100-50)/2 = 75,由此类推直到找到正确数字。

注:二分查找的输入需是一组有序的元素列表,若要查找的元素包含在此列表中,结果返回元素索引,否则返回null。


二分查找的python实现

代码如下:

def binary_search(ls, item):		# ls为数字列表(数组),item为要猜测的数字
	low = 0							# low和high用来跟踪查找列表范围
	high = len(ls) - 1
	
	while low <= high:				# 直至范围缩小到只包含一个元素
		mid = (low + high) // 2		# 获取列表中部索引
		guess = ls[mid]				# 取得对应的值
		if guess == item:			# 猜对了返回值的索引
			return mid
		elif guess < item:		# 猜小了
			low = mid + 1
		else:						# 猜大了
			high = mid - 1	
	return None						# 列表未包含指定元素


list = []							# 测试
for i in range(100):			
	list.append(i+1)					# 生成[1, 2, 3, ..., 100]
print(binary_search(list, 2))		# => 1
print(binary_search(list, -2))		# => None

1.3 大O表示法

大O表示法指出了算法的速度快慢,可以帮助编程人员衡量算法的好坏。

1.3.1 不同算法运行时间也不尽相同

假设列表包含n个元素,用从头找到尾的简单查找法,最多需要找n次,而使用二分查找法,在最糟糕的情况下也只需要找log2n次,下面具体对比一下:

元素个数简单查找二分查找
100100毫秒7毫秒
10,00010秒14毫秒
1000,000,00011天30毫秒
用大O表示法表示简单查找的时间为:O(n),二分查找的时间为O(log n)

1.3.2 常见的大O运行时间

下面是由快到慢的五种常见大O运行时间

  1. O(log n), 对数时间, 算法包括二分查找
  2. O(n),线性时间, 算法包括简单查找
  3. O(n * log n),算法包括快速排序-------第四章
  4. O(n²),算法包括选择排序-------第二章
  5. O(n!),旅行商问题

1.3.3 旅行商问题

旅行商问题的算法运行时间为O(n!),且暂无更好的解决方法。具体问题如下:
有一名旅行商,他要去5个城市,同时要保证旅程时间最短,为此需要考虑前往这些城市的顺序搭配。
请添加图片描述
五个城市有120种不同的解决方案,因此需要执行120次操作。涉及6个城市时,需要执行720次操作。而如果有n个城市,则需执行n!次操作才能得出结果,因此运行时间为O(n!)。


总结

  • 不同算法运行时间不同,尽量选择最优算法。
  • 简单查找最糟情况下需要遍历全部元素,因此运行时间为O(n)。
  • 二分查找法每次除去当前范围一半的数据量,因此运行时间为O(log n)。
  • 大O表示法用来衡量算法运行时间,帮助程序员判断算法优劣。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值