ฉันกำลังใช้อัลกอริทึม Bron-Kerbosch ใน Clojure สำหรับโปรเจ็กต์คลาสและมีปัญหาบางอย่าง ปัญหาอยู่ที่บรรทัดสุดท้ายของอัลกอริทึม
BronKerbosch1(R, P, X):
if P and X are both empty:
report R as a maximal clique
for each vertex v in P:
BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
P := P \ {v} ;This line
X := X ⋃ {v} ;This line
ฉันรู้ว่าใน Clojure ไม่มีความรู้สึกของ "set x = บางสิ่งบางอย่าง" แต่รู้ว่ามีฟังก์ชัน assoc
ซึ่งฉันคิดว่าคล้ายกัน ฉันต้องการทราบว่า assoc
เหมาะสมหรือไม่ที่จะติดตั้งใช้งานให้เสร็จสมบูรณ์
ในกราฟการใช้งานของฉันจะแสดงเช่นนั้น
[#{1 3 2} #{0 3 2} #{0 1 3} #{0 1 2}]
โดยที่โหนดที่ 0 แสดงเป็นชุดแรกในเวกเตอร์ และค่าในชุดแสดงถึงขอบของโหนดอื่นๆ ดังนั้นด้านบนแทนกราฟที่มี 4 โหนดที่สมบูรณ์ (โหนดทั้งหมดเชื่อมต่อกับโหนดอื่นทั้งหมด)
จนถึงตอนนี้การใช้อัลกอริทึมของฉันคือ
(defn neighV [graph, v]
(let [ret-list (for [i (range (count graph)) :when (contains? (graph i) v)] i)]
ret-list))
(defn Bron-Kerbosch [r, p, x, graph, cliques]
(cond (and (empty? p) (empty? x)) (conj cliques r)
:else
(for [i (range (count p))]
(conj cliques (Bron-Kerbosch (conj r i) (disj p (neighV graph i) (disj x (neighV graph i)) graph cliques)))
)))
ตอนนี้ฉันติดอยู่กับการแก้ไข p
และ x
ตามอัลกอริทึม ฉันคิดว่าฉันสามารถใช้ assoc
เพื่อทำสิ่งนี้ได้ แต่ฉันคิดว่ามันใช้ได้กับแผนที่เท่านั้น ใช้งานได้ไหม ใครช่วยแนะนำฟังก์ชั่นอื่นได้บ้างคะ?
assoc
ไม่ใช่map a = something
จริงๆ แต่จะส่งคืนแผนที่ใหม่โดยมีคู่ K/V ที่แก้ไขหรือเพิ่มเข้ามาด้วย ดังนั้นหากมีassoc
สำหรับเซตอยู่ การทำ(assoc someSet 2)
จะไม่แก้ไข someSet คุณก็แค่มีเซตใหม่ - person t_scho   schedule 28.03.2015for
จำเป็นต้องเปลี่ยนเป็นreduce
หรือloop
เพื่อให้แต่ละขั้นตอนเห็นค่าที่อัปเดต - person noisesmith   schedule 28.03.2015