Graph 如何优化图形的构建?

Graph 如何优化图形的构建?,graph,hashtable,Graph,Hashtable,我正在研究一个问题,在这个问题上,我想通过一个图表进行旅行。然而,当我对代码进行优化时,我可以看到图形的构建是最重要的部分。 每个节点都应该有一个固定长度M的值。图形应该包含基数2的所有组合。因此,例如对于M=3,我们有:“000”“001”“010”“011”“100”“101”“110”“111”,即2^M=8个组合 然后我想以一种非常具体的方式将节点链接在一起。每个节点都有两条向外的边,值分别为“0”和“1”。例如,“000”将通过边1连接到“001”,因为如果我删除右侧的第一个数字并在末

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

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

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

我已经解决了这个问题,将节点存储在哈希表中,然后在整个集合中循环,将节点彼此连接起来


建议欣赏如何使其更智能。

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

更新:

所以你基本上想要取一个数,然后从中导出两个数

  • 向左移动一位,取消第一位的设置,最后一位为零
  • 同上,但将最后一位设置为1
现在,该号码已连接到上述两个号码

这是我的理解

下面是我为计算这样一个图而编写的一些代码:

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")
将pygraphviz作为pgv导入
#二进制码的长度
对于范围(3,8)内的n:
def b(x):
返回str(bin(x))[2:][.zfill(n)
G=pgv.AGraph(定向=真)
对于范围内的i(1,2**n):
对于范围(1,2**n)内的j:
I=b(I)
J=b(J)
#我们为另一位(零位)腾出空间

i1=i两个节点何时连接?我不明白你的解释。请举例说明,我怀疑“101”和“000”之间没有联系,因为“101”需要两次变化才能达到“000”。我说得对吗?是的,只需在顶点数的末尾添加一个数字0或1,然后删除第一个数字。因此,111自身有一个egde 1。此外,111还经由0连接到110。更多示例,101通过值为1的边连接到011。它还通过0连接到010。希望这些例子能更好地解释这个问题。谢谢,我会纠正我的实现。嗯,我已经更新了代码。你完全正确。值之间的实际关系可以通过按位操作和计数位来表示。