अपने नक्शे के बाद से संबंध तोड़ना हैं तो आप सिर्फ छोटे मानचित्र के माध्यम से लूप और में सम्मिलित कर सकते बड़ा:
let disjoint_merge m1 m2 =
if (IntMap.cardinal m1) < (IntMap.cardinal m2) then
IntMap.fold IntMap.add m1 m2
else
IntMap.fold IntMap.add m2 m1
घटना में है कि आप OCaml के एक पुराने संस्करण है कि cardinal
शामिल नहीं है का उपयोग कर रहे फ़ंक्शन आप हमेशा एक मानचित्र को हमेशा के माध्यम से फिर से शुरू करने के लिए चुन सकते हैं। क्या इसके बाद के संस्करण कोड करता है का सवाल है, यह का उपयोग करता है: सभी तत्वों के माध्यम से
val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
कौन सा मूल रूप से दोहराता एक नक्शा है, और एक समारोह है कि एक चाबी, मूल्य और प्रकार 'b
के कुछ अन्य चर लेता है और के बारे में कुछ रिटर्न कॉल उस प्रकार ('b
)। हमारे मामले में हम IntMap.add
फ़ंक्शन पास कर रहे हैं और यह अन्य चर हमारा दूसरा मानचित्र है। तो यह सभी तत्वों के माध्यम से पुनरावृत्त करता है और उन्हें दूसरे मानचित्र में जोड़ता है।
संपादित करें: आप से बेहतर कर रहे हैं बस कर रही:
let disjoint_merge m1 m2 =
IntMap.fold IntMap.add m1 m2
EDIT2: और भी बेहतर:
let disjoint_merge = IntMap.fold IntMap.add;;
मैं सिर्फ cardinal
के कार्यान्वयन को देखा और यह पेड़ चलता है और गिनती देता है। तो आकारों की जांच करके आप ओ (एन + एम + मिनट (एन, एम) लॉग (अधिकतम (एन, एम)) कर रहे हैं बस ओ (एन लॉग (एम) के बजाय)।
स्रोत
2010-09-20 18:58:35
जब कुंजी के लिए प्रकार 'int' है और आप विलय (विवादित या नहीं) मानचित्रों में रुचि रखते हैं, तो यह जांचने योग्य है कि पेट्रीसिया पेड़ के रूप में प्रतिनिधित्व किए गए मानचित्र आपकी आवश्यकता के लिए उपयुक्त हैं या नहीं। यहां एक कार्यान्वयन है: http://www.lri.fr/~filliatr/ftp/ocaml/ds/ptmap.ml.html –
वैसे, अगर उत्तर में से एक ने आपकी समस्या हल की है तो आपको इसे स्वीकार्य रूप से चिह्नित करना चाहिए। –