当前位置: 首页 > ai >正文

【数据结构】2-2-2 顺序表的插入删除查找

数据结构知识点合集

  • 知识点

  • 顺序表的插入

ListInsert(&L,i,e)插入操作。在表L中的第i个位置上插入指定元素e。

/*在顺序表L的第i个位置插入元素e*/
bool ListInsert(SqList &L,int i,int e)
{/*判断i的范围是否有效*/if(i<0||i>L.length)return false;/*判断是否有空间能够插入*/if(L.length>=MaxSize)return false;/*将第i个元素及其后面的元素后移*/for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];/*在顺序表的第i个位置插入元素e*/L.data[i-1]=e;/*顺序表的长度加一*/L.length++;/*插入成功,返回true*/return true;
}

顺序表插入操作时间复杂度分析:

最好情况:新元素插入到表尾,不需要移动元素i = n+1,循环0次;最好时间复杂度 = O(1)

 

最坏情况:新元素插入到表头,需要将原有的 n 个元素全都向后移动i = 1,循环 n 次;最坏时间复杂度 = O(n);

 

平均情况:假设新元素插入到任何一个位置的概率相同,即 i = 1,2,3, … , length+1 的概率都是 p = 1/(n+1)

                  i = 1,循环 n 次;i=2 时,循环 n-1 次;i=3,循环 n-2 次 …… i =n+1时,循环0次

                平均循环次数 = np + (n-1)p + (n-2)p + …… + 1⋅p =[n(n+1)/2] * [1/(n+1)] = n/2  平均时间复杂度 = O(n)

  • 顺序表的删除

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

/*将顺序表第i个位置的元素删除,并将删除元素值记录*/
bool ListDelete(SeqList &L,int i,int &e)
{/*判断i的范围是否有效*/if(i<0||i>L.length)return false;/*将被删除的元素赋值给e*/e=L.data[i-1];/*将第i个位置后的元素前移*/for(int j=i;j<L.length;j++)L.data[j-1]=L.data[j];/*顺序表的长度减一*/L.length--;/*删除成功,返回true*/return true;
}

顺序表删除操作时间复杂度分析:

最好情况:删除表尾元素,不需要移动元素i = n,循环0次;最好时间复杂度 = O(1)

 

最坏情况:删除表头元素,需要将原有的 n 个元素全都向前移动;i = 1,循环 n 次;最坏时间复杂度 = O(n);

 

平均情况:假设删除任何一个元素的概率相同,即 i = 1,2,3, … , length+1 的概率都是 p = 1/n

                 i = 1,循环 n-1 次;i=2 时,循环 n-2次;i=3,循环 n-3 次 …… i =n时,循环0次

                平均循环次数 = (n-1)p + (n-2)p + …… + 1⋅p =[n(n-1)/2] * [1/n] = (n-1)/2  平均时间复杂度 = O(n)

  • 顺序表的按位置查找

/*在顺序表L中查找第i个元素并返回其值*/
int GetElemByPosition(SeqList L,int i)
{return L.data[i-1];
}

由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第 i 个元素(随机存取)

时间复杂度:O(1)

  • 顺序表的按值查找

/*在顺序表L中查找值为e的元素并返回其位置*/
int GetElemByValue(SeqList L,int e)
{for(int i=0;i<L.length;i++){if(L.data[i]==e)return i+1;}/*查找失败,返回0*/return 0;
}

最好情况:目标元素在表头循环1次;最好时间复杂度 = O(1)

 

最坏情况:目标元素在表尾;循环 n 次;最坏时间复杂度 = O(n);

 

平均情况:假设目标元素出现在任何一个位置的概率相同,都是 1/n;目标元素在第1位,循环1次;在第2位,循环2

                次;…… ;在第 n 位,循环 n 次;平均循环 次数=(1+2+3+…+n)*(1/n)=(n+1)/2;平均时间复杂度 = O(n)

http://www.xdnf.cn/news/7103.html

相关文章:

  • 类魔方 :多变组合,灵活复用
  • 生命之树--树形dp
  • 采用DHCP动态分配IP地址,如果某主机开机后没有得到DHCP服务器的响应。则该主机获取的IP地址为?
  • 七、xlib窗口渲染
  • Git版本管理命令reset
  • <STC32G12K128入门第十七步>获取Ultralight C卡七字节数据
  • Markdown 简历生成器——ResumeCraft 开发历程分享
  • C语言标准I/O与文件操作
  • C++ for QWidget:自定义的信号和槽
  • QML学习03(Component、Loader)
  • OpenHarmony SIM卡信号值整体流程分析
  • 本地部署代码托管解决方案 Gitea 并实现外部访问
  • 缓冲区的用途 和 fork复制进程
  • 深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
  • 内容中台智能推荐系统构建与演进
  • Python 装饰器详解
  • 提示工程 - 系统提示(System Prompts)
  • AI日报 - 2025年05月19日
  • Fine-Tuning Llama2 with LoRA
  • STC89C52单片机模拟实现洗衣机控制 Proteus仿真
  • TYUT-企业级开发教程-第一章
  • Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作
  • 如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误
  • C++:⾯向对象的三⼤特性
  • Java正则表达式:从基础到高级应用全解析
  • ColorAid —— 一个面向设计师的色盲模拟工具开发记
  • 超越想象:利用MetaGPT打造高效的AI协作环境
  • Vue 3 中使用 md-editor-v3 的完整实例markdown文本
  • Pandas 构建并评价聚类模型② 第六章
  • 实现菜谱二级联动导航