如何使用数组作为数组索引?

时间:2013-02-22 06:54:32

标签: c algorithm set dynamic-programming traveling-salesman

我想在C中实现旅行商问题(动态编程)。我有以下伪代码:

** Ignoring the base cases**
** C[i][j] is cost of the edge from i to j**
for m = 2,3,4..n:
    for each set S of size m which is subset of {1,2,3...n}:
        for each J in S, j ≠ 1:
            A[S][j] = min  of { A[S-{j}][k] + C[k][j] } for all k is in S and k ≠ j: 

 return min of { A[{1,2,3...n},j] + C[j][1] } for all j from 2 to n 

A [S] [j]存储从1到j的最短路径,它只访问S中的所有顶点一次。 (S包括1和j)。

时间复杂度为O(n 2 2 n )。

我的问题是,在这个伪代码中,他们使用了集合作为数组索引,时间复杂度表明没有元素j(S - {j})的集合的查找需要恒定的时间。

我所想到的是使用由m,i和j索引的3D数组。其中'i'指向存储在由m,i。

索引的不同数组集合中的集合

但问题是我不能在恒定时间内进行查找A[S-{j}[k]]

我的问题是如何在不改变原始算法的时间复杂度的情况下实现由'set'索引的数组。

1 个答案:

答案 0 :(得分:3)

让每个路径用二进制字符串表示,其中每个位代表一个城市是否被访问。

所以

(123456)
 011001

表示访问了城市2,3和6。

使用上面的数组索引。

如果要查找没有城市的路径,只需将该位设置为0并将输出用作索引。

第一个城市将永远被访问,所以你真的不需要那个城市。