从GoogleMap的金字塔模型到无限级索引数据结构(三)

这一节阐述了怎样复用空闲的文件存储区。

 

曾经有一段时间遇到这么一个需求:已下载的Google地图在用户看来不够详细,很多标注点没有,或者有的路已经不存在了却在地图上仍然显示着,有些最近刚新建的建筑在地图上没有体现出来,诸多原因引出了最终的结果,这些不准确的地图信息必须被修正。 也就是说,要在现有地图的基础上进行修改或者替换。当时我是这么解决这个问题的:当客户提出一些地图数据不准确的时候,我会要求客户提供当地的测绘数据,拿到这些数据之后,使用程序按照Google地图的样式进行绘制,然后切块,将这些数据替换到地图包中去。由此就产生了一个问题,原本存储这些地图数据的区块变成了没有索引指向的区块,当需要修改的地图区域比较大的时候,这种区块就会大量产生,并且作为一个没有用的空间占用着磁盘导致数据文件臃肿无比,从内存管理的角度上来讲这是一块应该被复用的存储区。

 

复用这些存储区的思路很简单,每次在修改一块地图块的时候,将这些存储区记录下来,当下次有地图块需要写入的时候优先从已记录的空闲存储区中查找符合大小的存储区,如果没有的话就将数据写到文件末尾,否则使用这个存储区。

 

设计一个空闲空间管理器,这个管理器应该有如下特点:

1.能够快速找到一个大于或者等于指定大小的空闲空间

2.当取出一个空闲区域使用时,被截断的那一部分应该还是被标记为未使用

3.当新加入一个空闲区域时,应该自动和已有的空闲区域融合

 

 

为了能够快速找到符合大小的空闲区域,只要一个按照大小有序的空闲空间列表即可,然后使用二分查找法查找。

取出一个空闲区域使用时,我们只要重新把被截断的那部分空间重新加入空闲列表就可以满足第二点

自动融合新加入的空闲区域的意为:当新加入的空闲区域和已有的空闲区域连续的时候,应该自动合并这两个空闲区域,并且重新调整列表。

 

 

一个通用的二分查找算法

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值