简述时间复杂度和空间复杂度

时间复杂度

一段代码、一个程序、一个算法运行所需要的大概时间

这里举几个简单例子

for (i = 0; i < N; ++i) //时间复杂度为O(N),比如在无序的数组中找某个元素的函数
//
for (i = 0; i < N; ++i)
//
for (j = 0; j < N; ++j) //时间复杂度为O(N²),比如冒泡排序函数
//

空间复杂度

一个程序的空间复杂度是指运行完一个程序所需内存的大小简单说来就是计算当前程序同时最多能创建多少变量

斐波那契数列

什么是斐波那契数列

递归版本
long long Fib(size_t N)
{
return N>2 ? Fib(N - 1) + Fib(N - 2):N;
}
//时间复杂度为0(2^N)
//空间复杂度为O(N)

这里函数调用类似一个二叉树

函数调用这里大概有100层每一个函数都要往下递归调用,所以时间复杂度为O(2^N),空间复杂度为O(N)。

非递归版本
long long FibNoRe(size_t N)
{
if (N < 2)
return N;
else
{
long long first = 0, second = 1, ret = 0;
for (size_t i = 2; i <= N + 1; ++i)
{
ret = first + second;
first = second;
second = ret;
}
return ret;
}
}

这里时间复杂度0(N)空间复杂度O(1)

冒泡排序

冒泡排序

void BubbleSort(int* arr, size_t sz)
{
assert(arr != NULL);
for (size_t i = 0; i < sz; i++)
{
int flag = 0;
for (size_t j = 0; j < sz -1 - i; j++)
{
if (arr[j] > arr[j+1])
{
swap(arr[j],arr[j+1]);
flag ++;
}
}
if (0 == flag)
{
return;
}
}
}

时间复杂度为O(N²),空间复杂度为O(1)

折半查找

所查找序列必须为`有序``

递归版本
bool BinSearch(int* arr,size_t left, size_t right, int key)
{
assert(NULL != arr);
int mid = (left + right) / 2;
if (arr[mid] == key){
return true;
}
else if (right <= left)
{
return false;
}
else if (arr[mid] > key)
{
if (key == arr[left])
{
return true;
}
right = mid - 1;
BinSearch(arr,left,right,key);
}
else if (arr[mid] < key)
{
if (key == arr[right])
{
return true;
}
left = mid + 1 ;
BinSearch(arr,left,right,key);
}
}

时间复杂度为O(lgN),空间复杂度0(N)

非递归版本
bool BinSearchNoRe(int* arr,size_t left, size_t right, int key)
{
assert(NULL != arr);
while (right > left)
{
int mid = (right + left) >> 1;
if (key == arr[mid])
{
return true;
}
else if (key > arr[mid])
{
if (key == arr[right])
return true;
left = mid + 1;
}
else if (key < arr[mid])
{
if (key == arr[left])
return true;
right = mid - 1;
}
}
return false;
}

时间复杂度为O(lgN),空间复杂度0(1) 
如有疑问和建议请发送到blbagony@163.com;感谢观看

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值