我在使用tacop 2.2.2顺序分配时遇到了一些问题,重新打包内存部分在第247页。
主题是有n个堆栈共享公共区域位置L0< L< LX, 最初我们设置BASE [j] = TOP [j] = L0为1< = j< = n
目标是在插入或删除元素时发生溢出 堆叠我,如何重新打包内存。 (通过带走一些东西为堆栈腾出空间 尚未填写的表格。
A)。找到i <的最小k。 k&lt; n和TOP [k]&lt; BASE [k + 1],如果有这样的k 存在。将事情提升一个档次, 设置内容(L + 1) - &gt;内容(L),TOP [k]&gt; = L&gt; BASE [I + 1] 最后, 设置BASE [j] - &gt; BASE [j] + 1,TOP [j] - &gt; TOP [j] + 1,对于i&lt; j&lt; ķ
这是我的问题:
他们如何找到尚未填充的堆栈?堆栈k?为什么选择最小的k?
答案 0 :(得分:2)
要查找尚未填充的堆栈,使用的基本思路是:
堆栈
k
未满;&lt; ==&gt;TOP[k] < BASE[k+1]
算法第一步中的循环从k
到i+1
运行n
,以找到满足此条件的第一个k
。
另请注意,通过设置n
和BASE[n] = TOP[n] = L0
,最初所有空间都会被赋予最后一个BASE[n+1]=LInfty
堆栈。因此,除非填写了所有“更高”的堆栈,否则我们会找到k
。
你的第二个问题(为什么选择最小的k
?)更容易回答:第247页的算法只是一种重新打包的方式和简单他们是一个人。正如Knuth在算法文本正上方的段落中提到的那样:
重新包装的几种方法表明了自己; ... 我们将从最简单的方法开始, 然后会考虑一些替代方案。
后来,Knuth描述了一种重新包装方法,该方法考虑了早期的重新包装,使得该过程具有一定的适应性。