时间复杂度
在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。算法存在最坏(最大运行次数上届)、平均(期望运行次数)和最好(最小运行次数)情况。使用O渐进表示法来计算算法的时间复杂度。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
空间复杂度
一个算法的 空间复杂度(SpaceComplexity)S(n)定义为该算法所耗费的 存储空间,它也是问题规模n的函数。
一个算法在计算机 存储器上所占用的 存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的 存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的 存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。
二分查找
//二分查找非递归
#include <stdio.h>
int main ()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof (arr)/sizeof(arr[1]);
int key = 7;
int mid = left+(right-left)/2;
while (left<=right)
{
if (arr[mid]==key)
{
printf("找到关键数字:%d/n",key);
}
else if (arr[mid]<key)
{
left = mid+1;
}
else if (arr[mid]>key)
{
right = mid-1;
}
}
return 0;
}
//二分查找递归
int bin_search(int* arr, int left, int right, int num)
{
assert(arr);
int mid = 0;
while (left <= right)
{
mid = (left + right)/2;
if (num == *(arr+mid))
{
return mid;
}
else if (num < *(arr+mid))
{
return(bin_search(arr,left,mid,num));
}
else
{
return(bin_search(arr,mid,right,num));
}
}
return NULL;
}
递归算法时间复杂度=递归总次数*每次递归次数`
关于尾递归
尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积。
在Java等命令式语言中,尾递归使用非常少见,因为我们可以直接用循环解决。而在函数式语言中,尾递归却是一种神器,要实现循环就靠它了。