算法导论 练习10.3-5

本文介绍了一种名为COMPACTIFY-LIST的过程,它用于重新组织双向链表L和自由表F,使链表元素占据数组1到n的位置,同时保持双链表和自由表的正确性。该过程利用固定额外空间,通过交换节点并调整链接,确保操作时间效率。关键步骤包括查找自由表元素并与链表元素交换,最后证明了算法的正确性和运行时间复杂性。

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

设L是一个长度为n的双向链表,存储于长度为m的数组key、prev和next中。假设这些数组由维护双链自由表F的两个过程ALLOCATE-OBJECT和FREE-OBJECT进行管理。又假设m个元素中,恰有n个元素在链表L上,m-n个在自由表上。给定链表L和自由表F,试写出一个过程COMPACTIFY-LIST(L, F),用来移动L中的元素使其占用数组的1,2,...,n的位置,调整自由表F以保持其正确性,并且占用数组中n+1,n+2,...,m的位置。要求所写的过程运行时间应为\Theta (n),且只使用固定量的额外储存空间。请证明所写的过程是正确的。

关于上面标红的那个“双链自由表”,原文是这样

Suppose that these arrays are managed by ALLOCATE-OBJECT and FREE-OBJECT procedures that keep a doubly linked free list F

英语不太好,按个人理解就是自由表也是双链。。。

ALLOCATE-OBJECT过程从自由表里返回一个可用元素位置

FREE-OBJECT过程将链表中一个元素占用位置释放到自由表

先写一下大概的解决思路

1、按下标1到n对数组进行遍历,找一个自由表的元素(因为自由表没有key属性,根据key数组是否存在元素来判断是否属于自由表),进入2;若未找到说明已满足要求,进入3

2、遍历链表,找一个坐标大于n的元素,交换其与1中找到元素,返回1

3、过程结束

COMPACTIFY-LIST(L, F)
    x = L.head
    for i = 1 to n
        if i.key == nil    # 找到自由表元素
            while x <= n and x.next != nil
                x = x.next
            i.key, x.key = x.key, nil    # 值交换
            i.prev.next, i.next.prev = x.prev.next, x.next.prev
            i.prev, i.next = x.prev, x.next
            

感觉怪怪的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值