संयोग से मैंने वास्तव में एक व्यक्तिगत परियोजना के लिए सी # में एक बिट्री लागू किया था। वह मज़ेदार था। मैंने लेक्सिकोोग्राफिक रूप से आदेशित चर आकार (64 बाइट तक) की एक बिट बनाई, जिसमें कई चुनौतियां सामने आईं, विशेष रूप से यह पता लगाना कि भंडारण का एक पृष्ठ बहुत भरा या बहुत खाली था।
मेरी सलाह, ऐसा करने के बाद, एक अमूर्त परत बनाने के लिए है जो केवल एक सार तत्व के रूप में अपने सबसे अमूर्त रूप में btree एल्गोरिदम को कैप्चर करता है। एक बार जब मुझे उस फॉर्म में कैप्चर किए गए सभी बीटी नियम मिल गए, तो मैंने बेस क्लास को कई अलग-अलग तरीकों से विशेषीकृत किया: एक नियमित फिक्स्ड-की-साइज 2-3 बिट्री के रूप में, मेरे फैंसी वैरिएबल-साइज-कीटी बीटीआरआई में से एक के रूप में, और इसी तरह ।
प्रारंभ करने के लिए, किसी भी परिस्थिति में आप पॉइंटर्स के साथ ऐसा नहीं कर रहे हैं। असुरक्षित कोड शायद ही कभी आवश्यक है और कभी भी आसान नहीं है। केवल सबसे उन्नत सी # प्रोग्रामर सुरक्षा प्रणाली को बंद करना चाहिए; जब आप ऐसा करते हैं, आप प्रोग्राम की प्रकार और स्मृति सुरक्षा की ज़िम्मेदारी ले रहे हैं। यदि आप ऐसा करने के इच्छुक नहीं हैं, तो सुरक्षा प्रणाली चालू करें।
दूसरा, इस संरचना को बनाने का कोई कारण नहीं है। स्ट्रक्चर को सी # में मूल्य से कॉपी किया जाता है; एक btree नोड मूल्य नहीं है।
तीसरा, आपको नोड में चाबियों की संख्या रखने की आवश्यकता नहीं है; चाबियों की सरणी जानता है कि इसमें कितनी कुंजी हैं।
चौथा, मैं एक सरणी के बजाय List<T>
का उपयोग करूंगा; वे अधिक लचीला हैं।
पांचवां, आप तय करने की जरूरत है कि क्या नोड में या माता पिता में महत्वपूर्ण रहता है। किसी भी तरह से काम कर सकते हैं; मेरी वरीयता नोड में रहने की कुंजी के लिए है, क्योंकि मुझे नोड से जुड़े होने के रूप में कुंजी दिखाई देती है।
छठी, यह जानना सहायक है कि कोई बीटी नोड रूट है या नहीं; आप दो बूल रखने पर विचार कर सकते हैं, एक "क्या यह एक पत्ता है?" और एक "क्या यह जड़ है?" बेशक इसमें एक आइटम के साथ एक ब्रीटी में एक नोड होता है जो पत्ती और जड़ दोनों होता है।
सातवां, आप शायद इस बात को उत्परिवर्तनीय बनाने जा रहे हैं; आम तौर पर एक सी # कक्षा पर सार्वजनिक उत्परिवर्तनीय फ़ील्ड नहीं बनाता है। आप उन्हें गुण बनाने पर विचार कर सकते हैं। इसके अलावा, बच्चों की सूची जा बड़े हो सकते हैं और सिकुड़, लेकिन इसकी पहचान परिवर्तन नहीं होता है, तो यह referentially केवल पढ़ने के लिए करते हैं:
:
तो मैं शायद अपने बुनियादी नोड के रूप में संरचना होगा
class Node
{
public int Key { get; set; }
public bool IsRoot { get; set; }
public bool IsLeaf { get; set; }
private List<Node> children = new List<Node>();
public List<Node> Children { get { return this.children; } }
}
समझ में आओ?
आप कक्षा के बजाय संरचना का उपयोग क्यों करना चाहते हैं? – CodesInChaos
बेशक आप बी पेड़ के लिए सी # – Adrian
सी # में असुरक्षित कोड का उपयोग करने की कोशिश न करें जब तक कि आप एक विशेषज्ञ न हों; आप इसे गलत समझेंगे और यह दर्दनाक और मुश्किल होगा। इसके बजाय, पहले चीजों को करने का सुरक्षित तरीका जानें; सी # डिज़ाइन किया गया है ताकि चीजों को करने का सुरक्षित तरीका असुरक्षित तरीके से लगभग हमेशा आसान हो। –