compression - 线性四叉树是存储网格划分数据最有效的方式吗

标签 compression quadtree

假设您有一个 32x32 网格,可以使用以下任何 block 大小随机分割:

32x32、16x16、8x8、4x4

网格被分割的次数以及分割的方式是随机确定的。

从视觉上看,它可能看起来像这样:

enter image description here

这种类型的数据可以使用 quad tree 来表示。

我的问题是:

如果我尝试使用尽可能少的字节来表示上图,线性四叉树是否是最有效的方法?

我能想到的唯一其他选择是制作图表的所有可能组合,并使用单个数字来表示每个组合。

因此,对于该图,有 4 个分支级别(32x32、16x16、8x8、4x4),这将为我们提供 4^0 + 4^1 + 4^2 + 4^3 种可能的组合,等于 85 种组合。

因此,我能想到的存储图表的最小方法是使用 7 位(1010101 是二进制数 85)来表示可能的组合。

Linear Quadtrees在存储效率方面等于这个,还是会占用更多或更少的空间?

最佳答案

我通常不会回答我自己的问题,但看到这个问题仍然没有得到回应,我会给出我的答案。

经过近 2 天的研究,我现在更好地了解了线性四叉树是什么。

线性四叉树只是以特定遍历顺序编写的四叉树的数组表示形式。

基本上只需选择要读取四叉树的特定“顺序”并按该顺序保存其值即可。

例如,在问题中使用的图表中,有 4 个堆栈级别,因为有 4 个 block 大小(32、16、8、4)。

每个堆栈都可以按顺序读取。

因此,假设整个图充满了 32x32 block ,树的“根”(我们读取的第一个节点)将填充“1”,以表示我们需要该 block ,而根的所有子节点将为“0”,因为图形已满,不再需要 block 。

所以线性四叉树在二进制中看起来像这样“10000000000000....(84个0)”

这显然比我在问题中提到的 7 位多,但那是因为没有对该线性四叉树应用压缩。

我确实问错问题了。您需要线性四叉树来表示四叉树,所以我真的应该被问“压缩线性四叉树的最佳方法是什么”,而我在问题中给出的想法是最好的方法。

使用所有不同的四叉树组合创建一个查找表,并使用数字代表每个组合。

关于compression - 线性四叉树是存储网格划分数据最有效的方式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594994/

相关文章:

c - 如何在 C 程序中使用 libbz2 库压缩内存缓冲区中的数据

algorithm - 将 52 个整数编码成更少数量的好方法是什么?

c++ - C++ 中任何好的范围查询库(使用 K-D 树、四叉树或 R 树)

java - 存储用于按 x,y 坐标定位的对象

c++ - 解释这个算法(比较SURF算法中的要点)

algorithm - 在点的四叉树中,如果插入点恰好落在分割线上,如何分割四边形?

algorithm - 四叉树最近邻算法

c++ - 在这种情况下我的压缩率可以低于 6.25% 吗?

Python3 压缩记录器模块动态记录

javascript - 如何压缩(压缩)JS数组