当然如果同样是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等字符串匹配算法
一切其他数论算法(欧几里得、拓展欧几里得、中国剩余定理等等)