2

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

形式上,我想要一个 typeState和一个 tuple (initialState, nextState) :: (State, State -> ((Nat, Nat), State),这样每个应用程序nextState都会为我们提供希尔伯特曲线的下一个点,并且这nextState是最优的,这可能不是 Wikipedia 上提供的算法的情况,因为它可能会错过我们在这里拥有增量计算的机会。插图:

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
4

1 回答 1

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

于 2016-08-28T21:45:51.377 回答