您的位置:首页 > 其它

分析时间复杂度及空间复杂度

2018-03-24 20:22 375 查看
时间复杂度:

时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数。在实际中通常关注的是算法的最坏运行情况,一般用O( )来表示。

时间复杂度的书写规则:

1.常数项都用O(1)表示

2.以算法的最坏运行情况来表示其时间复杂度

3.递归的时间复杂度=递归总次数*每次递归中基本操作所执行的次数

空间复杂度:

函数中创建对象的个数关于问题规模函数表达式,一般情况下用O的渐进表示法表示。

空间复杂度的书写规则:

1.常数项都用O(1)表示

2.递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间

以二分查找和斐波那契数的递归和非递归算法为例

实现二分查找算法的递归及非递归并分析时间复杂度及空间复杂度

#include<stdio.h>

**非递归二分查找时间复杂度O(log2n) 空间复杂度O(1)**
int BinarySearch1(int* a, int sz, int data)
{
int left = 0;
int right = sz - 1;
int mid = 0;
while (left <= right)
{
//mid = (left + right) / 2; 不用这个,有可能会溢出
int mid = left + ((right - left) >> 1);
if (data == a[mid])
{
return mid;
}
else if (data < a[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}

**递归二分法查找    时间复杂度O(log2n) 空间复杂度O(log2n)**
int BinarySearch2(int* a, int left, int right, int data)
{
// 不用int mid = (left + right) / 2;
i int mid = left + ((right - left) >> 1);
int index = 0;
if (data == a[mid])
return mid;
if (left > right)
return -1;
if (data < a[mid])
index = BinarySearch2(a, left, mid - 1, data);
else
index = BinarySearch2(a, mid + 1,right, data);
return index;
}

int main()
{
int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
int sz = sizeof(a) / sizeof(a[0]);
int index1 = BinarySearch1(a, sz, 3);
int index2 = BinarySearch2(a, 0, sz - 1, 13);
printf("%d\n%d\n", index1, index2);
system("pause");
return 0;
}


实现斐波那契数列的递归及非递归并分析时间复杂度及空间复杂度

#pragma warning (disable:4996)
#include<stdio.h>

**递归实现菲波那切数列 时间复杂度O(2^n) 空间复杂度O(n)**
int fib(int n)
{
if (n <= 2)
return 1;
else
{
return fib(n - 1) + fib(n - 2);
}
}

非递归实现菲波那切数列  时间复杂度O(n) 空间复杂度O(1)
int fib(int n)
{
int result;
int pre_result;
int next_older_result;
result = pre_result = 1;
while (n > 2)
{
n -= 1;
next_older_result = pre_result;
pre_result = result;
result = pre_result + next_older_result;
}
return result;
}

int main()
{
int n = 0;
printf("请输入:");
scanf("%d", &n);
printf("%d\n", fib(n));
system("pause");
return 0;
}


尾递归:

递归就是一个函数自己调用自己来完成某种功能,但是在使用递归时,必须给一个明确的递归结束条件,即递归出口,否则函数会一直调用自己,直到栈溢出。且递归次数过多,效率会很低。

而尾递归就是如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐