您的位置:首页 > 理论基础 > 数据结构算法

数据结构 算法

2016-07-15 10:59 309 查看
#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: