【问题标题】:Tesseral arithmetic/quadtree正方体算术/四叉树
【发布时间】:2012-02-18 07:12:50
【问题描述】:

不久前我做了一个关于四叉树寻路的项目,我想改进它的性能。似乎使用 tesseral 算法来确定节点邻接(根据this page,由不列颠哥伦比亚大学地理系提供)将比我目前使用的蛮力方法快得多(我正在检查对于共享边,这对于静态四叉树效果很好,但如果地图发生变化,开销会太大)。

我或多或少地了解邻接算法部分所说的内容,但我不确定如何开始。我主要对 C# 感兴趣,但如果已经有一些源代码可以处理我可以查看的 tesseral 算术,那将是非常棒的,无论语言如何。否则,谁能给我一些关于处理加法/减法进位的指示?

【问题讨论】:

  • 我只是想到了一个更好的方法。是的,有点晚了,我知道。也应该比解压缩重新压缩要好得多。

标签: bit-manipulation quadtree


【解决方案1】:

嗯,我不知道有什么方法可以有效地做到这一点,但通常的“按位运算相加”算法建议使用以下算法(未经测试):

static int tesseral_add(int x, int y)
{
    int a, b;
    do
    {
        a = x & y;
        b = x ^ y;
        x = a << 2; // move carry up 2 places instead of the usual 1
        y = b;
    } while (b != 0);
    return b;
}

如果有进位链,这可能会循环很多。


实际上,有一个更好的方法可以做到这一点。

观察到对于z = interleave(a, -1); w = interleave(b, 0);,直接添加zw 会得到部分正确的结果,因为任何进位都会重新进位(所有“中间”位都是1)。唯一的“问题”是它破坏了 y 坐标。

所以要添加两个 tesseral 数字z = interleave(a, b); w = interleave(c, d);,有一个不错的简短方法:

int xsum = (z | 0xAAAAAAAA) + (w & 0x55555555);
int ysum = (z | 0x55555555) + (w & 0xAAAAAAAA);
int result = (xsum & 0x55555555) | (ysum & 0xAAAAAAAA);

【讨论】:

    【解决方案2】:

    我认为,处理 tesseral 算术最简单的方法是“位解压缩”数字,正常执行任意数量的算术运算,并在需要 tesseral 形式时“位压缩”它们:

    z = bit_zip(bit_unzip(x) + bit_unzip(y));
    

    (此示例仅适用于unsigned。对于有符号整数,将每个数字解压缩为两个变量,并分别对两个部分进行正常算术)。

    您可以在“Matters Computational ”第 1.15 章“按位压缩”中找到“bit-unzip”和“bit-zip”的快速实现。

    【讨论】:

    • 我不确定我是否遵循这个;交错位是否绕过手动携带数字的需要?我在交错方面没有太多经验,而且我引用的网站只是简单地提到了它,所以如果是这种情况,你能告诉我交错及其用途的入门吗?
    • 是的,解交错位绕过了手动进位的需要,因为它将镶嵌表示转换为允许正常算术计算的笛卡尔表示。位交织也用于多项式算术和计算机图形学(z-order)。可能还有其他用途。 "Matters Computational" 对交织、它的使用和实现给出了很好的解释。 This article 添加了更多信息。
    • this article 解释了 tesseral 寻址及其与交错的关系。
    • 那么,另一个问题;您是否知道对一种位混洗算法的修改,它只允许对单词的一部分进行混洗?例如,对于第三级节点,地址将是 6 位(例如 64 位字)。仅随机播放最低 6 位...?
    • 编辑:我查看了您的Bit Permutations link 中提供的源代码,但似乎子字的长度只能为 2^n 位。不过,这是我见过的最相似的东西。
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2013-05-12
    • 2014-06-14
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多