是否有一个恒定的时间算法来逐步生成希尔伯特点曲线?

时间:2016-08-28 21:00:49

标签: algorithm haskell functional-programming hilbert-curve

希尔伯特立方体上的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 1}}是最优的,这可能不是维基百科上提出的算法的情况,因为它可能错过了我们在这里进行增量计算的机会。插图:

x

1 个答案:

答案 0 :(得分:0)

如果你的意思是“是否有一个算法用于按每个顶点的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),或者您可以使用通常的递归到迭代代码转换技术自己实现生成器