这是一本零根底入门的书,写得十分的浅显易懂,就算不会写代码也能看懂。而且很薄,内容不多,一两个星期就能看完。
次要讲了工夫复杂度的概念、常见的的数据结构和算法。
对于想学数据结构和算法,又啃不下看不懂《算法导论》那种大部头书的人,强烈推荐看这本小书入门。不看会悔恨系列:)
书的豆瓣地址: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步。