2013-03-27 25 views
1

我正在研究一个我想通过图表旅行的问题。不过,我可以看到,当我编写我的代码时,图的构建是很重要的部分。 每个节点都应该有一个固定长度为M的值。该图应该包含所有基数为2的组合。因此,例如对于M = 3,我们有:“000”“001”“010”“011”“100”“101 “110”“111”,即2^M = 8个组合。如何优化图的构建?

然后我想以非常特定的方式将节点连接在一起。每个节点有两个outoing边缘,值为“0”和“1”。例如“000”将与边缘1连接到“001”,因为如果我将右边的第一个数字删除并在最后加上边缘值,我将以“001”结束。类似地,“111”通过边缘“0”连接到“110”。

需要帮助。请注意,节点不一定需要用String来表示,但这是我实现的方式,但似乎运行速度太慢。这里重要的事情是节点连接正确。

我已经解决了这个问题,将节点存储在HashTable中,然后遍历整个集合以将节点连接到彼此。

建议赞赏如何使这个更聪明。

+0

两个节点何时连接?我不明白你的解释。请给出更多的例子并更彻底地解释。 – average 2013-03-27 07:42:09

+0

我怀疑“101”和“000”没有连接,因为它需要2次更改“101”才能达到“000”。我对吗 ? – average 2013-03-27 07:44:28

+0

嗯,是的,只需要在顶点编号的末尾添加一个数字0或1并删除第一个数字。因此,111有一个egde 1本身。此外,111还通过0连接到110.更多示例中,101通过值为1的边连接到011.它也通过0连接到010.希望这些示例更好地解释问题。 – Euklides 2013-03-27 08:47:36

回答

2

UPDATE:

所以你基本上要取号,并从它

  • 移它一个位向左并取消了第一位,并让最后一位是零得出的两个数字
  • 与上述相同,但设置的最后一个比特为一个

现在,这个号码被连接到上述这些2号。

这是我的理解。

下面是一些代码我写来计算这样的曲线图:

import pygraphviz as pgv 


# length of binary codes 

for n in range(3,8): 
    def b(x): 
    return str(bin(x))[2:].zfill(n) 
    G=pgv.AGraph(directed=True) 

    for i in range(1,2**n): 
    for j in range(1,2**n): 
     I = b(i) 
     J = b(j) 
     # we make room for another bit (the zero bit) 
     i1 = i << 1 
     # we unset the first bit 
     i1 = i1 & ~(1<<(n+1)) 

     # we copy the previous result 
     i2 = i1 
     # we set the last bit 
     i2 = i2 | 1 
     if i1 == j : 
     G.add_edge(I,J,label="0") 
     elif i2 == j: 
     G.add_edge(I,J,label="1") 

    G.layout(prog='dot') 
    G.draw("graph"+str(n)+".png") 

n = 3的

enter image description here

n = 4的

enter image description here

N = 5

enter image description here

N = 6

enter image description here

P.S.最初我尝试使用networkx,但很快意识到pygraphviz更容易使用。

0

鉴于您的顶点实际上是数字,为什么不使用邻接矩阵,其中列和行数表示顶点?

+0

你是完全正确的。这些值之间的实际关系是可以通过按位操作和计数位来表示的。 – average 2013-03-27 08:36:15