算法复杂度的表示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//算法是为了节省时间
//评判算法好坏看的是基本运算计算的次数,而不是计算时间。
//因为在不同机器上运算时间会有所不同,如八核处理器与四核。
//计算算法复杂度可以用一个函数公式表示(自己根据算法定义)
//如下:
void fun(int n)
{
	int a = 0;
	for (int i = 0; i < n; i++)
	{
		for (int q = 0; q < n; q++)
		{
			a++;
		}
	}
	for (int i = 0; i < 2 * n; i++)
	{
		a++;
	}
	for (int i = 0; i < 10; i++)
	{
		a++;
	}
	printf("%d", a);
}
//这个算法用次数表达式判断时间复杂度大概可以写成:f(x)=x^2+2x+10;
//然后在n||x很大时也可以近似写成f(x)=x^2;
/*******************************************/
//O(n)表示算法复杂度,有O(1), O(n), O(logn), O(nlogn)等几种
//方法:把复杂度表达式中常数都看成1如:2n=n,5n=n,3=1,3*n^2=n^2
//然后只看最高次项,把其他影响小的项去掉。如:f(x)=x^2+2x+10可以写成O(n^2);
/*******************************************/
//通常算法有最好|最坏的情况(恰好一次成功,和计算最多次),计算复杂度通常是悲观的按最差的情况来。
//计算算法复杂度看的是他的思想不能只看循环了几次
//如:
int search(int nums[], int size, int target) //nums是数组,size是数组的大小,target是需要查找的值
{
	int left = 0;
	int right = size - 1;	// 定义了target在左闭右闭的区间内,[left, right]
	while (left <= right) {	//当left == right时,区间[left, right]仍然有效
		int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
		if (nums[middle] > target) {
			right = middle - 1;	//target在左区间,所以[left, middle - 1]
		}
		else if (nums[middle] < target) {
			left = middle + 1;	//target在右区间,所以[middle + 1, right]
		}
		else {	//既不在左边,也不在右边,那就是找到答案了
			return middle;
		}
	}
	//没有找到目标值
	return -1;
}
//这个算法复杂度不是O(right)而是O(log以2为底的right的对数)
//递归的算法复杂度
long long fib(size_t N)
{
	if (N < 3)
		return 1;
	return fib(N - 1) + fib(N - 2);
}
//复杂度是调用函数次数
//答案是:O(2^N);
/******************************/
//空间是可以重复利用,不累计的。时间是一去不复返,累计的。
/******************************/
//空间复杂度
//一个数学表达式,对一个算法运行过程中临时所占储存空间大小的度量
//空间复杂度计算的是变量个数。可以用大O渐进法表示。
//注意:函数运行时所需要的栈空间(储存参数,局部变量,一些寄存器信息什么的)
//这些在编译时期就已经储存好了
//因此空间复杂度主要同过函数在运行时显示申请的空间来决定。
//如
int *fun(int* arr, int len)
{
	int* tmp = (int*)malloc(sizeof(int) * len);
	return tmp;
}
//这个空间复杂度为O(len),额外开辟空间是len,如果len是常数就是O(1)
int fun(size_t n)
{
	if (n < 3)
		return 1;
	return fun(n - 1) + fun(n - 2);
}
//空间复杂度为O(n)
//因为函数用完就销毁了,所以看最多有多少个就行了
//这个斐波那契额数列最多有n个不同的函数,fun(1)到fun(n)就这n个,相同的占用一块空间。
//他的时间复杂度才是O(2^N),计算了这么多次,但是总共才用到上面n个不同函数。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值