01-基础篇
编程语言基础
变量类型-指针
int *p=&a;//指针p存储了a的地址
int b=*p;//取得指针p所指变量中的值
NULL 不指向任何地址的特殊标记,值为0,初始化指针常用 int *p=NULL;
变量类型-结构体
typedef struct{
int a;
float b;
...
}结构体名;
typedef struct 结构体名{
int a;
float b;
struct 结构体名 *d;
...
}结构体名;
函数
引用型定义
/*调用getResult后result的值变为1*/
int result = 0;
void getResult(int &r)//注意‘&’
{++r;}
调用:getResult(result);
引用型定义-指针
int *p = NULL;
void gerResult(int *&p)//注意‘&’
{
...
P=q;
...
}
调用:getResult(p);
存储结构
顺序结构
顺序存储支持随机存取
链式结构
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
//定义节点
LNode *L;
L=(LNode*)malloc(sizeof(LNode));//为LNode开辟空间并返回地址
A->next=B;//存储B节点的地址到A的next分量中
算法分析基础
时间复杂度-(默认求最坏情况)
T(N)为你的程序真实执行时间图像
cf(N)是最差的程序执行时间走向(时间增长)---反映给boss----有意义的
cg(N)是指最优的程序执行时间走向(时间缩短)----不现实的
T(N)为你的程序真实执行时间图像
因为T(N)已经很难找所以ch(N)很难找
O(N)表示法:
给了一个粗略上界但不一定是最小上界
包含:
1.Θ表示法
2.o表示法
简化问题
把(加减乘除、比较和赋值)都视作耗时相同的运算。
控制语句函数时间复杂度分析
普遍方法计算时间复杂度
int f(int N){
int i,sum;
sum=0; //执行一次
for(i=0;i<N;++i) //(i=0执行一次,i<N执行N+1次,++i执行N次)=2N+2次
{
sum +=i*i*i; //(2乘1加1赋值)循环N次=4N次
}
return sum; //执行一次
}
总共6N+4次;
则时间复杂度为O(N);
简便方法总结
-
一次循环运行时间=循环内语句的运行时间*循环次数;
-
嵌套式循环运行时间=最内层语句执行次数*总循环次数;
for(int i=0;i<N;++i){ for(int j=0;j<N;++j){ ++sum; } } 时间复杂度O(N*N)
-
并列的两个循环运行时间与执行次数数量级大的那个相同
for(int i=0;i<N;++i){ for(int j=0;j<N;++j){ ++sum; } } for(int i=0;i<N;++i){ ++sum; } 时间复杂度O(N*N)
递归函数时间复杂度分析
void mergeSort(int arr[],int low,int high){
if(low<high){
int mid = (low+high)/2;
mergeSort(arr,low,mid); //low~mid近似于(low+high)/2
mergeSort(arr,mid+1,high); //mid+1~high近似于(low+high)/2
merge(arr,low,mid,high);
}
}
普通方法
设mergeSort时间复杂度为T(n)
简便方法
f(n)代表除递归函数之外的语句执行次数