Python 多链接结构的递归方法
我有一个python类,它接受两个散列并将它们链接在一起。我想要的是能够递归地获取所有链接的哈希,但是我正在努力编写一个正确的递归函数。 到目前为止,我所拥有的:Python 多链接结构的递归方法,python,Python,我有一个python类,它接受两个散列并将它们链接在一起。我想要的是能够递归地获取所有链接的哈希,但是我正在努力编写一个正确的递归函数。 到目前为止,我所拥有的: class MultiLink: def __init__(self): self.map = {} def get(self, md5: str, scanned: list = None) -> list: matches = [] scanned = sca
class MultiLink:
def __init__(self):
self.map = {}
def get(self, md5: str, scanned: list = None) -> list:
matches = []
scanned = scanned or []
for match in self.map[md5]:
matches.append(match)
if match in scanned:
continue
scanned.append(match)
for mmatch in self.map[match]:
if mmatch not in scanned:
matches += self.get(mmatch, scanned=scanned)
return list(set(matches))
def link(self, first: str, second: str) -> None:
try:
self.map[first].append(second)
except KeyError:
self.map[first] = [second]
try:
self.map[second].append(first)
except KeyError:
self.map[second] = [first]
正如您所看到的,输出并不像我期望的那样执行:
l = MultiLink()
l.link("a", "b")
l.link("b", "c")
l.link("c", "a")
l.get("c")
这将输出['c','b','a']
,但l.get(“a”)
输出['c','b']
如果我接着执行l.link(“d”,“a”)
,它将返回['c','a']
,而不是整个结果集
相反,我想要的是get函数从给定节点开始,递归地跟随所有其他节点,直到它获取所有直接或间接链接的节点。因此l.get(“b”)
将返回[“a”、“c”、“d”]
,“d”,因为它是通过“a”链接的。同样地,l.get(“d”)
将获取所有其他字母,因为它们通过“a”链接
这是我第一次尝试写这样的东西,所以我肯定我在某处犯了一个非常愚蠢的错误,但我自己找不到。有人知道怎么做吗?或者如果已经在某处实现了这一点?我检查了collections模块,但没有发现任何感兴趣的内容。简单的图形遍历即可: 稍微更改代码以使用
集合
并应用:
类多链接:
定义初始化(自):
self.map={}
def get(自我,md5:str)->设置:
结果=集合([])
def DFS(键:str)->无:
对于self.map[键]中的匹配:
如果结果中不匹配,则匹配!=md5:
结果。添加(匹配)
DFS(匹配)
DFS(md5)
返回结果
def链接(self,第一个:str,第二个:str)->无:
如果在self.map中处于第一位:
self.map[first].add(second)
其他:
self.map[first]=set([second])
如果是self.map中的第二个:
self.map[second].add(first)
其他:
self.map[second]=set([first])
给定样本的预期输出是什么?您需要描述行为应该是什么。从你的描述中不明显。例如,“接受两个散列并将它们链接在一起”并没有使用标准术语,也不清楚您的意思我希望基本上递归地跟踪所有链接。因此在我的示例中,l.get(“c”)将返回[“d”、“b”、“a”],因为这些字母都链接在一起。我将更新描述,请更新您的问题,并明确指出这些输出。不要把它们写在评论里。更新了,我希望现在更清楚。这正是我要找的,谢谢。我一开始读过图表,但我从来没有听说过DFS,所以我可能永远也不会自己弄明白。根据链接的大小,可能会遇到递归错误。您还可以使用堆栈数据结构而不是调用堆栈将DFS实现为迭代算法。