生成升序2 ^ p * 3 ^ q

时间:2014-08-16 21:46:17

标签: algorithm sorting math

我有兴趣实现一个我读过的特定的Shellsort方法,它具有与bitonic排序相同的时间复杂度。然而,对于任何整数p和q,它要求间隙序列是满足表达式2 ^ p * 3 ^ q的数字序列[1,N-1]。在外行人的术语中,该范围内的所有数字只能被2和3整除一次。是否有相对有效的方法来生成此序列?

2 个答案:

答案 0 :(得分:12)

该表格的数字称为3 - smooth。 Dijkstra研究了生成5-smooth或regular numbers的密切相关的问题,提出了一种算法,该算法通过以1开始S然后对序列2S,3S和2进行排序合并来生成5个平滑数的序列S. 5S。这是在Python中为3个平滑数字渲染这个想法,作为无限生成器。

def threesmooth():
    S = [1]
    i2 = 0  # current index in 2S
    i3 = 0  # current index in 3S
    while True:
        yield S[-1]
        n2 = 2 * S[i2]
        n3 = 3 * S[i3]
        S.append(min(n2, n3))
        i2 += n2 <= n3
        i3 += n2 >= n3

答案 1 :(得分:5)

最简单的我能想到的是在pq上运行嵌套循环,然后对结果进行排序。在Python中:

N=100
products_of_powers_of_2and3 = []
power_of_2 = 1
while power_of_2 < N:
    product_of_powers_of_2and3 = power_of_2
    while product_of_powers_of_2and3 < N:
        products_of_powers_of_2and3.append(product_of_powers_of_2and3)
        product_of_powers_of_2and3 *= 3
    power_of_2 *= 2
products_of_powers_of_2and3.sort()
print products_of_powers_of_2and3

结果

[1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96]

(在排序products_of_powers_of_2and3之前是

[1, 3, 9, 27, 81, 2, 6, 18, 54, 4, 12, 36, 8, 24, 72, 16, 48, 32, 96, 64]

鉴于products_of_powers_of_2and3的大小是log 2 N * log 3 N的顺序,列表不会快速增长并且排序它看起来效率不高。例如。即使N = 100万,这个列表也很短,有142个项目,所以你不必担心。