【笔记】
对象的多重数组表示:对一组具有相同域的对象,每一个域都可以用一个数组来表示。
对象的单数组表示:一个对象占据存储中的一组连续位置,指针即指向某对所占存储区的第一个位置,后续位置可以通过加上相应的偏移量进行寻址。
分配和释放对象:使用废料收集器。
【练习】
10.3-1 请画出序列 <13,4,8,19,5,11> 存储在以多重数组表示的双链表中的形式,令画出在单数组表示下的形式。
10.3-2 对一组用单数组表示实现的同构对象,写出其过程ALLOCATE-OBJECT和FREE-OBJECT。
10.3-3 在过程ALLOCATE-OBJECT和FREE-OBJECT的实现中,为什么不需要重置对象的prev域。
分配内存时只需要找到该对象(要分配)以及其下一个对象(下一次分配)即可,不需要求前驱。
10.3-4 我们常常希望一个双链表中的所有元素在存储器中能够紧凑地排列在一起,例如使用多重数组表示中的前m个下标位置。假设链表以外没有指向链表元素的指针,请说明应如何实现过程ALLOCATE-OBJECT和FREE-OBJECT,才能使这种表示比较紧凑。
释放的空间放入栈中,申请空间时,若栈非空,弹出栈中的元素做分配,若栈为空,顺序分配空间即可。
10.3-5 设L是一长度为m的双链表,存储在长度为n的数组key、next和prev中。假设这些数组由维护双链自由表的F的两个过程ALLOCATE-OBJECT和FREE-OBJECT来操纵。进一步假设在数组的n个元素中,有m个在表L中,n-m个在自由表中。请写出一个过程COMPACTIFY-LIST(L,F),对给定的表L和自由表F,移动L中的元素,使他们占有数组中的1,2,3...m位置,同时调节自由表F使之保持正确,并占有数组位置m+1,m+2,....,n。所给出的过程的运行时间应该是θ(m),且只能使用固定量的额外空间。请仔细论证你所给出的过程的正确性。
暂时懒得写!