图搜索,找到值时如何停止搜索?
Graph search, how to stop searching when the value is found?
我遇到了这两个图形搜索代码的麻烦。我想做的是实现一种在找到值时停止搜索该值的方法,而不是长时间搜索所有节点。有人可以帮我吗? ( python 中的新功能)。我尝试了一些中断方法,但没有用。
import time
from collections import defaultdict
class Grafo:
def _init_(self):
self.grafo = defaultdict(list)
def adiciona_aresta(self, u, v):
self.grafo[u].append(v)
def Busca_Profunda_util(self, v, visitado):
visitado.add(v)
print(v, end = " ")
for vizinho in self.grafo[v]:
if vizinho not in visitado:
self.Busca_Profunda_util(vizinho,visitado)
def Busca_Profunda(self,v):
visitado = set()
self.Busca_Profunda_util(v, visitado)
g = Grafo()
g.adiciona_aresta(0,1)
g.adiciona_aresta(0,2)
g.adiciona_aresta(1,2)
g.adiciona_aresta(2,0)
g.adiciona_aresta(2,3)
g.adiciona_aresta(3,3)
g.Busca_Profunda(2)
这是第二个代码,略有不同,但目的相同。
import time
from collections import defaultdict
class Grafo:
def _init_(self):
self.grafo = defaultdict(list)
def adicionaAresta(self,u,v):
self.grafo[u].append(v)
def Busca_largura(self,origem):
visitados = [False] * (max(self.grafo) + 1)
fila = []
fila.append(origem)
visitados[origem] = True
while fila:
origem = fila.pop(0)
print(origem, end = " ")
for i in self.grafo[origem]:
if visitados[i] == False:
fila.append(i)
visitados[i] = True
g = Grafo()
g.adicionaAresta(0,1)
g.adicionaAresta(0,2)
g.adicionaAresta(1,2)
g.adicionaAresta(2,0)
g.adicionaAresta(2,3)
g.adicionaAresta(3,3)
print("Travessia com Busca em Largura")
g.Busca_largura(2)
如果我正确理解你的问题,我相信这应该有效:
from collections import defaultdict
class Grafo:
def __init__(self):
self.grafo = defaultdict(list)
def adiciona_aresta(self, u, v):
self.grafo[u].append(v)
def Busca_Profunda(self, comeco, desejado):
visitado = set()
def Busca_Profunda_util(comeco, desejado):
visitado.add(comeco)
print(comeco, end=" ")
for vizinho in self.grafo[comeco]:
if desejado == vizinho:
return True
if vizinho not in visitado:
if Busca_Profunda_util(vizinho, desejado):
return True
return False
return Busca_Profunda_util(comeco, desejado)
g = Grafo()
g.adiciona_aresta(0, 1)
g.adiciona_aresta(0, 2)
g.adiciona_aresta(1, 2)
g.adiciona_aresta(2, 0)
g.adiciona_aresta(2, 3)
g.adiciona_aresta(3, 3)
print(g.Busca_Profunda(comeco=2, desejado=3)) # esperado: True
print(g.Busca_Profunda(comeco=2, desejado=4)) # esperado: False
print(g.Busca_Profunda(comeco=0, desejado=3)) # esperado: True
注意:我用葡萄牙语(comeco、desejado)命名了我制作的新参数。但是,我实际上不会说葡萄牙语,所以如果我翻译错误,我深表歉意。
我遇到了这两个图形搜索代码的麻烦。我想做的是实现一种在找到值时停止搜索该值的方法,而不是长时间搜索所有节点。有人可以帮我吗? ( python 中的新功能)。我尝试了一些中断方法,但没有用。
import time
from collections import defaultdict
class Grafo:
def _init_(self):
self.grafo = defaultdict(list)
def adiciona_aresta(self, u, v):
self.grafo[u].append(v)
def Busca_Profunda_util(self, v, visitado):
visitado.add(v)
print(v, end = " ")
for vizinho in self.grafo[v]:
if vizinho not in visitado:
self.Busca_Profunda_util(vizinho,visitado)
def Busca_Profunda(self,v):
visitado = set()
self.Busca_Profunda_util(v, visitado)
g = Grafo()
g.adiciona_aresta(0,1)
g.adiciona_aresta(0,2)
g.adiciona_aresta(1,2)
g.adiciona_aresta(2,0)
g.adiciona_aresta(2,3)
g.adiciona_aresta(3,3)
g.Busca_Profunda(2)
这是第二个代码,略有不同,但目的相同。
import time
from collections import defaultdict
class Grafo:
def _init_(self):
self.grafo = defaultdict(list)
def adicionaAresta(self,u,v):
self.grafo[u].append(v)
def Busca_largura(self,origem):
visitados = [False] * (max(self.grafo) + 1)
fila = []
fila.append(origem)
visitados[origem] = True
while fila:
origem = fila.pop(0)
print(origem, end = " ")
for i in self.grafo[origem]:
if visitados[i] == False:
fila.append(i)
visitados[i] = True
g = Grafo()
g.adicionaAresta(0,1)
g.adicionaAresta(0,2)
g.adicionaAresta(1,2)
g.adicionaAresta(2,0)
g.adicionaAresta(2,3)
g.adicionaAresta(3,3)
print("Travessia com Busca em Largura")
g.Busca_largura(2)
如果我正确理解你的问题,我相信这应该有效:
from collections import defaultdict
class Grafo:
def __init__(self):
self.grafo = defaultdict(list)
def adiciona_aresta(self, u, v):
self.grafo[u].append(v)
def Busca_Profunda(self, comeco, desejado):
visitado = set()
def Busca_Profunda_util(comeco, desejado):
visitado.add(comeco)
print(comeco, end=" ")
for vizinho in self.grafo[comeco]:
if desejado == vizinho:
return True
if vizinho not in visitado:
if Busca_Profunda_util(vizinho, desejado):
return True
return False
return Busca_Profunda_util(comeco, desejado)
g = Grafo()
g.adiciona_aresta(0, 1)
g.adiciona_aresta(0, 2)
g.adiciona_aresta(1, 2)
g.adiciona_aresta(2, 0)
g.adiciona_aresta(2, 3)
g.adiciona_aresta(3, 3)
print(g.Busca_Profunda(comeco=2, desejado=3)) # esperado: True
print(g.Busca_Profunda(comeco=2, desejado=4)) # esperado: False
print(g.Busca_Profunda(comeco=0, desejado=3)) # esperado: True
注意:我用葡萄牙语(comeco、desejado)命名了我制作的新参数。但是,我实际上不会说葡萄牙语,所以如果我翻译错误,我深表歉意。