一、何为算法。
算法是解决问题的方法与步骤,一般通过考虑算法的时间复杂度和空间复杂度来判断一个算法的优秀度。
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] ;