我正在寻找一种从某个区间[a,b]分配和释放整数的算法。
每次我们请求赋值时,算法都会在[a,b]范围内生成一个之前未分配的整数。 我们可以通过要求算法释放它们来释放先前已分配的整数。这样做可以再次进行分配。
总结:
希望算法的时间和空间复杂度都是次线性的(对于n = b - a)。
作为奖金要求,假设[a,b]中的某些特定整数需要初始分配。
答案 0 :(得分:1)
首先想到的是从单个"可用"开始。范围。当用户分配一个整数时,只需将其从范围中删除:
[a,b]
a <--- [a+1,b]
这是所有情况下的O(1)操作。由于返回步骤的工作方式,这意味着仅在没有其他数字可用时才分配最大数量,并且尽可能频繁地重复使用低数字。
当用户返回一个整数时,进行二进制搜索以找出它之前要去的范围,或者合并到:
[28][30-50] <---- user is going to release 29
[28-50]
-or-
[26][30-50] <----- user is going to release 28
[26][28][30-50]
这是一个O(log m)操作,其中m是范围的数量,通常非常小。它从1开始,但最多可以n/2
,具体取决于用户发布的数字。
如果你想变得非常棘手,你可以在范围上添加第二个排序,将更小的范围移近&#34;前面&#34;,更大的范围更接近&#34;结束&#34 ;,当用户输入一个&#34;可用&#34;时,你给他们第一个值&#34;最小&#34;范围,启发式地导致较小的集合消耗&#34;总共留下较少的集合,从而平均节省空间。然而,这增加了很多复杂性,以及少量的空间和时间,因此最坏的情况会稍微恶化。在尝试之前先测量一下。
值得一提的是,这个 使用线性空间,虽然我很确定常量是&lt; = 1,所以内存开销会小于存储所有数字。如果不对用户如何分配和释放整数做出疯狂的假设,很难计算平均值,但我很确定平均内存使用率实际上更接近于对数而不是线性。很难说,这可能是乐观的。
一些动态内存调度与此类似的概念有效,通常存储&#34;未使用的&#34;部件作为链接列表里面未使用的内存。这样,就不需要额外的开销空间。由于您正在处理整数范围而不是堆内存,因此这种优化可能对您没有帮助。