数据结构初阶(顺序表)
创始人
2025-05-30 22:59:07
0

文章目录

  • 1、时间复杂度
    • 1.2、大O渐进表示法
    • 1.3、递归算法时间复杂度计算
  • 2、空间复杂度
  • 3、顺序表
    • 1、概念
    • 2、静态顺序表
    • 3、动态顺序表
      • 1、创建结构体(头文件中创建)
      • 2、销毁链表
      • 3、初始化结构体
      • 4、打印函数
      • 5、内存扩容
      • 6、顺序表任意位置插入数据
      • 7、顺序表任意位置删除数据

1、时间复杂度

1.2、大O渐进表示法

大O符号:(big O notation)是用于描述函数渐进行为的数学符号

推导大O阶的方法:
1、用常数 1 取代运行时间中所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高阶项存在且不是 1,则去除这个项相乘的常数,得到的结果就是大O阶

1.3、递归算法时间复杂度计算

1、每次函数调用时间是O( 1 ) 那么就看他的递归次数
2、每次函数调用时间不是O( 1 ) 那么就看他递归调用次数中的累加

2、空间复杂度

1、空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用储存空间大小的度量
2、空间复杂度计算的是变量的个数
3、空间复杂度的计算规则和时间复杂度类似,也用大O渐进表示法
注:函数运行时所需的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间就已经确定好了,因此空间复杂度主要由函数在运行时候显示申请的额外空间来确定

3、顺序表

1、概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。(顺序表和数组的差别在于,顺序表要求数据要从0开始,依次连续的存储)

2、静态顺序表

直接利用宏定义将顺序表的所需的空间开辟出来,但是这样做有两个问题。
1、开小了空间不够用
2、开大了空间存在浪费
在这里插入图片描述

3、动态顺序表

优点:
连续物理空间,方便下标随机访问。

缺点:
1、插入数据,空间不足时需要扩容,扩容操作有性能消耗
2、头部或中间位置插入删除数据,需要进行挪动数据操作,效率较低
3、可能存在一定程度上的空间浪费,不能按需申请和释放空间

1、创建结构体(头文件中创建)

typedef int SLDataType;
//动态顺序表
typedef struct SeqList
{SLDataType* a;//指向动态开辟的数组int size;//记录存储多少个值int capacity;//存储空间大小
}SL,SeqList;//将struct SeqList定义成 SL 或者 SeqList

2、销毁链表

void SeqListDestroy(SeqList* psl)
{assert(psl);//断言不为空free(psl->a);psl->a = NULL;psl->capacity = psl->size = 0;
}

3、初始化结构体

void SeqListInit(SeqList* psl)
{assert(psl);//断言的作用,让结构体指针不为空psl->a = NULL;//将指针初始化为空指针psl->size = 0;//size记录结构体存储数据个数psl->capacity = 0;//capacity记录结构体开辟的空间大小
}

4、打印函数

void SeqListPrint(SeqList* psl)//测试代码时候需要用上打印函数
{assert(psl);//断言结构体不为空for (int i = 0; i < psl->size; ++i){printf("%d", psl->a[i]);}printf("\n");
}

5、内存扩容

void SeqListCheckCapacity(SeqList* psl)
{assert(psl);// 如果满了,我们要扩容if (psl->size == psl->capacity){size_t newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;//问号表达式进行条件判断,如果内存为0就扩容4,如果有内存就扩大两倍SLDataType* tmp = realloc(psl->a, sizeof(SLDataType)*newCapacity);if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{psl->a = tmp;psl->capacity = newCapacity;}}
}

6、顺序表任意位置插入数据

void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{// 暴力检查方法assert(psl);// 温和检查方法if (pos > psl->size){printf("pos 越界:%d\n", pos);return;//exit(-1);}SeqListCheckCapacity(psl);size_t end = psl->size;while (end > pos){psl->a[end] = psl->a[end-1];--end;}psl->a[pos] = x;psl->size++;
}

7、顺序表任意位置删除数据

void SeqListErase(SeqList* psl, size_t pos)
{assert(psl);assert(pos < psl->size);size_t begin = pos + 1;while (begin < psl->size){psl->a[begin - 1] = psl->a[begin];++begin;}psl->size--;
}int SeqListFind(SeqList* psl, SLDataType x)
{assert(psl);for (int i = 0; i < psl->size; ++i){if (psl->a[i] == x){return i;}}return -1;
}

相关内容

热门资讯

ReentrantLock 源... 前言 注:本文的源码来自 JDK11 ReentrantLock 是 Java 中的一...
各类考试考场励志标语大全:高考...   各类考试考场励志标语大全:高考激励标语  ● 我要我就能。  ● 累是催化剂!  ● 有志者事竞...
川陕革命根据地的红军石刻标语盘...   川陕革命根据地的红军石刻标语内容朴素而深刻。有拥护马克思列宁主义和中国共产党的,有拥护中国工农红...
《公路安全保护条例》宣传标语口...   《公路安全保护条例》宣传标语口号大全:  ●公路损坏 百业受害  ●平安公路 和谐社会  ●...
单位施工工地标语大全 施工工地...   单位施工工地标语大全:  ● 爱岗敬业——奉献求实  ● 与时俱进——再创辉煌  ● 遵守职责—...
数码产品MP3MP4市场宣传标...   房地产的夸大宣传是众所周知的,什么上风上水,俯瞰全城,拥抱健康,其实就是在山上挖个水池子,旁边有...
git查漏补缺之cherry-... Start 昨天的博客学习了 git 中的 stash 命令,今天再来学习一个命令&#...
【机器学习算法复现】决策树,树... 决策树 决策树学习使用决策树(作为预测模型)从关于项目(...
企业办公室宣传标语精选 办公室...   企业办公室宣传标语精选:  做人原则:【己所不欲 勿施于人】  发展根本:【让每个学员 都把英文...
消防安全标语大全:企业、小区等...   消防安全标语大全:企业、小区等消防安全标语  ● 家家防火,户户平安。  ● 消防工作,人人有责...
关于企业产品品质与质量的宣传标...   关于企业产品品质与质量的宣传标语大全:  ● 品质——成功之轮。  ● 优质产品,丰厚成果。  ...
关于企业市场营销、经营销售的标...   关于企业市场营销、经营销售的标语大全:  ● 服务从心开始。  ● 品质第一,顾客至上。  ● ...
公司、企业会议室常用标语、文明...   公司、企业会议室常用标语、文明标语:  ● 有争论才有高论。  ● 上下沟通达共识。  ● 言必...
网络基础知识和常用命令 IP、子网掩码、网关、DNS、端口号网络的基本概念客户端:应用 C/S(客户端/服务器...
Android图片加载【神器】... Coil是Android平台上又一个开源的图片加载库,尽管Android平台已经有诸如...
矿藏企业(煤矿、金矿等)安全生...   矿藏企业(煤矿、金矿等)安全生产警示标语大全:  ● 平安是福。  ● 违章不是好丈夫。  ● ...
煤矿企业、矿区安全生产警示、宣...   煤矿企业、矿区安全生产警示、宣传标语大全:  ● 安全伴您一生。  ● 心怀安全,幸福常伴。  ...
销售、推销、营销行业激励员工的...   销售、推销、营销行业激励员工的标语大全:  ● 当额外的工作分配到你头上时,不妨视之为一种机遇。...
汝州市第六次党员代表大会宣传标...   汝州市第六次代表大会宣传标语:  ● 加快经济发展,服务汝州人民!  ● 建设富裕文明、平安和谐...
爱护公物标语大全:爱护花草树木...   爱护公物标语大全:爱护花草树木等标语  ● 手下留情,脚下留青。  ● 爱护公物,人人有责!  ...