#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个不同函数。
算法复杂度的表示
最新推荐文章于 2024-04-14 13:18:06 发布