/LeetCode

Primary LanguageSwift

数据结构与算法之美

推荐书目: 《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和 算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。虽然这本书有 400 多 页,但是花两天时间读完,应该是没问题的。如果你之前完全不懂数据结构和算法,可以先从这 本书看起。 《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说 一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。 作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。

面试必刷的宝典 算法对面试很重要,很多人也很关心。我这里推荐几本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。 从《剑指 offer》这本书的名字就可以看出,作者的写作目的非常明确,就是为了面试。这本书 几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该 不成问题。 《编程珠玑》这本书的豆瓣评分非常高,有 9 分。这本书最大的特色就是讲了很多针对海量数 据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经 常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

核心知识点 20 个最常用的、最基 础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这 20 个知识点就足 够了。这里面有: 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态 规划、字符串匹配算法。

复杂度

时间复杂度的全称是渐进时间复杂度(asymptotic time complexity),表示算法的执行时间与数据规模之间的增长关系。 空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n )。 -w1326

最好情况时间复杂度(best case time complexity)、 最坏情况时间复杂度(worst case time complexity)、 平均情况时间复杂度(average case time complexity)、 均摊时间复杂度(amortized time complexity)。

最好情况时间复杂度 在最理想的情况下,执行这段代码的时间复杂度。就像我们刚刚讲到的,在最理想的情况下,要查找的变量 x正好是数组的第一个元素,这个时候对应的时间复杂度就是最好情况时间复杂度。

最坏情况时间复杂度 在最糟糕的情况下,执行这段代码的时间复杂度。就像刚举的那个例子,如果数组中没有要查找的变量x,我们需要把整个数组都遍历一遍才行,所以这种最糟糕情况下对应的时间复杂度就是最坏情况时间复杂度。

平均情况时间复杂度 我们都知道,最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度,我们需要引入另一个概念:平均情况时间复杂度,后面我简称为平均时间复杂度。(这个值就是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度、或者期望时间复杂度。)

注意:只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分。

摊还分析法,通过摊还分析得到的时间复杂度我们起了一个名字,叫均摊时间复杂度。 对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复 杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作 放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较 低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情 况时间复杂度。

一些定义

DFS(Deep First Search)深度优先搜索。 BFS(Breath First Search)广度优先搜索。