十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
数据结构着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不关心具体的数据项内容
冀州网站建设公司成都创新互联公司,冀州网站设计制作,有大型网站制作公司丰富经验。已为冀州上千提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的冀州做网站的公司定做!
定义:各个元素同属于一个集合,别无其他关系;
定义:
树形结构(一对多)——>第四章
图状结构(多对多)——>第五章
定义:针对于某种逻辑结构,结合实际需求,定义基本运算
基本运算:
总结:
程序 = 数据结构 + 算法
算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作;
事前预估算法时间开销T(n)与问题规模n的关系(T表示“time”)
例题:
// 算法1—— 逐步递增型爱你
void loveYou(int n) { //n 为问题规模
(1) int i=1; // 爱你的程度
(2) while(i<=n) {
(3) i++; // 每次+1
(4) printf("I Love You %d\n", i);
}
(5) printf("I Love You More Than %d\n", n);
}
int main(){
loveYou(3000);
}
语句频度
(1) ——1次
(2) ——3001次
(3)(4) ——3000次
(5) ——1次
T(3000) = 1 + 3001 + 2 * 3000 + 1
时间开销与问题规模n的关系:
T(n)=3n+3 只关注复杂度的数量级 ——> T(n) = O(n)
复杂度大小优先级排序:
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
口诀:常对幂指阶
例题:
// 算法1—— 嵌套循环型爱你
void loveYou(int n) { //n 为问题规模
(1) int i=1; // 爱你的程度
(2) while(i<=n) {
(3) i++; // 每次+1
(4) printf("I Love You %d\n", i);
(5) for (int j=1; j<=n; j++){
(6) printf("I am a man!\n") ;
}
}
(7) printf("I Love You More Than %d\n", n);
}
int main(){
loveYou(3000);
}
时间开销与问题规模n的关系:
T(n) = O(n) + O(n2) = O(n2)
例题:
// 算法3——指数增长型爱你
void loveYou(int n) {
int i=1;
while(i<=n0){
i=i*2; // 第一次循环 i=2;第二次循环 i=4;第三次循环 i=8......
printf("I Love You %d\n",i);
}
printf("I Love You More Than %d\n",n);
}
通过上述循环可知 i = 2x
所以想要退出while循环,x = log2n + 1
所以上述算法的时间复杂度为T(n) = O(x) = O(log2n)
空间开销S(n)与问题规模n的关系(S表示“Space”)
例题:
// 算法1——逐步递增型爱你
void loveYou(int n) {
int i=1;
while(i<=n){
i++;
printf("I Love You %d\n",i);
}
printf("I Love You More Than %d\n",n);
}
转入内存 程序代码 数据
综上所述,上述算法的空间复杂度为:S(n)=O(1)
算法原地工作——算法所需内存空间为常量;
函数递归调用带来的内存开销:
// 算法5——递归型爱你
void loveYou(int n) {
int a,b,c;
if (n > 1) {
loveYou(n-1);
}
printf("I Love You %d\n",n);
}
int main() {
loveYou(5);
}
上述代码的空间复杂度为:S(n)=O(n) O(n)空间复杂度 = 递归调用的深度
线性表是具有相同数据类型的n(n>=0)个数据元素的有限 序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表现为:
L = (a1, a2, ... , ai, ai+1, ... , an) 脚标从1开始计数
InitList(&L): //初始化表。构造一个空的线性表L,分配内存空间;
DestroyList(&L): //销毁操作。销毁线性表,并释放线性表L所占用的内存空间;
ListInsert(&L,i,e): //插入操作。在表L中的第i个位置上插入指定元素e;
ListDelete(&L,i,&e): //删除操作,删除表L中第i个位置的元素,并用e返回删除元素的值;
LocateElem(L,e): //按值查找操作。在表L中查找具有给定关键字的元素;
GetElem(L,i): //按位查找操作。获取表L中第i个位置的元素的值;
Tips:
用顺序存储 的方式实现线性表的顺序存储;把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现;
如何知道一个数据元素大小?
C语言 sizeof(ElemType)
sizeof(int) = 4B
sizeof(Customer) = 8B
#define MaxSize 10 //定义最大长度
typedef struct {
ElemType data[MaxSize]; //用静态的“数组”存放数据元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义(静态分配方式)
//基本操作---初始化一个顺序表
void InitList(SqList &L){
for(int i=0; i
#define InitSize 10 //顺序表的初始长度
typedef struct {
ElemType *data; //指针动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义(动态分配方式)
key:动态申请和释放内存空间
malloc 和 free 函数:
L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
//malloc函数申请一整片连续空间
#define InitSize 10 //顺序表的初始长度
typedef struct {
ElemType *data; //指针动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SqList;
void InitList(SeqList &L){
//用malloc函数申请一片连续的存储空间
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize = InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L, int len){
int *p=L.data;
L.data=(int *)malloc((L.MaxSize + len)* sizeof(int));
for(int i=0;i