《编程珠玑》代码之路15:节省空间的常见姿势

1:地理信息库中存储邻居的系统

地理信息库中的邻居用一个点(x, y)表示,x和y在[0,199]取值,假设一共有两千个,那么可以用一个200*200的二位格子矩阵表示,还可以作成图形界面,用户点击那个格子,系统把点击信号转化成对应的x和y,就可以直接访问相应邻居,如下图所示,格子为空表示空值,否则为相应数据。

法一:我们可以直接用一个二维数组实现,这样访问起来也非常方便,但问题中也就只有2000个邻居,而200*200=40000,也就是说只有5%左右的存储空间可以得到利用,从空间上来说,浪费非常大。

法二:可以用下图所示的数据结构来实现:

最左边的colhead数组,下标对应法一二维数组中的列号,每个元素都是一个链表的头指针。每个链表节点有两个成员,分别是对应的行号和数据。这样可以在常数时间找到对应的列,在线性时间找到对应的行号,然后取出需要的数据。通常来说,这个空间性能已经很不错的,但还没有优化到极致。

算一下哈:除了一个链表头数组,每个元素还需要一个指针和一个存储行号的空间,最重要的是,结构体在分配空间的时候还会因为对齐等问题造成空间浪费。

法三:开辟三个数组解决问题,第一个firstincol数组,下标对应列号,下标对应的数值代表这一列元素在数组row的第一个位置。数组row代表对应元素的行号。例如firstincol[0]值为0,代表第0列第一个元素在row[0],对应的pointnum[0]就是相应的数值,不难发现,根据firstincol[0 + 1]就可以找到firstincol[0]最后一个元素的位置。

如此一来,一个邻居只需要两个int来解决问题,而且不会因为结构体动态分配问题浪费更多空间。

当然,因为下标都在200以内,所以int其实可以替换为char,进一步节省空间。

猜你喜欢

转载自blog.csdn.net/beijixiong5622/article/details/84797252