设L是存储在数组key,prev和next中的长度为m的双向链表,它们全部为长度n。假设这些数组由ALLOCATE_OBJECT和FREE_OBJECT程序管理,这些程序保留一个双重链接的空闲列表F.假设n个项目[可以由三个数组描述,正好m在列表L上,另一个nm打开自由列表F.编写一个程序COMPACTIFY_LIST(L,F),它移动L中的项目,使它们占据数组位置1,2,...,m并调整所有数组中的索引值,以便L列表保持相同的顺序,F列表包含如前所述的nsame元素数,现在占据数组中的位置m + 1,m + 1,..,n。
我只能想到一个O(n)程序,我保留两个指针。我从数组键开头的两个指针开始。 Pointer1查找第一个可用的空白空间,然后指针2在该位置之后查找包含链表元素的数组的第一个索引。然后将此元素移动到pointer1指向的位置,然后pointer1查找下一个空白空间并继续。但是,如果我没有错,这个程序将花费O(n)时间。我想不出O(m)算法。
P.S。是的,这是功课。但是我被困住了,一些帮助将非常感激。
答案 0 :(得分:2)
将L的每个元素[i]放在基本数组A的位置[i]就足够了。通过L读取并交换找到的每个元素,其中任何元素已经占据了A中指定的位置。这显然有O (m)复杂性。