标签:
#include<iostream> using namespace std; /* 算法 算法概念 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想。 对于算法而言,语言并不重要,重要的是思想。 算法和数据结构区别 数据结构只是静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 程序=数据结构+算法 总结: 算法是为了解决实际问题而设计的 数据结构是算法需要处理的问题载体 数据结构与算法相辅相成 算法特性 1.输入 算法具有0个或多个输入 2.输出 算法至少有1个或多个输出 3.有穷性 算法在有限的步骤之后会自动结束而不会无限循环 4.确定性 算法中的每一步都有确定的含义,不会出现二义性 5.可行性 算法的每一步都是可行的 算法效率的度量 影响算法效率的主要因素 1.算法采用的策略和方法 2.问题的输入规模 3.编译器所产生的代码 4.计算机执行速度 大O表示法 算法效率严重依赖于操作(Operation)数量 在判断时首先关注操作数量的最高次项 操作数量的估算可以作为时间复杂度的估算 在一台计算机上,cpu执行每个操作的时间是确定的 请看以下程序 */ //时间复杂度2n+4 空间复杂度4n+8 long sum1(int n) { long ret = 0;//操作1次 占4个字节 int* array = (int*)malloc(n * sizeof(int));//操作1次 占4*n个字节 int i = 0;//操作1次 占4个字节 for (i = 0; i<n; i++)//操作n次 在cpu中运算,不占用内存 { array[i] = i + 1; } for (i = 0; i<n; i++)//操作n次 在cpu中运算,不占用内存 { ret += array[i]; } free(array);//操作1次 不占用内存 return ret; } //时间复杂度n+2 空间复杂度8 long sum2(int n) { long ret = 0;//操作1次 占4个字节 int i = 0;//操作1次 占4个字节 for (i = 1; i <= n; i++)//操作n次 { ret += i; } return ret; } //时间复杂度 2 空间复杂度4 long sum3(int n) { long ret = 0;//操作1次 占4个字节 if (n > 0)//if语句只会执行一个分支 { ret = (1 + n) * n / 2;//操作1次 } return ret; } /* 注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。 注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。 对于sum1()--2n+4 说明sunm1的时间复杂度跟n值有关,n值越大 复杂度越大 用大O表示法写成 O(2n+4)-->O(n) 对于sum2()--n+2 说明sunm2的时间复杂度跟n值有关,n值越大 复杂度越大 用大O表示法写成 O(n+2)-->O(n) 对于sum2()--2 说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(2)-->O(1) 空间复杂度 对于sum1()--4n+8 说明sunm1的时间复杂度跟n值有关,n值越大 复杂度越大 用大O表示法写成 O(4n+8)-->O(n) 对于sum2()--8 说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(8)-->O(1) 对于sum2()--4 说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(2)-->O(1) 空间与时间的策略 多数情况下,算法执行时所用的时间更令人关注 如果有必要,可以通过增加空间复杂度来降低时间复杂度 同理,也可以通过增加时间复杂度来降低空间复杂度 */ int main() { printf("%d\n", sum1(100)); printf("%d\n", sum2(100)); printf("%d\n", sum3(100)); return 0; }
标签:
原文地址:http://www.cnblogs.com/zhanggaofeng/p/5672851.html