一、前言
数据结构:在内存中管理数据,速度快,带点存储
数据库:在磁盘中管理数据,速度慢,不带点存储
学习数据结构,我可以推荐几本书:严蔚敏的《数据结构》-->特点:C和引用
殷人昆的《数据结构》-->特点:C++
《大话数据结构》-->特点:图画得很好
二、时间复杂度的概念
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。
在这个例子中Func1 执行的基本操作次数 :
实际中我们计算时间复杂度时,其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法(一种“取大头”的估算)。
三、大O渐进表示法
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,上例的时间复杂度为:O(N^2)
(注意:1、当大头为2N时,时间复杂度为O(N),看似N和2N差距不小,其实不然,举一个例子,当我们要去宇宙中寻找一个距离我们为一亿光年的东西和一个距离我们两亿光年的东西,那这两件事对我们来说都一样,都不可能完成。
2、当大头为一个常数时,无论有多大,时间复杂度都为O(1),运算次数为1,时间复杂度为O(1),运算次数为10亿,时间复杂度也为O(1),为什么呢?因为我们的CPU足够强大,同样的公式运算一次和运算10亿次都只需要一瞬间,且这里的O(1)代表的原本就不是1,而是常数次。
3、当一段代码中出现了多个变量如N和M,计算时间复杂度有以下几种情况:
N与M关系不确定时:时间复杂度为O(N+M);N>>M时:时间复杂度为O(N);M>>N时:时间复杂度为O(M);N与M差不多大时:时间复杂度为O(N)或O(M)都可以。)