我正在尝试在Swift中创建一个图形,但是当我尝试对其运行一个containsCycle()方法时,出现以下错误:同时访问0x6000034cd220,但是修改需要互斥权限。原谅我,但我不理解其他类似(但不相同)的问题,所以我问了一个更具体的问题。感谢您的帮助!
class Node: Hashable {
var val: String
var neighbors = Set<Node>()
init(val: String) {
self.val = val
}
func hash(into hasher: inout Hasher) {
hasher.combine(val)
hasher.combine(neighbors)
}
static func == (lhs: Node, rhs: Node) -> Bool {
return lhs.hashValue == rhs.hashValue
}
}
let a = Node(val: "a")
let b = Node(val: "b")
let c = Node(val: "c")
let d = Node(val: "d")
let e = Node(val: "e")
let f = Node(val: "f")
let g = Node(val: "g")
let h = Node(val: "h")
let i = Node(val: "i")
let j = Node(val: "j")
let k = Node(val: "k")
a.neighbors.insert(b)
a.neighbors.insert(c)
a.neighbors.insert(d)
a.neighbors.insert(e)
d.neighbors.insert(d) // <-- crashes here
d.neighbors.insert(a) // <-- or here, if I comment out the line above
c.neighbors.insert(g)
c.neighbors.insert(h)
c.neighbors.insert(a)
g.neighbors.insert(h)
g.neighbors.insert(c)
h.neighbors.insert(g)
h.neighbors.insert(c)
b.neighbors.insert(a)
e.neighbors.insert(a)
e.neighbors.insert(i)
e.neighbors.insert(j)
e.neighbors.insert(k)
i.neighbors.insert(e)
j.neighbors.insert(e)
k.neighbors.insert(k)
包含用于上下文的Cycle(),但是我的问题与上面的所有内容有关。
func containsCycle(_ node: Node) -> Bool {
var seen = Set<Node>()
return containsCycleRec(node, parent: nil, seen: &seen)
}
func containsCycleRec(_ node: Node, parent: Node?, seen: inout Set<Node>) -> Bool {
seen.insert(node)
for neighbor in node.neighbors {
if !seen.contains(neighbor) {
containsCycleRec(neighbor, parent: node, seen: &seen)
} else if neighbor != parent {
return true
}
}
return false
}
答案 0 :(得分:0)
给定2个彼此相邻的节点作为邻居,它会创建一种无限循环(据我理解),编译器不知道它们之间的引用循环在何处结束。因此,他们每个人都试图同时修改另一个。
a.neighbors.contains(d) // returns true
d.neighbors.contains(a) // returns true
由于这是一个图形问题,一个不错的解决方案最终是将图形仅表示为邻接表,而不是一系列互相引用的节点。
let adjList = [
"a": ["d"],
"d": ["a"]
]
我可能是错的(我很高兴学习新知识),但这是我对问题的理解和解决方案。