范围内的整数分配

时间:2014-06-03 22:40:18

标签: algorithm data-structures language-agnostic computer-science

我正在寻找一种从某个区间[a,b]分配和释放整数的算法。

每次我们请求赋值时,算法都会在[a,b]范围内生成一个之前未分配的整数。 我们可以通过要求算法释放它们来释放先前已分配的整数。这样做可以再次进行分配。

总结:

  • 分配完整数后,在释放之前无法再次分配
  • 如果未分配一个或多个整数,则算法必须指定其中一个
  • 当且仅当分配了范围中的所有整数时,算法才会分配

希望算法的时间和空间复杂度都是次线性的(对于n = b - a)。

作为奖金要求,假设[a,b]中的某些特定整数需要初始分配。

1 个答案:

答案 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;部件作为链接列表里面未使用的内存。这样,就不需要额外的开销空间。由于您正在处理整数范围而不是堆内存,因此这种优化可能对您没有帮助。