我应该针对这种特殊情况使用什么数据结构?

时间:2013-12-01 06:55:18

标签: java algorithm

这不是家庭问题

我正在设计一个停车场,让我说我有一个变量used来计算使用了多少个点,还有Hashmap将汽车VIN号码映射到停车场号码。

我从used = 0

开始

当CarA到达时:

used = used + 1;
h.put("CarA" , used) //CarA-> 1

当CarB到达时:

used = used + 1;
h.put("CarB" , used) //CarB-> 2

当CarC到达时:

used = used + 1;
h.put("CarC" , used) //CarC-> 3

此时used包含3

现在我删除了CarA。

used = used - 1 // used contains 2

问题: 但现在我需要跟踪插槽1是空的这一事实,我不应该忘记再次使用它用于任何其他汽车。我如何跟踪事实?

我的解决方案(我希望改进并获得批评)是我可以在队列中保留这些批号(释放汽车),如果是queue不为空我应该只使用队列中的插槽,直到队列为空。

3 个答案:

答案 0 :(得分:2)

您的解决方案很好,除了它不需要是一个队列:任何具有O(1)插入和O(1)删除的数据结构都可以。例如,使用堆栈代替队列将为您提供相同的性能。

这个想法类似于为内存缓冲区使用后备列表:而不是分配新资源(在您的情况下,新的停车位)首先检查释放资源的集合,以查看是否有可用的项目重用。这种方法的另一个好处是,您可以随时使用“高水印”,告诉您在最高峰时有多少辆汽车。

答案 1 :(得分:0)

空闲列表是用于动态内存分配方案的数据结构。它通过在链接列表中将未分配的存储区域连接在一起来操作,使用每个未分配区域的第一个字作为指向下一个的指针。它最适合从内存池中分配,其中所有对象具有相同的大小。

免费列表使分配和解除分配操作变得非常简单。要释放一个区域,只需将其链接到空闲列表即可。要分配区域,只需从空闲列表的末尾删除单个区域并使用它。如果区域是可变大小的,则可能必须搜索足够大的区域,这可能是昂贵的。

来源:http://www.wisegeek.com/what-is-a-free-list.htm

有用的链接:http://docs.oracle.com/cd/B10500_01/rac.920/a96598/freelist.htm

答案 2 :(得分:0)

您可以创建一个空插槽的队列/列表,但这可能是过度工程。如果您知道所有空格的范围为0到n,则只需搜索地图,直到它为空格返回null。

替代方案是维护两个地图,空格和空格。您的代码只会将值从一个移动到另一个。要从可用的地图中获取可用空间,请获取Iterator并获取next()元素。

但是,再次,工程学。最简单的解决方案是地图是空间中汽车的唯一真实点。您知道空间可用,因为当您检查空间的内容时,映射将返回null。

调用map.size()会告诉您使用了多少空格。如果这等于您的总可用空间,则表示该批次已满。