写在最前面:
时间过得不慢不快,自己做iOS开发两三年了。期间有对学习的惊喜,未来的困惑,每一步的迈出都有收获和失去,就技术层面而言还停留在浅显的基础层,底层深层次的东西接触的不是那么多。安逸并不是自己的风格,探索深层次的技术,又是一次崭新的开始。本专题专门来描述和记录自己对数据结构的认知和反思,以及会用到的语言有C语言,Objective-C,Swift三种语言(目前),其他语言不在本专题的探索范围内。可能会有一部分iOS、安卓或者前端程序员会说开发中用到数据结构与算法的时候少之又少,但是个人觉得编程的核心就是编程思想,万变不离其宗,而且想学习其他语言也会上手很快,就像打王者荣耀,只要你有意识,不管啥英雄你都能Carry。希望能给在看数据结构方面的小伙伴带来一点帮助,也希望各位大神不瑟吝教。废话不多说,进入本篇的主题:数据结构之时间复杂度。
众所周知的,程序设计=算法+数据结构。虽然平时的开发中用到算法的地方并不是很多,但是关键的时候能运用高效的算法,却能让程序的效率大大提升。所以事前对算法的复杂度进行预估,可以帮助我们选择更高效的算法。
时间复杂度能够衡量一个算法所使用的时间。一般来说问题规模为n时,可以记做该问题的时间复杂度为f(n)。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。
函数的渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总比g(n)大,那么我们就说f(n)的增长渐进快于g(n)。
算法分析时,语句的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记做T(n)=O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。这样用大写O()来体现时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法成为最优算法。--摘自《大话数据结构》
推导大O阶的规则:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数
如此得到的结果就是大O阶
<一>常数阶
/**
常数阶 计算1到100的累加
*/
void constantOfTheOrder(){
/*执行一次*/
int sum = 0, n = 100;
/*执行一次*/
sum = (1+n)*n/2;
/*执行一次*/
RYQLog(@"%d", sum);
/*该算法的运行次数函数是f(n)=3,运用推导大O阶的规则,第一步把常数3改为1,又因为没有最高阶。所以该算法的时间复杂度可表示为:O(1)*/
}
<二>线型阶
/**
线型阶
*/
void linearOrder() {
/*这里可以理解为n是一个变量,可为1000,或者无穷大*/
/*执行一次*/
int n = 10;
/*执行一次*/
int sum = 0;
/*执行一次*/
int product = 1;
for (int i = 0; i < n; i++) {
/*执行一次*/
sum = sum + i;
/*执行一次*/
product = product * (i + 1);
}
/*该算法的运行次数函数是f(n)=2n+3,运用推导大O阶的规则,第一步把常数3改为1,只保留最高阶,即f(n) = 2n,在去除最高阶相乘的常数2,可以得到该算法的时间复杂度可表示为:O(n)*/
}
<三>对数阶
/**
对数阶
*/
void theLogarithmicOrde(){
/*这里可以理解为n是一个变量,可为1000,或者无穷大*/
/*执行一次*/
int n = 10;
/*执行一次*/
int count = 3;
while (count < n) {
/*执行一次*/
count = count*2;
}
/*由于每次count 乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于 n ,则会退出循环。由于 2^x = n 得到 x = log2(n) 所以这个循环的时间复杂度为O(logn)。*/
}
<四>平方阶
/**
平方阶
*/
void squareOrder(){
int i, j, sum;
int n = 100;
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
/*执行一次*/
sum = i + j;
}
}
/*i = 0, sum = i + j;执行了n次;
i=1,执行了n-1次
n+(n-1)+...+1 = n(n+1)/2;
f(n) = n(n+1)/2;
可以得到该算法的时间复杂度可表示为:O(n^2)
*/
}
网友评论