以下是锻炼的问题CLRS 10.3-4
我正在努力解决
通常希望将双链表的所有元素保存在存储中, 例如,使用多数组表示中的前m个索引位置。 (在分页的虚拟内存计算环境中就是这种情况。)解释如何实现ALLOCATE OBJECT和FREE OBJECT过程,以便表示紧凑。假设没有指向列表本身之外的链表的元素的指针。 (提示:使用堆栈的数组实现。)
到目前为止,这是我的解决方案
int free;
int allocate()
{
if(free == n+1)
return 0;
int tmp = free;
free = next[free];
return tmp;
}
int deallocate(int pos)
{
for(;pos[next]!=free;pos[next])
{
next[pos] = next[next[pos]];
prev[pos] = prev[next[pos]];
key[pos] = key[next[pos]];
}
int tmp = free;
free = pos;
next[free] = tmp;
}
现在,问题是,如果是这种情况,我们不需要链表。如果删除是O(n),我们可以使用普通数组实现它。其次我没有使用堆栈的数组实现。捕获量在哪里?我该怎么开始?
答案 0 :(得分:-1)
您不必立即缩小列表。只需留下一个洞并将该洞连接到您的空闲列表即可。一旦你分配了内存,它就是你的。所以,让我们说你的页面大小是1K。即使列表为空,您的初始分配列表大小也将为1K。现在,您可以非常有效地添加和删除项目。
然后向pack
列表引入另一种方法,即删除所有洞。请记住,在调用pack-method之后,所有'引用'失效。