如何优化图形的构建?

时间:2013-03-27 07:32:27

标签: graph hashtable

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

然后我想以非常具体的方式将节点链接在一起。每个节点都有两个输出边,值为“0”和“1”。例如,“000”将与边缘1连接到“001”,因为如果我删除右边的第一个数字并在末尾添加边缘值,我将以“001”结束。类似地,“111”被边缘“0”连接到“110”。

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

我已经通过将节点存储在HashTable中然后循环整个集合以将节点连接到彼此来解决这个问题。

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

2 个答案:

答案 0 :(得分: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更易于使用。

答案 1 :(得分:0)

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