新手算法设计



我是算法设计新手。我有一个大约有8128个整数的列表。我需要创建一个算法,它将创建128种不同的唯一数字组合。

第一个数字1不被任何组合使用。前6个数字序列的开头如下:

  1. 2、4、7、11、16、22
  2. 3、6、10、15、21
  3. 5、9、14、20
  4. 8、13、19
  5. 12日18
  6. /ol>

    我注意到数字之间的间隔在每个序列之间增加1。我还看到它似乎选择了第一个唯一的(未使用的)整数来开始一个序列。我一直在尝试在Python中实现这个。

    我想解决一个设施选址问题。我在数组中存储了8128个距离值。下面的代码片段使前两个相对距离数组正确,但是第三个数组重复一个在

    之前已经使用过的值
    distances = [[0 for col in range(2)] for row in range(128)] #this array contains line numbers that contain distances
    #1st iteration works
    startpoint = 0
    count = 1
    diff = 2
    while startpoint < 8127:
        print distance[startpoint+diff]
        startpoint = startpoint+count
        count += 1
        diff += 2
    #2nd iteration works
    startpoint = 1
    count = 2
    diff = 3
    while startpoint < 8127:
        print distance[startpoint+diff]
        startpoint = startpoint+count
        count += 1
        diff += 2
    #3rd iteration repeats a value
    startpoint = 2
    count = 3
    diff = 4
    while startpoint < 8127:
        print distance[startpoint+diff]
        startpoint = startpoint+count
        count += 1
        diff += 2
    

    有这个算法的例子或实现吗?

这个距离用函数来表示可能比用数组来表示要好:

D(I, J) = I + J

,其中IJ是(un-Pythonesuqe)基于1的索引。(你是否意识到在你的代码中,距离都是零?)

此外,您可能应该考虑您的行数(128)而不是总体值数(8128)。你三次迭代的目的我不太清楚。你不应该在行和列之间有循环吗?

:

N = 128
n = 2
for i in range(N):
    m = n
    s = []
    for j in range(N - i):
        s.append(m)
        m += (j + 1) + (i + 1)
    print i + 1, s        
    n += i + 1

你可以用另一种方法解决这个问题,注意每个数字只出现一次,并遵循一个模式:

 2   4   7  11
    /   /   /
   /   /   /
  /   /   /
 3   6  10
    /   /
   /   /
  /   /
 5   9
    / 
   / 
  / 
 8

然后你可以在前面创建所有列表,并在第二个循环中打印它们:

n = 2
L = []
for i in range(N):
    L.append([])
    for LL in reversed(L):
        LL.append(n)
        n += 1
for i, LL in enumerate(L):
    print i + 1, LL

相关内容

  • 没有找到相关文章

最新更新