代码改变世界

数据结构与算法---概述

2019-05-12 19:56  *奋斗*  阅读(101)  评论(0)    收藏  举报

从广义上讲,数据结构就是指一组数据的存储结构,算法就是操作数据的一组方法。

数据结构与算法中一个非常重要的概念---复杂度分析

需要掌握的10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树
需要掌握的10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法

学习数据结构和算法的时候,要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。

数据结构和算法本身要解决的是“快”和“省”的问题,即:如何让代码运行得更快,如何让代码更省存储空间。所以执行效率是算法的一个非常重要的考量指标。

那如何来衡量算法的执行效率呢?

大O复杂度表示法

算法的执行效率,粗略地讲就是算法代码的执行时间。
所有代码的执行时间T(n)与每行代码的执行次数成正比。
T(n)=O(2n + 2)
T(n)=O(2n*n + 2n + 3) // n 表示数据规模,对应代码重复执行的次数

随着数据规模n越来越大时,非多项式量级算法(o(2的n次方)、o(n的阶乘))的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。我们主要看几种常见的多项式时间复杂度算法。

1、O(1)
表示常量级时间复杂度的一种表示方法。一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是O(1)。

2、O(logn)、O(nlogn)
对数阶时间复杂度非常常见,也是最难分析的一种时间复杂度。
i=1;
while (i <= n){
i = i * 2;
} // 2可以替换为3或10,对应时间复杂度统一为 O(logn)

3、O(m + n)、O(m * n)
代码的复杂度由两个数据的规模决定,不能确定m大还是n大

算法的空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
我们常见的空间复杂度就是 O(1)、O(n)、O(n*n)。
常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n*n)。

最好情况时间复杂度、最坏情况时间复杂、平均情况时间复杂度(正确的应该是加权平均时间复杂度、期望时间复杂度)。
均摊时间复杂度(摊还分析),在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。