《数据结构与算法图解》读书笔记
Posted 周羊羊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《数据结构与算法图解》读书笔记相关的知识,希望对你有一定的参考价值。
这是一本零基础入门的书,写得非常的浅显易懂,就算不会写代码也能看懂。而且很薄,内容不多,一两个星期就能看完。
主要讲了时间复杂度的概念、常见的的数据结构和算法。
对于想学数据结构和算法,又啃不下看不懂《算法导论》那种大部头书的人,强烈推荐看这本小书入门。不看会后悔系列:)
书的豆瓣地址:https://book.douban.com/subje...
我这篇笔记只整理了前三章的内容。
基础数据结构:数组
一般数据结构都有以下4 种操作(或者说用法)。读取
:查看数据结构中某一位置上的数据。查找
:从数据结构中找出某个数据值的所在。插入
:给数据结构增加一个数据值。删除
:从数据结构中移走一个数据值。
操作的速度,并不按时间计算,而是按步数
计算。
对数组进行读取操作
,即查看数组中某个索引所指的数据值,这只要一步
就够了,因为计算机本身就有跳到任一索引位置的能力。
当程序声明一个数组时,它会先划分出一些连续
的空格子以备使用。
只需要一步,是因为:
(1) 计算机可以一步就跳到任意一个内存地址上。
(2) 数组本身会记有第一个格子的内存地址,因此,计算机知道这个数组的开头在哪里。
(3) 数组的索引从0 算起。
(4) 数组的格子是连续的。
所以,数组的读取是一种非常高效的操作,因为它只要一步就好。一步自然也是最快的速度。
这种一步读取任意索引的能力,也是数组好用的原因之一。
对数组进行查找操作
,需要从第0个,到最后一个,挨个寻找
数组中的每个值(遍历数组),直到找到为止。
最好的情况只需要一步,在数组的第0个找到了,最坏的情况,长度为N的数组,需要N步
,找到最后一个才找到、或者找不到。
对数组进行插入操作
,需要把插入位置后面的值往后移,为新插入的元素腾出空间。最好的情况是在数组末尾插入,只需要一步,直接插入,不需要腾空间。最坏的情况是在数组的开头插入,要把数组的每一项都往后移一位,长度为N的数组,需要N步
操作。
对数组进行删除操作
,需要删除元素,然后把元素后面的所有元素都往前移一位。跟插入一样,最好的情况是删除数据末尾的元素,最坏的情况是删除数组开头的元素,需要N步
。
时间复杂度:大O记法
影响算法性能的主要因素是其所需的步数。
对于数组的查找,我们可以这样描述:对于具有N个元素的数组,查找操作最多需要N步。(一般叫这种查找为“线性查找”)
这听起来很啰唆。为了方便表达数据结构和算法的时间复杂度,计算机科学家从数学界借鉴了一种简洁又通用的方式,那就是大O记法
。
数组不论多大,读取都只需1 步。用大O 记法来表示,就是:O(1) 也叫常数时间。
对于N 个元素的数组,线性查找需要花N 步。用大O 记法来表示,即为:O(N) 也叫线性时间。
二分查找的大O 记法是:O(log N) 也叫对数时间。
O(log N) 也就是O(log2 N),不过为了方便就省略了2而已。
O(log N)则代表算法处理N 个元素需要log2 N 步。如果有8 个元素,那么这种算法需要3 步,因为log2 8 = 3。
从另一个角度来看,如果要把8 个元素不断地分成两半,那么得拆分3 次才能拆到只剩1 个元素。
这正是二分查找所干的事情。它就是不断地将数组拆成两半,直至范围缩小到只剩你要找的那个元素。
双层嵌套for循环的大O记法是: O(N²) 也被叫作二次时间
对于N个元素的数组,使双层嵌套for循环,要操作N*N步。
以上是关于《数据结构与算法图解》读书笔记的主要内容,如果未能解决你的问题,请参考以下文章
《算法图解》读书笔记 - 狄克斯特拉算法(Dijkstra)
《算法图解》读书笔记 - 狄克斯特拉算法(Dijkstra)