《算法图解》第一章笔记

最近一门心思都在巩固数据结构和学习算法。

看到网上某大佬推荐的入门算法书——《算法图解》。

看了几章觉得是真的有点洗脑,观点都很简短明了。

记一下每一章的总结,以后没书也能回想起来。

这本书使用python2.7写的算法,看不懂python的不要买!!!
这本书使用python2.7写的算法,看不懂python的不要买!!!
这本书使用python2.7写的算法,看不懂python的不要买!!!

第一章 主要介绍了二分查找和大O表示法。

二分查找原理:有点类似猜谜游戏(假设正确值存在)

- 1-100中,我随便猜一个数,计算机来告诉我猜大了、猜小了、猜对了。
在这里插入图片描述

- 二分查找的话,我取1-100的中间数50开始猜,假如计算机告诉我猜大了,那么正确数应该在1-50里面,排除了51-100一半的数字!

- 我从1-50中间数25开始猜,假如计算机告诉我猜小了,那么正确数应该在25-50里面。
在这里插入图片描述

- 我从25-50中间数(25+50)/2=37开始猜,计算机告诉我猜对了,得出正确数为37。
在这里插入图片描述

二分查找的前提是:有序列表

根据上面的猜谜过程用java手写二分查找
public Object binary_search(int[] list , int item){
	int low = 0; //初始位置
	int high = list.length-1; //终点位置
	int mid ; //中点变量
	while(low<=high){
	   //防止数组溢出: mid = low+(high-low)/2 或 mid = high-(high-left)/2
	   //在leetcode上看到的
	    mid = (low + high)/2; //算出中点,中学公式。
		if(list[mid] == item) return mid; //找到了,返回下标
		if(list[mid] > item) high = mid - 1; //猜大了改high
		if(list[mid] < item) low = mid + 1;//猜小了改low
	}
	return null;//没找到
}

一般而言,包含n个元素的有序列表,用二分查找最多需要log₂N (以2为底)步,而简单查找最多需要n步。(ps:简单查找就是1-100内猜数字,最多需要猜100次才能找到值)

简单查找和二分查找对比:
在这里插入图片描述
由此引出大O表示法。

  • 大O表示法指出了算法的运行速度。
  • 大O表示法指出了最糟糕情况下算法的运行时间。
  • 算法运行时间并不是以秒为单位的,而是从增速的角度进行度量的。

在这里插入图片描述
一些常见的大O表示法

  • O(logn),也叫对数时间,这样的算法包括二分查找
  • O(n),也叫线性时间,这样的算法包括简单查找
  • O(n*logn),这样的算法包括快速排序
  • O(n^2),这样的算法包括选择排序
  • O(n!),这样的算法包括旅行商问题解决方案。

其实大O表示法图像化后就像中学学习的函数图。

  • f(n) = log n
  • f(n) = n
  • f(n) = n * log n
  • f(n) = n ^ 2
  • f(n) = n!
    在这里插入图片描述

旅行商问题:有一位旅行商,要去5个城市旅行。这位旅行商要前往这5个城市,同时确保旅程最短。为此,可考虑前往这些城市的各种可能顺序。
在这里插入图片描述
在这里插入图片描述
5个城市有 5!= 5 * 4 * 3 * 2 * 1 = 120种组合顺序,需要操作120次算距离。
6个城市就需要 6!= 6 * 5 * 4 * 3 * 2 * 1 = 720种组合顺序,需要操作720次算距离。
在这里插入图片描述
规律归纳起来:n个城市有n!种组合,需要操作n!次算距离,所以运行时间为O(n!)。

总结:重点掌握二分查找算法思路,了解大O表示法是怎么回事。去leetcode找标签二分查找的题目练练。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值