一、数据结构与算法的关系
其实很多时候,感觉数据结构与算法是相互依存的,很多书的名称就叫数据结构与算法。那它们之间究竟有什么关系呢?以下为个人理解。
数据结构更像是一种方法,它能够使你的算法变得更加高效和精炼,当学习数据结构的时候,适当地了解一些算法可以帮助你更加深刻地理解数据结构的用法以及效果。
算法是一种为解决某个问题而设计的方法,算法并不是唯一的,但根本目的是要解决问题,而通过学习数据结构能够很好地帮助我们优化我们的算法。
二、算法的时间复杂度与空间复杂度
了解算法的时间复杂度,首先要了解函数的渐进增长,什么是渐进增长呢,书上讲了很多,我觉得可以归结为以下几点。
在输入同等数量的数据时,函数的运算次数,可关注以下几点:
忽略加法项
最高项前方的系数并不重要
最高项的指数大,函数增长越快
结论:判断一个算法的效率时,函数中的函数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数。
(一)时间复杂度
定义:(好大一段话,就不打上来了)总结一下就是,随着n的增大,确定执行次数n的数量级,这个数量级就是复杂度。
推导大O阶方法:我的理解就是将除最高项的其他部分都去除就是了。嘻嘻(#.#)。
常数阶:根本没有最高项阶
统统记为O(1)
线性阶:一般一重循环运算,最高项次数为1
记为O(n)
对数阶;这个不太好理解,来一个例子
算法
int count=1;
while(count<n)
{
count=count*2
}
来看这个算法,每次count乘以2后,就会更接近n因此,它的执行次数为以二为底n的对数,时间复杂度为O(logn)。
平方阶:循环嵌套一般就是这个
常见时间复杂度耗费时间
O(1)<O(logn)<O(n)<O(nlogn)<O(n的2次方) <O(n的3次方)<O(2的n次方) <O(n的阶乘)<O(n的n次方)
(二)空间复杂度
空间复杂度相比于时间复杂度来说要好理解一点,也就是算法运行过程中需要占用的内存,后面我们讨论的算法复杂度主要讨论时间复杂度。