希尔伯特立方体上的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
答案 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),或者您可以使用通常的递归到迭代代码转换技术自己实现生成器