2014-03-27 113 views
1

我是新算法设计。我有一个约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

我注意到,由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 

有一个例子或该算法在那里的实现使用的值?

+3

嗨和欢迎!看起来好像你已经收到了一份学校作业,要求我们为你解决整个问题,或者找一个图书馆。虽然我们喜欢一个很好的挑战,并尝试尽可能以最好的方式提供帮助。有些问题需要你先努力解决这个问题。如果您可以发布一段代码或研究证明,以了解您已尝试过哪些解决方案以及哪些解决方案已工作/无法工作,并发布堆栈跟踪,输出或只是描述错误是什么有时候够了。 – Torxed

+0

这里有点不清楚,你已经有一个算法,不明白它的内部运作,或者你正在寻找一种算法来解决一个固定的问题? – Codor

+0

@Codor:我正在寻找算法来解决设施位置问题 – user1801060

回答

2

的距离也许更好表示为函数不是作为一个阵列:

D(I, J) = I + J 

其中IJ是(未Pythonesuqe)为基础的一个索引。 (你是否意识到在你的代码中,距离都是零?)

另外,你应该考虑行数(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 
+0

你是什么意思由'D(I,J)= I + J'?很明显,第1行和第2列的值不等于'1 + 2'。我认为它应该是D [r,c] = 2 +(r + c)*(r + c + 1)/ 2 + c',其中'r'和'c'分别是行索引和列索引(从0开始)。 – justhalf

+0

'D'是OP所称的距离。 'a [i] [j]'和'a [i] [j + 1]'之间的区别是'i + j + 2'。这不是数值4,而是4和下一个数值7的差值。 –

+0

啊,我明白了。那么我误解了符号。 – justhalf