分析时间复杂度及空间复杂度
2018-03-24 20:22
375 查看
时间复杂度:
时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数。在实际中通常关注的是算法的最坏运行情况,一般用O( )来表示。
时间复杂度的书写规则:
1.常数项都用O(1)表示
2.以算法的最坏运行情况来表示其时间复杂度
3.递归的时间复杂度=递归总次数*每次递归中基本操作所执行的次数
空间复杂度:
函数中创建对象的个数关于问题规模函数表达式,一般情况下用O的渐进表示法表示。
空间复杂度的书写规则:
1.常数项都用O(1)表示
2.递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间
以二分查找和斐波那契数的递归和非递归算法为例
实现二分查找算法的递归及非递归并分析时间复杂度及空间复杂度
实现斐波那契数列的递归及非递归并分析时间复杂度及空间复杂度
尾递归:
递归就是一个函数自己调用自己来完成某种功能,但是在使用递归时,必须给一个明确的递归结束条件,即递归出口,否则函数会一直调用自己,直到栈溢出。且递归次数过多,效率会很低。
而尾递归就是如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数。在实际中通常关注的是算法的最坏运行情况,一般用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; }
尾递归:
递归就是一个函数自己调用自己来完成某种功能,但是在使用递归时,必须给一个明确的递归结束条件,即递归出口,否则函数会一直调用自己,直到栈溢出。且递归次数过多,效率会很低。
而尾递归就是如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
相关文章推荐
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 时间复杂度和空间复杂度的分析
- 时间复杂度和空间复杂度分析
- 时间复杂度和空间复杂度的分析
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 以斐波那契数列为例分析递归算法的时间复杂度和空间复杂度
- 算法时间复杂度与空间复杂度分析
- 七种排序方法(稳定性、空间复杂度、时间复杂度)分析总结
- 二分查找算法,斐波那契数列的递归及非递归。(分析时间复杂度及空间复杂度)
- 数据挖掘算法的空间复杂度与时间复杂度分析
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 时间复杂度和空间复杂度
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)
- 时间复杂度和空间复杂度[数据结构]
- 时间复杂度和空间复杂度
- 在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
- 利用Clion对几种排序算法进行时间复杂度与空间复杂度的分析
- 算法第一弹:时间复杂度和空间复杂度