是否有用于增量生成希尔伯特点曲线的恒定时间算法?

Posted

技术标签:

【中文标题】是否有用于增量生成希尔伯特点曲线的恒定时间算法?【英文标题】:Is there a constant time algorithm for generating hilbert points curve incrementally? 【发布时间】:2017-01-04 20:44:57 【问题描述】:

希尔伯特立方体上的Wikipedia Article 包括对希尔伯特曲线上任意点的任意索引进行编码/解码的函数。这些算法不是恒定时间的。是否有一个恒定时间算法,给定曲线上的一个实际点(可能还有一些需要的状态),生成下一个点(和下一个状态)?

形式上,我想要一个类型State 和一个元组(initialState, nextState) :: (State, State -> ((Nat, Nat), State),这样nextState 的每个应用都会给我们希尔伯特曲线的下一个点,这样nextState 是最优的,即***上介绍的算法可能不是这种情况,因为它可能会错过我们在这里拥有的增量计算的机会。插图:

data State = _

initialState :: State
initialState = _

-- This must be optimal
nextState :: State -> ((Nat, Nat), State)
nextState = _

-- Returns the `nth point` of the hilbert curve
hilbertPoint :: Nat -> (Nat, Nat)
hilbertPoint n = iterate (snd.nextState) initialState !! n

【问题讨论】:

当您说“动态生成点”时,您的意思是“在希尔伯特曲线上生成随机点”还是别的什么? @templatetypedef 也许我是模棱两可的,所以我在问题上添加了冗余层以使其尽可能具体。 您能否详细说明“曲线上的下一个点”是什么意思?曲线是连续的。 @templatetypedef Wikipedia 文章有一个函数 d2xy : Int -> Int -> (Int, Int) 将整数转换为希尔伯特曲线上的二维点,该正方形被划分为 n by n 单元格。 map (d2xy n) [0..] 是我要增量生成的点列表。 @Gene 你为什么要删除你的答案?我发现它非常有用。 【参考方案1】:

如果您的意思是“是否有一种算法可以按每个顶点的 O(1) 成本生成希尔伯特曲线的顶点?”答案是肯定的。这是递归的标准练习。如果你有通常的海龟图形基元来发射顶点,它看起来像这样:

-- Angle must be + or - 90.0 degrees.
procedure Hilbert(Order : in Natural;
                  Angle : in Float) is
   Step : constant Float := 1.0; -- length of base case edge
begin
   if Order > 0 then
      Turn(Angle);
      Hilbert(Order - 1, -Angle);
      Walk(Step);
      Turn(-Angle);
      Hilbert(Order - 1,  Angle);
      Walk(Step);
      Hilbert(Order - 1,  Angle);
      Turn(-Angle);
      Walk(Step);
      Hilbert(Order - 1, -Angle);
      Turn(Angle);
   end if;
end Hilbert;

使用

启动递归
Hilbert(7, 90.0);

得到 7 阶曲线。

加法

由于您似乎对迭代器模式感兴趣,您可以使用上面的逻辑和带有生成器的语言(如 Python 或 Ruby),或者您可以使用递归到迭代代码转换的常用技术自己实现生成器.

【讨论】:

感谢您取消删除答案。我只添加了 Haskell 标志,因为它是我可以轻松准确地表达问题的语言。我移植了您的答案to javascript,结果,正如我所怀疑的那样,当您绝对必须生成所有分数(这是我的情况)时,它比the Wikipedia version 快大约 4 倍。谢谢。

以上是关于是否有用于增量生成希尔伯特点曲线的恒定时间算法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中生成 3D 希尔伯特空间填充曲线的算法

使用海龟图形和递归的希尔伯特曲线

如何生成“厚”贝塞尔曲线?

希尔排序算法(缩小增量排序)及C语言实现

希尔排序(Shellsort)

Shell Sort(希尔排序)