这是一本零基础入门的书,写得很是的浅显易懂,就算不会写代码也能看懂。并且很薄,内容很少,一两个星期就能看完。
主要讲了时间复杂度的概念、常见的的数据结构和算法。
对于想学数据结构和算法,又啃不下看不懂《算法导论》那种大部头书的人,强烈推荐看这本小书入门。不看会后悔系列:)
书的豆瓣地址:https://book.douban.com/subje...
我这篇笔记只整理了前三章的内容。算法
通常数据结构都有如下4 种操做(或者说用法)。读取
:查看数据结构中某一位置上的数据。查找
:从数据结构中找出某个数据值的所在。插入
:给数据结构增长一个数据值。删除
:从数据结构中移走一个数据值。数组
操做的速度,并不按时间计算,而是按步数
计算。数据结构
对数组进行读取操做
,即查看数组中某个索引所指的数据值,这只要一步
就够了,由于计算机自己就有跳到任一索引位置的能力。
当程序声明一个数组时,它会先划分出一些连续
的空格子以备使用。
只须要一步,是由于:
(1) 计算机能够一步就跳到任意一个内存地址上。
(2) 数组自己会记有第一个格子的内存地址,所以,计算机知道这个数组的开头在哪里。
(3) 数组的索引从0 算起。
(4) 数组的格子是连续的。
因此,数组的读取是一种很是高效的操做,由于它只要一步就好。一步天然也是最快的速度。
这种一步读取任意索引的能力,也是数组好用的缘由之一。数据结构和算法
对数组进行查找操做
,须要从第0个,到最后一个,挨个寻找
数组中的每一个值(遍历数组),直到找到为止。
最好的状况只须要一步,在数组的第0个找到了,最坏的状况,长度为N的数组,须要N步
,找到最后一个才找到、或者找不到。性能
对数组进行插入操做
,须要把插入位置后面的值日后移,为新插入的元素腾出空间。最好的状况是在数组末尾插入,只须要一步,直接插入,不须要腾空间。最坏的状况是在数组的开头插入,要把数组的每一项都日后移一位,长度为N的数组,须要N步
操做。code
对数组进行删除操做
,须要删除元素,而后把元素后面的全部元素都往前移一位。跟插入同样,最好的状况是删除数据末尾的元素,最坏的状况是删除数组开头的元素,须要N步
。索引
影响算法性能的主要因素是其所需的步数。
内存
对于数组的查找,咱们能够这样描述:对于具备N个元素的数组,查找操做最多须要N步。(通常叫这种查找为“线性查找”)
get
这听起来很啰唆。为了方便表达数据结构和算法的时间复杂度,计算机科学家从数学界借鉴了一种简洁又通用的方式,那就是大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步。