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

本文深入分析了在顺序存储结构的线性表中插入和删除元素时的时间复杂度,指出平均移动元素次数与表长的关系,得出算法时间复杂度为O(n)。通过示例1和示例2,比较了不同操作的时间复杂度,并强调了对元素排序对于提高运算效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   接上一篇文章继续分析

   在之前的文章中的示例1和示例2中,我们通过观察可以发现,当在顺序存储结构的线性表中某个位置上插入或删除一个数据元素时,其时间主要耗费在移动元素上(换句话说,移动元素的操作为预估算法时间复杂度的基本操作),而移动元素的格式取决于插入或删除元素的位置。

   假设 pi 是在第i个元素之前插入一个元素的概率,则在长度为n的线性表中插入一个元素时所需移动元素次数的期望值(平均次数)为

(1)

Eis=i=1n+1pi(ni+1)

   假设q_i是删除第i个元素的概率,则在长度为n的线性表中删除一个元素时所需移动元素次数的期望值(平均次数)为

(2)

Edl=i=1nqi(ni)

为了不失一般性,我们可以假定在线性表上的任意位置上插入或删除元素都是等概率的,即

(3)

pi=1n+1,qi=1n

通过(3)我们可以将上面的(1)和(2)进行相应的简化,其简化结果为:

(4)

Eis=1n+1i=1n+1(ni+1)=n2

(5)

Edl=1ni=1n(ni)=n12

  时间复杂度的计算规则:

   1.去掉运行时间中的所有加法常数

   2.只保留最高阶项

   3.如果最高阶项存在且不是1,去掉与这个最高阶相乘的常数得到时间复杂度

   由(4)和(5)可知,在顺序存储结构的线性表中插入或删除一个数据元素,平均约移动一般元素。若表长为n,则算法listInsert_ Sq 和listDelete_ Sq 的时间复杂度都为O(n)。

   在示例1和示例2中的插入操作中,“求表长”和“取第i个数据元素”的时间复杂度均为O(1),又由于插入均在表尾进行,则不需要移动元素,因此它们的执行时间主要取决于查找函数locateElem的执行时间。

   在示例1中,在顺序表L中查访是否存在和e相同的数据元素的最简单的方法是,令e和L中的数据元素逐个比较,若L中存在于e相同的元素 a1 则比较次数为 i(1iL.length) ,否则为L.length,即算法locateElem_ Sq 的时间复杂度为 O(L.length) 。由此对于顺序表LA和LB而言,union的时间复杂度为 O(LA.length×LB.length)

  而在示例2中,基本操作主要是给“元素赋值”算法的时间复杂度为 O(LA.length+LB.length)

总结:

  通过上述两个示例我们不难看出,示例2中的程序其运算的时间复杂度更低,因而程序运行也就会更迅速。究其原因有二:

  1) 由于la与lb中的元素依值递增(同一集合中元素不等),则在lb中的元素不需要在la中进行从头至尾的全程搜索;

  2) 由于用新表lc表示“并集”,则插入操作实际上是借助于“复制”操作来完成的。

结论:

  若以线性表表示集合并进行集合的各种运算,应该先对表中的元素进行排序。

其它:

  下面再列出其它各种常用排序的时间复杂度表

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值