数据结构与算法之基础知识 (3)

当然如果同样是n=10000.那么不同时间复杂度额算法执行次数、时间也不同。

具体 n 执行次数
O(1)   10000   1  
O(log2n)   10000   14  
O( n^1/2)   10000   100  
O(n)   10000   10000  
O(nlog2 n)   10000   140000  
O(n^2)   10000   100000000  
O(n^3)   10000   1000000000000  

降低算法复杂度有些会靠数据结构的特性和优势,比如二叉排序树的查找,线段树的动态排序等等,这些数据结构解决某些问题有些非常良好的性能。还有的是靠算法策略解决,比如同样是排序,冒泡排序这种笨而简单的方法就是O(n2),但快排、归并等聪明方法就能O(nlogn)。要想变得更快,那就得掌握更高级的数据结构和更精巧的算法。

时间复杂度计算
时间复杂度计算一般步骤:1、找到执行次数最多的语句; 2、计算语句执行的数量级 ; 3、用O表示结果。并且有两个规则:

加法规则: 同一程序下如果多个并列关系的执行语句那么取最大的那个,eg:

T(n)=O(m)+O(n)=max(O(m),O(n)); T(n)=O(n)+O(nlogn)=max(O(n),O(nlogn))=O(nlogn);

乘法规则:循环结构,时间复杂度按乘法进行计算,eg:

T(n)=O(m)*O(n)=O(mn) T(n)=O(m)*O(m)=O(m^2)(两层for循环)

当然很多算法的时间复杂度还跟输入的数据有关,分为还会有最优时间复杂度(可能执行次数最少时),最坏时间复杂度(执行次数最少时),平均时间复杂度,这在排序算法中已经具体分析,但我们通常使用平均时间复杂度来衡量一个算法的好坏。

数据结构与算法学习

捋过数据结构与算法基本概念的介绍,在学习数据结构与算法方面,个人把经典的数据结构与算法学习过程步骤写在下面,希望能给大家一个参考:

数据结构

单链表(带头结点、不带头结点)设计与实现(增删改查),双链表设计与实现

栈设计与实现(数组和链表),队列设计与实现(数组和链表)

二叉树概念学习,二叉树前序、中序、后序遍历递归、非递归实现 ,层序遍历

二叉排序树设计与实现(插入删除)

堆(优先队列、堆排序)

AVL(平衡)树设计与实现(四种自旋方式理解实现)

伸展树、红黑树原理概念理解

B、B+原理概念理解

哈夫曼树原理概念理解(贪心策略)

哈希(散列表)原理概念理解(几种解决哈希冲突方式)

并查集/不相交集合(优化和路径压缩)

图论拓扑排序

图论dfs深度优先遍历、bfs广度优先遍历

最短路径Dijkstra算法、Floyd算法、spfa算法

最小生成树prim算法、kruskal算法

其他数据结构线段树、后缀数组等等

经典算法

递归算法(求阶乘、斐波那契、汉诺塔问题)

二分查找

分治算法(快排、归并排序、求最近点对等问题)

贪心算法(使用较多,区间选点问题,区间覆盖问题)

常见动态规划(LCS(最长公共子序列) LIS(最长上升子序列)背包问题等等)

回溯算法(经典八皇后问题、全排列问题)

位运算常见问题(参考剑指offer和LeetCode问题)

快速幂算法(快速求幂乘、矩阵快速幂)

kmp等字符串匹配算法

一切其他数论算法(欧几里得、拓展欧几里得、中国剩余定理等等)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywxsw.html