数据结构:「顺序表基本操作」及其「时间复杂度分析」

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构:「顺序表基本操作」及其「时间复杂度分析」相关的知识,希望对你有一定的参考价值。

顺序表定义

1,前言

线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。其最大的特点就是:元素的逻辑顺序与其物理顺序相同 。

线性表的顺序存储结构中任一元素都可以随机存取,并且注意 :线性表中元素的位序是从1 开始的,而数组中元素的下标是从0 开始的。假定线性表的元素类型为 EleType ,则线性表的顺序存储类型可以描述为:

2,动态实现

1,结构定义:

2,初始化顺序表:

3,增加动态数组的长度:

顺序表上的基本操作

1,插入操作(Listsert(&L,i,e)

在表L 中的第i 个位置上插入指定元素e 。以下采用的是“静态分配的方式实现。

以下给出实现的主要代码部分,便于我们阅读理解:

插入操作的时间复杂度分析:

通过观察以上代码,我们分析时间复杂度时只需要关注最深层循环语句的执行次数与问题规模n 的关系。即语句“L.data[j]=L.data[j-1];” 即可:

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

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

(3)平均情况:假设新元素插入到任何一个位置的概率相同,概率为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/2。即得平均时间复杂度= O(n)

提示:如果以上的分析i 的值和循环次数n 的关系不是太清楚,要回想下开头提到的线性表中元素的位序是从1 开始的,而数组中元素的下标是从0 开始的。

2,删除操作(ListDelete(SqList &L,int i,int &e))

删除顺序表L 中的第i (1<=i<=L.length)个位置的元素,用引用变量e 返回。若输入的i 不合法,则返回false ;否则,将被删元素赋给引用变量e ,并将第i+1 个元素及其后的所有元素一次往前移动一个位置,返回true 。

下面给出部分代码,辅助我们理解阅读:

删除操作的是时间复杂度分析:

通过观察以上代码,我们分析时间复杂度时只需要关注最深层循环语句的执行次数与问题规模n 的关系。即语句“L.data[j-1]=L.data[j];” 即可:

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

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

(3)平均情况:假设删除任何一个元素的概率相同,及p=1/n,i=1,循环n-1次;i=2,循环n-2 次..... i=n 时,循环0次,故平均循环次数=(n-1)p+(n-2)p+.....+1.p=(n-1)/2.则时间复杂度为O(n)

3,按位查找(GetElem(L,i))

获取表L 中第i 个位置的元素的值。下面给出一段简单的代码示例:

由于顺序表的各个元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第i 个元素,这也就是随机存取 特性的体现。因此其时间复杂度可得为 O(1)。

4,按值查找(LocateElem( L, e) )

在表L 中查找具有给定关键字的元素。如下给出在顺序表L 中查找第一个元素值等于e 的元素,并返回其位序:

对于时间复杂度的分析:

通过观察以上代码,我们分析时间复杂度时只需要关注最深层循环语句的执行次数与问题规模n 的关系。即语句“ if(L.data[i]==e ” 即可:

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

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

(3)平均情况:假设目标元素出现在任何一个位置的概率相同,都是1/n,目标元素在第一位,循环1次;第2位,循环2次;....... 在第n 为,循环n 次,则平均循环次数 =1\\n+2.1/n+....+n.1/n=(n+1)/2;则平均时间复杂度为O(n)。

关于顺序表的一些知识先就说这么多,共勉!


写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:739386924点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍分享:

 编程学习视频分享:

 

以上是关于数据结构:「顺序表基本操作」及其「时间复杂度分析」的主要内容,如果未能解决你的问题,请参考以下文章

SkipList (跳跃表)解析及其实现

数据结构——线性表

(王道408考研数据结构)第七章查找-第二节2:二分查找及其判定树

栈和队列-上

数据结构与算法学习笔记

线性表——顺序表——时间复杂度计算2