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

Is there a constant time algorithm for generating hilbert points curve incrementally?

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

形式上,我想要一个类型 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

如果您的意思是 "Is there an algorithm for generating the vertices of a Hilbert curve in sequence with O(1) cost per vertex?",那么答案是肯定的。这是递归的标准练习。如果您有用于发射顶点的常用海龟图形基元,它看起来像这样:

-- 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)生成器,或者您可以自己实现生成器使用递归到迭代代码转换的常用技术。