【 时间复杂度 &空间复杂度 & 折半查找/二分查找 & 斐波拉系数列】

【 时间复杂度 &空间复杂度 & 折半查找/二分查找 & 斐波拉系数列】

文章目录

  • 【 时间复杂度 &空间复杂度 & 折半查找/二分查找 & 斐波拉系数列】
  • 前言
  • 一、时间复杂度 &空间复杂度
    • 1. 时间复杂度
    • 2.空间复杂度:
  • 二、斐波拉系数列 [递归实现 与 非递归实现 ]:
  • 三、折半查找/二分查找


前言

介绍时间复杂度、空间复杂度、折半查找/二分查找算法、 斐波拉系数列(递归和非递归实现)


一、时间复杂度 &空间复杂度

1. 时间复杂度

(1)时间复杂度:算法当中 语句总的执行次数关于问题规模函数 (访问元素个数)

  • (先定位问题规模, 平均访问元素的个数)

      数组Len 1+2+3+...+n   查找数据 1~len
      eg. 1 2 3 4 5 6  =>    O(n)
      共有n个元素  平均找某个元素的次数
      平均:(1+2+3+4+....+n)/n=(1+n)/2  => O(n)
    
  • O(f(n)) f(n)语句总的执行次数关于问题规模n的函数

(2)效率最高->效率最低:
O(1) > O(logn) > O(n) > O(nlogn) > O(n^2)

2.空间复杂度:

  • 额外开辟的内存空间 跟问题规模相关的空间

二、斐波拉系数列 [递归实现 与 非递归实现 ]:

(1)兔子繁殖
(2)青蛙跳台阶

1 1 2 3 5 8 11 19
斐波拉系数列项的值(非递归)
兔子繁殖 幼年兔子数量 青年兔子 成年兔子 总数


#include

//递归调用
int Data_Sum(int n)
{
	int F0 = 0, F1 = 1;
	if (n == 0)
		return F0;
	if (n == 1)
		return F1;

	return Data_Sum(n - 1) + Data_Sum(n - 2);
}

//斐波拉系数列项的值(非递归
int Data_Sum_Two(int n)
{
	int F0 = 0, F1 = 1,sum=1;
	if (n == 0)
		return F0;
	else if (n == 1)
		return F1;
	else
	{
		for (int i=0; i<n-1; i++)
		{
			sum= F0+F1;
			F0 = F1;
			F1 = sum;
		}
	}
	return sum;
}

int main()
{
	int t;
	printf("求斐波拉系数列:n= ");
	scanf_s("%d", &t);
	int sum1=Data_Sum(t);
	int sum2 = Data_Sum_Two(t);
	printf("\n递归算法 %d:sum= %d",t, sum1);
	printf("\n非递归算法 %d :sum= %d", t,sum2);
}


三、折半查找/二分查找

时间复杂度O(n^2)  空间复杂度O(1):
#include

//折半查找/二分查找 时间复杂度O(n^2)  空间复杂度O(1)
int BinarySearch(int* arr, int len, int val)
{
	int right = len - 1, left = 0;		//定义letf=0 right=len-1
	int midindex;		//取区间中间值
 	while(right>=left)
	{
		midindex = (right + left) / 2;
		if (arr[midindex] > val)
			right = midindex - 1;
		else if(arr[midindex] <val)
			left = midindex + 1;
		else 
			return midindex;
	}
	return -1;
}

int main()
{
	int a[6] = {0,1,2,3,4,5};
	int len = sizeof(a) / sizeof(a[0]);
	int num=BinarySearch(a, len, 5);
	if (num != -1)
		printf("下标为%d\n\n", num);
	else
		printf("不存在该数");
}


你可能感兴趣的:(算法,开发语言,c语言,笔记)