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