【数据结构与算法C语言版】笔记 持续更新ing!
by:weixiao
一、关于抽象数据类型(ADT)
ADT的形式
ADT 抽象数据类型名{
Data
数据对象的定义
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
...
操作n
...
}ADT 抽象数据类型名
使用ADT实现复数
typedef struct{
float realpart; //实部
float imagpart;
}Complex
/*定义*/
void assign(Complex *A,float real,float imag);
void add(Complex *A,float real,float imag);
void minus(Complex *A,float real,float imag);
void multipy(Complex *A,float real,float imag);
void divide(Complex *A,float real,float imag);
/*使用*/
void assign(Complex *A,float real,float imag)//赋值函数
{
A->realpart=real; //相当于把real值赋值给结构体指针A中的realpart
A->imagpart=imag; //相当于把imag值赋值给结构体指针A中的imagpart
}
/*进行加减乘除操作*/
直接使用C语言惯例写add、minus、multipy、divide的操作函数,再在main函数中写入实参调用。
二、关于时间复杂度T(n)=O(f(n))
在算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间复杂度记作:T(n)=O(f(n))
n越大算法的执行时间越长
排序:n为记录数
矩阵:n为矩阵的阶数
多项式:n为多项式的项数
集合:n为元素个数
数:n为数的结点个数
图:n为图的顶点数或边数
1.时间复杂度分类
算法完成工作最少需要多长操作叫做最优时间复杂度
算法完成工作最多需要多长操作叫做最坏时间复杂度
算法完成工作平均需要多少操作叫做平均时间复杂度
2.平方时间复杂度O( n 2 n^2 n2)
int x,y;
x=0;
y=0;
for(int i=1;i<=n;i++)
{
x++;
}
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
y++;
}
}
在寻找时间复杂度是要依照最大的原则,即应该看y++这行的时间复杂度,而y++这行是由两个for循环完成的,因此这个程序的时间复杂度表示为:O( n 2 n^2 n2)。
3.立方时间复杂度O( n 3 n^3 n3)
int x=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
x++;
}
}
}
由三个for循环组成,该时间复杂度为O( n 3 n^3 n3)
4.对数时间复杂度O( l o g 2 n log2^n log2n)
int x=0;
for(int i=1;i<=n;i*=2)
{
x++;
}
由于 2 f ( n ) 2^f(n) 2f(n)<=n,因此f(n)<= l o g 2 n log2^n log2n即T(n)=O( l o g 2 n log2^n log2n)。
并不是所有的时间复杂度都用n来表示
比如:
int x=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
x++;
}
}
他的时间复杂度就为O(m*n)。