我是算法设计新手。我有一个大约有8128个整数的列表。我需要创建一个算法,它将创建128种不同的唯一数字组合。
第一个数字1不被任何组合使用。前6个数字序列的开头如下:
- 2、4、7、11、16、22
- 3、6、10、15、21
- 5、9、14、20
- 8、13、19
- 12日18
- /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
,其中I
和J
是(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