数据结构入门——时间复杂度和空间复杂度
2017-12-09 07:53
585 查看
> 1. 时间复杂度:
时间复杂度实际上就是一个函数,计算程序执行的总次数(不是计算时间,是计算语句执行次数);** 在进行时间复杂度计算时要注意:1)在实际中通常考虑的是算法运行的最坏情况;
2)关注运行时间的增长趋势,关注增长最快的项即可,其他可进行忽略
比如:F(n)=8*n^2+9*n+9;其时间复杂度为O(n^2);
3)递归算法的时间复杂度计算:递归总次数*每次递归操作数
2、空间复杂度
它是对一个算法在运行过程中临时占用存储空间大小的量度,强调的是使用辅助空间的大小,不是所有的数据所占用的空间,不会一直累加。(计算的不是空间,而是函数中创建的对象的个数) 递归算法的空间复杂度:
递归总次数为n*每次递归的辅助空间大小。若每次递归的辅助空间大小为常数, 则其空间复杂度为O(n)
咱们用以下实例来分析以下时间复杂度与空间复杂度**
折半查找—–非递归
#include<stdio.h> #include<stdlib.h> int BinarySearch(int arr[],int sz,int n) { int left=0; int right=sz-1; while(left<=right) { int mid=left+((right-left)>>1); if(arr[mid]>n) { right=right-1; } else if(arr[mid]<n) { left=left+1; } else { return mid; } } return -1; } int main() { int arr[]={1,2,3,4,5,6,7,8,9}; int sz=sizeof(arr)/sizeof(arr[0]); printf("%d\n", BinarySearch(arr,sz,1)); printf("%d\n", BinarySearch(arr,sz,2)); printf("%d\n", BinarySearch(arr,sz,3)); printf("%d\n", BinarySearch(arr,sz,4)); printf("%d\n", BinarySearch(arr,sz,5)); printf("%d\n", BinarySearch(arr,sz,6)); printf("%d\n", BinarySearch(arr,sz,7)); printf("%d\n", BinarySearch(arr,sz,8)); printf("%d\n", BinarySearch(arr,sz,9)); system("pause"); return 0; } 时间复杂度:O(log2 N)//每次查找缩小一半范围,即每次运行的次数为log2 N所以不难算出时间复杂度为----->O(log2 N) 空间复杂度:O(1) 创建的对象为常数个
折半查找——-递归
#include<stdio.h> #include<stdlib.h> int BinarySearch(int arr[],int left,int right,int n) { int mid=left+((right-left)>>1); while(left<=right) { if(arr[mid]==n) { return mid; } else if(arr[mid]>n) { return BinarySearch(arr,left,mid-1,n); } else if(arr[mid]<n) { return BinarySearch(arr,mid+1,right,n); } } return -1; } int main() { int arr[]={1,2,3,4,5,6,7,8,9}; int left=0; int sz=sizeof(arr)/sizeof(arr[0]); int right=sz-1; printf("%d\n", BinarySearch(arr,left,right,1)); printf("%d\n", BinarySearch(arr,left,right,2)); printf("%d\n", BinarySearch(arr,left,right,3)); printf("%d\n", BinarySearch(arr,left,right,4)); printf("%d\n", BinarySearch(arr,left,right,5)); printf("%d\n", BinarySearch(arr,left,right,6)); printf("%d\n", BinarySearch(arr,left,right,7)); printf("%d\n", BinarySearch(arr,left,right,8)); printf("%d\n", BinarySearch(arr,left,right,9)); system("pause"); return 0; } 时间复杂度:递归总次数log2 N,每次执行的时间复杂度为O(1)------>O(log2 N) 空间复杂度:递归总次数log2 N,每次创建的对象都是常数个--------->O(log2 N)
斐波那锲数——-非递归
int fib(int n)//1 1 2 3 5 8 13 { int first=1; int second=1; int sum=0; if(n<3) { return 1; } while(n>2) { sum=first+second; first=second; second=sum; n--; } return sum; } 时间复杂度:O(N)---程序运行n次 空间复杂度:O(1)---创建的对象为常数个
斐波那锲数—递归
long long fib(int n) { if(n<3) return 1; else return fib(n-1)+fib(n-2); } 每一次的计算都被分成前两个数之和,依次往下递归,类似于二叉树 当n较大时,形成一个满二叉树 时间复杂度:O(2^n) 空间复杂度:O(n)
相关文章推荐
- 数据结构2:算法时间复杂度和空间复杂度的计算
- 【数据结构】-时间复杂度和空间复杂度
- 数据结构之时间复杂度和空间复杂服
- 时间复杂度和空间复杂度2 - 数据结构和算法04
- 时间复杂度和空间复杂度2 - 数据结构和算法04
- 数据结构-算法效率的度量-时间复杂度和空间复杂度
- 数据结构与算法2——时间复杂度和空间复杂度
- 数据结构_时间复杂度和空间复杂度
- 数据结构和算法-时间复杂度和空间复杂度
- 数据结构--算法(时间复杂度和空间复杂度)
- 数据结构和算法学习02-时间复杂度和空间复杂度
- 时间复杂度和空间复杂度详解
- 查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 算法第一弹:时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度详解
- 时间复杂度和空间复杂度的简单记录
- 时间复杂度和空间复杂度详解
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字