插入、删除操作算法的时间复杂度分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插入、删除操作算法的时间复杂度分析
从上述插入、删除操作的算法可见,当在单链表存储结构的线性表中某个位置上插入或删除—个数据元素时,其时间主要耗费在寻找插入或删除结点的位置上,为在第i 个结点之前插入一个新结点或删除第i 个结点,都必须首先找到第i-1个结点,就是需修改指针的结点,该寻找过程所需进行的基本操作是移动指针和比较,由此可见,寻找插入或删除结点的位置基本操作的重复执行次数(频度)取决于插入或删除元素的位置。

假设p i 是在第i 个元素之前插入—个元素的概率,c i 是在第i 个位置上插入数据元素时,所需基本操作的重复执行次数。

则在长度为n 的线性表中插入—个数据元素时所需基本操作的重复执行次数的期望值(平均次数)为:
()()。

211111
11111n i n i p c p E n i n i i n i i
i is =-+=-==∑∑∑+=+=+= 假设q i 是删除第i 个元素的概率,则在长度为n 的线性表中删除一个数据元素时所需移动指针和比较操作次数的期望值(平均次数)为:
()()。

21111111-=-=-==∑∑∑===n i n i q c q E n i n i i n i i i dl
其中,我们假定在线性表的任何位置上插入或删除元素都是等概率的,即。

,n q n p i i 111=+=
由以上分析可见,在单链表存储结构的线性表中插入或删除一个数据元素时,虽然不需要向顺序存储结构那样移动元素,但为了寻找插入或删除元素位置所需要进行的查找操作的平均执行次数约为表长的一半。

因此,若表长为n ,则在单链表上实现的插入和删除操作的时间复杂度也为O(n)。

上面我们讨论了线性表的各种基本操作在单链表上的实现,下面我们将给出单链表的生成算法。

当然,我们借助插入操作也可以生成单链表,只是较此处的生成算法费时。

下面我们给出两种单链表的直接生成算法,这两个算法均是基于线性表的数据元素从键盘输入,不同之处在于其中一个始终是在单链表的头结点之后插入新结点,这样单链中的数据元素的顺序与输入顺序相反;而另一个生成算法则始终是在单链表的末尾插入新结点,为此设置了一个尾结点指针。

下面是算法的描述:
① 在单链表的头结点之后插入新结点的单链表生成算法。

void Creatlist_link(LinkList &la) {
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL ;
cin>>x ;
while (x!=EndMark) {
p=(LinkList)malloc(sizeof(LNode));//p=new LNode;
p->data=x;
p->next=la->next;
la->next=p;
cin>>x;
}
}
②在单链表的末尾插入新结点的单链表生成算法。

void Creatlist_link(LinkList &la) {
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
r=la;
cin>>x;
while(x!=EndMark) {
p=(LinkList)malloc(sizeof(LNode));//p=new LNode;
p->data=x;
p->next=r->next;
r->next=p;
r=p;
cin>>x;
}
}
从上述单链表的生成算法可见,其时间复杂度为O(n),其中,n为单链表中的元素个数,即其所表示的线性表的长度。

相关文档
最新文档