gpt4 book ai didi

algorithm - 递归交错排列

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:29 24 4
gpt4 key购买 nike

我有一个程序(分形)以交错的顺序绘制线条。最初,给定要绘制的 H 行,它确定帧数 N,并绘制每 N 帧,然后每 N +1第帧等

例如,如果 H = 10N = 3,它会按顺序绘制它们:

0, 3, 6, 9,
1, 4, 7,
2, 5, 8.

但是我不喜欢 strip 逐渐变厚的方式,在很长一段时间内留下大面积未绘制的区域。因此,该方法得到增强,以递归方式在每个组中绘制中点线,而不是紧接着的后续线,例如:

0, (32)          # S (step size) = 32
8, (24) # S = 16
4, (12) # S = 8
2, 6, (10) # S = 4
1, 3, 5, 7, 9. # S = 2

(括号内的数字超出范围,没有画出来。)算法很简单:

Set S to a power of 2 greater than N*2, set F = 0.
While S > 1:
Draw frame F.
Set F = F + S.
If F >= H, then set S = S / 2; set F = S / 2.

当在最后一个步长上绘制奇数帧时,它们以简单的顺序绘制,就像初始(烦人的)方法一样。与每四帧相同,等等。它并没有那么糟糕,因为已经绘制了一些中间帧。

但是相同的排列可以递归地应用于每个步长的元素。在上面的示例中,最后一行将更改为:

1,      # the 0th element, S' = 16
9, # 4th, S' = 8
5, # 2nd, S' = 4
3, 7. # 1st and 3rd, S' = 2

前面几行元素太少递归生效。但如果 N 足够大,某些行可能需要多层递归。任何具有 3 个或更多对应元素的步长都可以递归置换。

问题 1.N 元素上的这种排列是否有一个通用名称,我可以用它来查找其他 Material ?我也对可能存在的任何类似示例感兴趣。如果我是第一个想要这样做的人,我会感到很惊讶。

问题 2. 我可以使用一些技术来计算它吗?我在 C 语言中工作,但现阶段我对算法级别更感兴趣;我很高兴阅读其他语言的代码(在合理范围内)。

我还没有解决它的实现问题。我希望我会首先预先计算排列(与上面的前一种方法的算法相反)。但我也很感兴趣是否有一种简单的方法来绘制下一帧而无需预先计算它,其复杂性与之前的方法相似。

最佳答案

听起来好像您正在尝试构建一维 low-discrepancy sequences .您的排列可以通过反转索引的二进制表示来计算。

def rev(num_bits, i):
j = 0
for k in xrange(num_bits):
j = (j << 1) | (i & 1)
i >>= 1
return j

示例用法:

>>> [rev(4,i) for i in xrange(16)]
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]

适用于一般 n 的变体:

def rev(n, i):
j = 0
while n >= 2:
m = i & 1
if m:
j += (n + 1) >> 1
n = (n + 1 - m) >> 1
i >>= 1
return j

>>> [rev(10,i) for i in xrange(10)]
[0, 5, 3, 8, 2, 7, 4, 9, 1, 6]

关于algorithm - 递归交错排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8176743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com