算法笔记:时间复杂度、空间复杂度 进制转化 秦九韶算法

一、何为算法。

算法是解决问题的方法与步骤,一般通过考虑算法的时间复杂度空间复杂度来判断一个算法的优秀度。

eg:常见的时间复杂度:O(1) <O(logn)<  O(n) <O(nlogn)<  O(n²)<  O(2ⁿ)<O(n!)

1、时间复杂度:分析算法的执行效率。

int fun(int n)
{
	int i=n;
	int j=3*n;
	return i+j;
}

以上函数只有俩个执行语句,最终结果是个固定的常数,则时间复杂度为O(1)。

int fun(int n)
{
	int i=1;
	while(i<=n)
		i=i*2
	return i;
}

以上函数中while执行了log2(n)次,则时间复杂度为O(logn)。

int fun(int n)
{
	int sum=0;
	for(int i=0;i<n;i++)
	sum+=i;
	return sum;
}

以上函数for执行了n次,则时间复杂度为O(n)。

一般抓取主要的执行语句来判断时间复杂度。

int fun(int n)
{
	int sum=0;
	for(int i=1;i<=m;i++)
	sum+=i;
	for(int i=1;i<=n;i++)
	sum+=i;
	return sum;
}

 以上函数有俩个分别的for循环,则时间复杂度O(m+n)。

int fun(int m,int n)
{
	int sum=0;
	for(int i=0;i<m;i++)
	{
	  for(int j=0;j<n;j++)
	 {
	  sum+=i*j;
	  j=j*2;
	 }
	}
	return sum;
}

有俩个for循环套用,外面的for执行了m次,里面的for执行了log2n次,则时间复杂度为O(mlogn)

int fun(int n)
{
	int sum=0;
	for(int i=0;i<n;i++)
	{
	  for(int j=0;j<n;j++)
	 {
	  sum+=i*j;
	 }
	}
	return sum;
}

两个for都执行了n次,则时间复杂度为O(n²)

计算机一秒可以执行10亿次。

2、空间复杂度:算法所占内存空间。

int fun(int n)
{
	int sum=0;
	for(int i=0;i<n;i++)
	sum+=i;
	return sum;
}

空间复杂度O(1)

int fun(int n)
{
	int arr[N];
	while(i<=N)
	i=i*2
	return i;
}

空间复杂度O(n)

int fun(int m,int n)
{
	int arr[M][N];
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			sum+=arr[i][j];
	return sum;
}

空间复杂度O(MN)

常见的空间复杂度O(1)<O(n)<O(n²)

二、二进制原理和表示方法。

1、二进制原理

 计算机内部采用二进制代码(0和1)存储信息。

   A=10,B=11,C=12,D=13,E=14,F=15

二进制eg:110-1=101. 

十六进制eg:119+2=11B

 

  eg:1A2-13=18F

  2、正整数的二进制、十进制、十六进制的转换

 十进制数转换为N进制数【除基(N)取余、逆序输出】

 eg(11)=(1011)2=(13)8=(B)16

 

 N进制数转换为十进制数【按权展开、逐项相加】 

eg:(1101)B=13 D

 3、小数中的进制转换

十进制小数转换为N进制数【小数部分乘以N,取整数部分直至小数点后为0】

eg:(0.125)D=(0.001)2=(0.02)4=(0.1)8=(0.2)H

 N进制小数数转换为十进制数【位权展开,逐项相加】

eg:(0.101) B=0.625

 4、计算机中整数的表示方法。

 最高位表正负,0表正,1表负
 对于正数,原码 = 反码 = 补码
 对于负数,反码 = 将原码的各位取反(符号位除外);补码等于反码加1

eg:原码:100011   

        反码:1111100

        补码:111101

2的8次方种,每位不是0就是1;最大的是(11111111)2=(255)10;有符号的话就去掉符号位为2的7次方种;n位就是2的n次方种。

#include <stdio.h>
int main()
{
	int i=0,n,a[32];
	scanf("%d",&n);
	while(n>0){
		a[i]=n%2;
		i++;
		n=n/2;
		
	}
	for(int j=i-1;j>=0;j--){
		printf("%d",a[j]);
	}
	return 0;
}

 5、秦九韶算法

作用:减少乘法计算,使算法的时间复杂度降低从而使算法更加优秀。

利用秦九韶算法求一元n次多项式的时间复杂度为O(n)。

秦九韶算法总结:对于一个n次多项式,至多需要做n次乘法和n次加法

算法程序:

ans = s[0];//s[0]保存最高项系数
for(i=1;i<=n;i++) 
ans = ans * x + s[i] ;

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值