परिवार के पेड़ के सॉफ्टवेयर में चक्र


1594

मैं कुछ पारिवारिक ट्री सॉफ़्टवेयर (C ++ और Qt में लिखा गया) का डेवलपर हूं। जब तक मेरे किसी ग्राहक ने मुझे बग रिपोर्ट नहीं दी, मुझे कोई समस्या नहीं थी। समस्या यह है कि ग्राहक की अपनी बेटी के साथ दो बच्चे हैं, और, परिणामस्वरूप, वह त्रुटियों के कारण मेरे सॉफ़्टवेयर का उपयोग नहीं कर सकता है।

वे त्रुटियाँ मेरे विभिन्न अभिकथनों और अपरिवर्तनों के परिणाम स्वरूप फैमिली ग्राफ को संसाधित करने के लिए हैं (उदाहरण के लिए, एक चक्र चलने के बाद, कार्यक्रम में कहा गया है कि X, Y का पिता और दादा दोनों नहीं हो सकता है)।

मैं सभी डेटा अभिक्रियाओं को हटाए बिना उन त्रुटियों को कैसे हल कर सकता हूं?



30
यदि आप अपने परिवार के पेड़ को बहुत पीछे की ओर ट्रेस करते हैं, तो आप इस समस्या को बहुत अधिक बार मारेंगे, जितना आप चाहते हैं। पेड़ का प्रतिनिधित्व करना दर्दनाक हो सकता है लेकिन अंततः अधिक सही होगा।
थॉमस

55
आपको असंभव चीजों के लिए, केवल असंभव चीजों के लिए जोर नहीं जोड़ना चाहिए। साइकिल स्पष्ट चीजें हैं जो एक परिवार के पेड़ के ग्राफ में संभव नहीं हैं ... कोई भी किसी भी विधि के माध्यम से अपना स्वयं का पूर्वज नहीं हो सकता है। ये अन्य दावे सिर्फ फर्जी हैं और इन्हें हटा दिया जाना चाहिए।
पगोड

44
यह पालतू प्रजनन की दुनिया में एक मूर्खतापूर्ण सवाल नहीं है। पिता से बेटी, मां से बेटे, बहन से भाई, पोते से पोते और वहां से मानक तकनीक है, और पालतू प्रजनकों को परिवार के पेड़ के सॉफ्टवेयर की भी आवश्यकता है। "शुद्ध-नस्ल" मेरा ¤% # &।
कलीसिन

31
विक्टोरियन इंग्लैंड में पहले चचेरे भाइयों से शादी करना बहुत आम था, खासकर ऊपरी वर्गों के बीच (यह परिवार के भीतर पैसा रखने का एक शानदार तरीका था)। उदाहरण के लिए, चार्ल्स डार्विन ने अपने पहले चचेरे भाई एम्मा वेगवुड से शादी की। किसी भी परिवार के पेड़ के सॉफ्टवेयर को इस तरह की स्थितियों का समर्थन करने की आवश्यकता है।
rtperson

जवाबों:


727

ऐसा लगता है कि आप (और / या आपकी कंपनी) एक बुनियादी गलतफहमी है कि एक परिवार का पेड़ क्या माना जाता है।

मुझे स्पष्ट करने दें, मैं एक ऐसी कंपनी के लिए भी काम करता हूं जिसके पास (उसके उत्पादों में से एक) अपने पोर्टफोलियो में एक पारिवारिक पेड़ है, और हम इसी तरह की समस्याओं से जूझ रहे हैं।

समस्या, हमारे मामले में, और मैं आपके मामले को भी मान लेता हूं, GEDCOM प्रारूप से आता है जो एक परिवार के बारे में बहुत राय है। हालांकि इस प्रारूप में कुछ गंभीर गलतफहमी है कि वास्तव में एक परिवार का पेड़ कैसा दिखता है।

GEDCOM में कई मुद्दे हैं, जैसे कि समान यौन संबंधों, अनाचार, आदि के साथ असंगतता ... जो वास्तविक जीवन में अधिक बार होता है, जिसकी आप कल्पना करेंगे (विशेषकर जब 1700-1800 के समय में वापस जा रहे हों)।

हमने अपने परिवार के पेड़ को वास्तविक दुनिया में क्या होता है के लिए मॉडल किया है: घटनाएँ (उदाहरण के लिए, जन्म, शादी, सगाई, यूनियन, मृत्यु, गोद लेने, आदि)। हम इन पर कोई प्रतिबंध नहीं लगाते हैं, केवल तार्किक रूप से असंभव लोगों को छोड़कर (उदाहरण के लिए, किसी का अपना माता-पिता नहीं हो सकता है, संबंधों को दो व्यक्तियों की आवश्यकता है, आदि ...)

मान्यताओं की कमी हमें अधिक "वास्तविक दुनिया", सरल और अधिक लचीला समाधान देती है।

इस विशिष्ट मामले के लिए, मैं सुझाव दूंगा कि वे सार्वभौमिक रूप से पकड़ नहीं रखते।

मुद्दों को प्रदर्शित करने के लिए (जो उत्पन्न होगा) मैं एक ही नोड को आवश्यकतानुसार कई बार खींचने का सुझाव दूंगा, उनमें से किसी एक का चयन करने पर सभी प्रतियों को जलाकर दोहराव पर संकेत करना।


32
यह सही दृष्टिकोण की तरह दिखता है, और अधिक जटिल समस्याओं का पता लगाने के लिए इसका विस्तार करना आसान है। आप घटनाओं के बीच "बी से पहले हुआ ए" रिश्तों का एक सेट बना सकते हैं। उदाहरण के लिए, एक व्यक्ति का जन्म किसी भी अन्य घटनाओं से पहले हुआ था। यह एक निर्देशित ग्राफ है। आप तब जाँच सकते हैं कि ग्राफ़ में कोई चक्र नहीं है। StackOverflow पर यह प्रश्न देखें। समय यात्रा का आविष्कार होने तक यह ठीक होना चाहिए।
पॉल हैरिसन

41
@ पॉल-हैरिसन अगर ऐसा है तो केवल इतना आसान है। पुराने रिकॉर्ड (यहां तक ​​कि नए भी) में तारीख की विसंगतियां हैं। जन्म से पहले बपतिस्मा, कई जन्म रिकॉर्ड आदि ... तो एक हद तक, आधिकारिक रिकॉर्ड में, समय यात्रा है। हम इस असंगत डेटा की अनुमति देते हैं। हम उपयोगकर्ताओं को यह इंगित करने की अनुमति देते हैं कि डुप्लिकेट के मामले में एप्लिकेशन को "जन्म रिकॉर्ड" पर क्या विचार करना चाहिए। और हम टूटी हुई समयसीमाओं का संकेत देंगे यदि मिला
बर्ट गोएथलस

38
@ बेन-वॉइग्ट GEDCOM द चर्च ऑफ जीसस क्राइस्ट ऑफ लैटर-डे सेंट्स द्वारा बनाया गया एक प्रारूप है। विनिर्देश स्पष्ट रूप से बताता है कि विवाह (MARR) पुरुषों और महिलाओं के बीच होना है। समान यौन विवाह या अनाचार के लिए ASSO टैग का उपयोग किया जाना चाहिए (ASSOCIATES), जिसका उपयोग दोस्ती या पड़ोसी होने का संकेत देने के लिए भी किया जाता है। यह स्पष्ट है कि एक ही सेक्स विवाह इस कल्पना के भीतर द्वितीय श्रेणी का संबंध है। एक अधिक तटस्थ कल्पना पुरुष महिला संबंधों की मांग नहीं करेगी।
बर्ट गोएथल्स 21

1
@ बर्ट गोएथल्स: आप कुछ कार्यक्रमों के साथ GEDCOM को भ्रमित कर रहे हैं जो समान-विवाह (पीएएफ, लिगेसी) का समर्थन नहीं करते हैं। GEDCOM "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @" का निर्माण नहीं करता है, और यदि आपका सॉफ़्टवेयर चुनता है तो इसी तरह के विवाह का समर्थन करता है।
पियरे

1
@ पियरे आप सिस्टम को धोखा दे सकते हैं। यह सीधे 5.5.1 डॉक्स से है: "MARR {MARRIAGE}: = एक कानूनी, सामान्य कानून, या एक पुरुष और एक महिला के पति और पत्नी के रूप में एक परिवार इकाई बनाने की प्रथागत घटना।" ( homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm ) जैसा कि आप देख सकते हैं, यहाँ कोई भी समान विवाह नहीं होता है।
बर्ट गोएथल्स

563

अपने दावे को आराम दें।

नियमों को बदलकर नहीं, जो कि आपके डेटा को दर्ज करने में गलतियों को पकड़ने में आपके ग्राहकों के 99.9% के लिए बहुत उपयोगी है।

इसके बजाय, इसे "किसी भी तरह से जोड़ें" के साथ चेतावनी में "संबंध नहीं जोड़ सकते" त्रुटि से बदलें।


143
जब एक बहुत ही असंभावित स्थिति का सामना करना पड़ता है, अर्थात, जहां एक उपयोगकर्ता आमतौर पर केवल गलती से करेगा, तो उपयोगकर्ता को चेतावनी दिखाना एक अच्छा विचार है। यह अच्छी प्रतिक्रिया है। लेकिन तब उपयोगकर्ता को आगे बढ़ने दें यदि वे वास्तव में निश्चित हैं कि वे चाहते हैं। तो मुझे लगता है कि यह एक अच्छा जवाब है, भले ही यह नट और बोल्ट में कैसे न हो।
थोमसट्रेटर

15
अच्छा उत्तर! मुझे आश्चर्य है कि इस तरह के सॉफ्टवेयर "मैं अपना दादाजी हूं" ( youtube.com/watch?v=eYlJH81dSiw ) स्थिति को कैसे संभालूंगा ?
झोर नसीबोव

4
यह वास्तव में एक जवाब नहीं है, क्योंकि मुझे लगता है कि समस्या वास्तव में पेड़ को फंसाने से आती है? हालाँकि, यह एक अच्छा सुझाव है।
bdwakefield

3
@bwwakefield: प्रश्न था "मैं सभी डेटा अभिक्रियाओं को हटाए बिना इन त्रुटियों को कैसे हल करूं?" मुझे विश्वास है कि मैंने इसका उत्तर दिया है।
बेन वोइगट

2
@ पर यह निर्भर करता है कि दावे किस लिए हैं। यदि वे अनंत छोरों या घातक त्रुटियों को होने से रोकते हैं, तो आप प्रभावी रूप से अभिकथन को हटाने का सुझाव दे रहे हैं। यदि वे किसी संभावित गलती के उपयोगकर्ता को चेतावनी देने के लिए बस वहां हैं, तो आपका उत्तर एक अच्छा है।
rm999

224

यहां परिवार के पेड़ों के साथ समस्या है: वे पेड़ नहीं हैं। वे चक्रीय रेखांकन या डीएजी निर्देशित हैं। यदि मैं मानव प्रजनन के जीव विज्ञान के सिद्धांतों को सही ढंग से समझता हूं, तो कोई चक्र नहीं होगा।

जहां तक ​​मुझे पता है, यहां तक ​​कि ईसाई भी चचेरे भाइयों के बीच विवाह (और इस तरह से बच्चे) को स्वीकार करते हैं, जो परिवार के पेड़ को एक परिवार डीएजी में बदल देगा।

कहानी का नैतिक है: सही डेटा संरचनाओं का चयन करें।


7
इसमें प्रत्येक नोड के 1 या 2 अधिकतम नोड्स को इन विट्रो और यौन प्रजनन के लिए इंगित करते हुए आगे के प्रतिबंध की आवश्यकता होगी। हालांकि वास्तविक जीवन के लिए और अधिक सही होने के लिए, आप पिता की ओर अनिश्चित अनिश्चितता के लिए कई धराशायी लाइनों की अनुमति दे सकते हैं (यह हमेशा स्पष्ट है कि मां कौन है, लेकिन केवल डीएनए परीक्षण यह सुनिश्चित कर सकता है कि पिता कौन है, और यह शायद ही आज भी किया जाता है), या यहां तक ​​कि दोनों को अपनाने के लिए भी ध्यान में रखा जाता है।
manixrock

7
@manixrock - चूँकि यह प्रश्न दुर्लभ मामलों के बारे में है, इसलिए मैं यह कहना चाहूँगा कि यह हमेशा स्पष्ट नहीं है कि माँ कौन है। गोद लेने, छोड़ दिया बच्चों, सरोगेट माताओं, आदि सभी मामलों को जटिल कर सकते हैं।
पीटर रिक '

9
यह जरूरी नहीं कि यह चक्रीय है, है? मैन शादी-दादी।
एड रोपल

13
दादी से शादी करने वाला आदमी खुद को अपना दादा नहीं बनाएगा और एक चक्र को जोड़ देगा। यदि उनके बच्चे हैं, तो यह एक गैर-साइकिलिंग नियमित ग्राफ एज होगा।
exDM69

11
यह वास्तव में दो एडीजी है। पेरेंटेज ग्राफ और कानूनी संबंध ग्राफ है। आमतौर पर एक ही, लेकिन एक से अधिक विचलन उम्मीद कर सकते हैं।
JSacksteder

115

मुझे लगता है कि आपके पास कुछ मूल्य है जो विशिष्ट रूप से एक व्यक्ति की पहचान करता है, जिस पर आप अपने चेक को आधार बना सकते हैं।

यह पेचीदा है। यह मानते हुए कि आप संरचना को एक पेड़ रखना चाहते हैं, मेरा सुझाव है:

यह मान लें: Aउसकी अपनी बेटी के साथ बच्चे हैं।

Aके रूप में Aऔर कार्यक्रम के लिए खुद को जोड़ता है B। एक बार पिता की भूमिका में, आइए इसे प्रेमी कहें।

एक is_same_for_out()फ़ंक्शन जोड़ें जो आपके प्रोग्राम के आउटपुट जनरेटिंग हिस्से को बताता है कि Bआंतरिक रूप से जाने वाले सभी लिंक Aडेटा की प्रस्तुति पर जा रहे हैं ।

यह उपयोगकर्ता के लिए कुछ अतिरिक्त काम करेगा, लेकिन मुझे लगता है कि आईटी को लागू करना और बनाए रखना अपेक्षाकृत आसान होगा।

उस से बिल्डिंग, आप कोड सिंकिंग पर काम कर सकते थे Aऔर Bविसंगतियों से बच सकते थे।

यह समाधान निश्चित रूप से सही नहीं है, लेकिन पहला दृष्टिकोण है।


9
संभवतः ऐसे "प्रॉक्सी" नोड वास्तव में उपयुक्त समाधान हैं। हालाँकि मुझे इस बात का कोई अंदाजा नहीं है कि बिना यूजर को बताए यूजर इंटरफेस में कैसे रखा जा सकता है। मैं आपको बता सकता हूं कि वास्तविक लोगों (विशेषकर आपके ग्राहकों) के साथ व्यवहार करने वाला सॉफ्टवेयर लिखना आसान नहीं है।
पार्टिक होस

6
यह कभी खत्म नहीं होता - बी का नया बेटा उसका अपना चाचा होगा। मैं कार्यक्रम के लिए एक पूर्ण वापसी पर विचार करूंगा!
बो पर्सन

3
@Will A: और फिर पता चलता है कि वह भी अपनी माँ है, और समय एजेंसी में अपने छोटे स्व की भर्ती करती है?
नल सेट

2
एक प्रणाली के भीतर डेटा का डुप्लीकेशन (और सिंकिंग) खराब अभ्यास है। यह इंगित करता है कि समाधान उप इष्टतम है और इस पर पुनर्विचार किया जाना चाहिए। यदि अतिरिक्त (डुप्लिकेट) नोड्स बनाने की आवश्यकता होगी, तो इसे एक प्रॉक्सी के रूप में इंगित करें और डेटा को पढ़ें और मूल नोड को लिखें।
बर्ट गोएथल्स

84

आपको इस बात पर ध्यान देना चाहिए कि वास्तव में आपके सॉफ़्टवेयर के लिए क्या मूल्य है । क्या एक उपभोक्ता के लिए काम करने में लगने वाला समय लाइसेंस की कीमत के बराबर है? शायद नहीं।

मैं आपको इस ग्राहक से माफी मांगने की सलाह देता हूं, उसे बताएं कि उसकी स्थिति आपके सॉफ्टवेयर के दायरे से बाहर है और उसे धनवापसी जारी करें।


3
सच सच। लेकिन अन्य परेशानियों के साथ अन्य संभावित समस्याओं का भी वजन करें जो दूसरों ने लाई हैं।
प्रो। फाल्कन कॉन्ट्रैक्ट ने

2
बेशक। तर्क यह है: यदि यह एक गैर-महत्वपूर्ण अनुप्रयोग पर एक दुर्लभ किनारे का मामला है, तो आपको कुछ भी ठीक करने या लागू करने की आवश्यकता नहीं है। यदि यह वास्तव में आपके उपयोगकर्ताओं को नुकसान पहुंचा रहा है, तो इस पर काम करने में मूल्य है।
क्रिस्टोफेल

10
संभवत: हर किसी को कहीं न कहीं अपने वंश में अनाचार का कोई मामला है। यदि आप एक परिवार के इतिहास (बहुत) को खोदते हैं तो आप उस टक्कर से टकराएंगे।
डेटेनवुल्फ

1
कुछ अजीब स्थिति (वंशानुगत रॉयल्टी, फ्रिट्ज आदि) की वंशावली वृक्ष बनाना सॉफ्टवेयर का वैध उपयोग है।
बुलवेटर

1
एक परिवार के पेड़ का सॉफ्टवेयर जो दूसरे चचेरे भाइयों को शादी करने की अनुमति नहीं देगा, बेकार है। लगभग सभी परिवारों के पास इसका एक मामला है। यही कारण है कि मुझे लगता है कि मूल उदाहरण प्रभाव के लिए बना है।
फजियॉ76

79

आपको परीक्षण के मामले के रूप में एटराइड्स परिवार (या तो आधुनिक, दून , या प्राचीन, ओडिपस रेक्स ) स्थापित करना चाहिए । आप परीक्षण मामले के रूप में स्वच्छता डेटा का उपयोग करके बग नहीं पाते हैं।


2
अफसोस की बात है कि, बहुत से लोग पहले किनारे के मामलों के बजाय 'ओके' डेटा के बारे में सोचते हैं जो उनके सिस्टम को तोड़ते हैं।
साजा

59

यह एक कारण है कि "गो" जैसी भाषाओं में जोर नहीं है। उनका उपयोग उन मामलों को संभालने के लिए किया जाता है जिनके बारे में आपने शायद नहीं सोचा था। आपको केवल असंभव को स्वीकार करना चाहिए, न कि केवल असंभव को । उत्तरार्द्ध करना वही है, जो बुरी प्रतिष्ठा को दर्शाता है। हर बार जब आप टाइप करते हैं assert(, तो दस मिनट के लिए दूर चलें और वास्तव में इसके बारे में सोचें।

आपके विशेष रूप से परेशान करने वाले मामले में, यह अनुमान लगाने योग्य और भयावह दोनों है कि इस तरह के दावे दुर्लभ लेकिन संभव परिस्थितियों में फर्जी होंगे। इसलिए, इसे अपने ऐप में हैंडल करें, यदि केवल यह कहने के लिए कि "यह सॉफ़्टवेयर आपके द्वारा प्रस्तुत परिदृश्य को संभालने के लिए डिज़ाइन नहीं किया गया था"।

यह कहते हुए कि आपके महान, महान, महान दादाजी आपके पिता के रूप में असंभव है, एक उचित बात है।

अगर मैं एक परीक्षण कंपनी के लिए काम कर रहा था जिसे आपके सॉफ़्टवेयर का परीक्षण करने के लिए काम पर रखा गया था, तो निश्चित रूप से मैंने उस परिदृश्य को प्रस्तुत किया होगा। क्यों? प्रत्येक किशोर अभी तक बुद्धिमान 'उपयोगकर्ता' एक ही काम करने जा रहा है और परिणामी 'बग रिपोर्ट' में उलझा हुआ है।


5
जब 'जोर का उपयोग करने के लिए' के ​​साथ सहमत हों; यह न देखें कि यह किस प्रकार से संबंधित है 'कुछ भाषाओं में मुखरता है, गो नहीं।'
फ़ूजी

2
@ रीड ह्यू - कभी-कभी कंपाइलर असंभव को संभव बनाते हैं ... संभव है। पेट के कुछ संस्करण लगता है -10 == 10 एब्स में () कार्यान्वयन।
टिम पोस्ट

2
@ रीड ह्यू: अभिकथन का पूरा बिंदु दस्तावेज़ और परीक्षण की स्थिति है जो हमेशा सही (या गलत) होना चाहिए। यह आपको (और अन्य) चीजों को "फिक्सिंग" से इस तरह से रखने में मदद करता है ताकि उन असंभव मामले सामने आए, तब वे स्पष्ट रूप से (सूक्ष्मता के बजाय) ऐप को तोड़ देंगे। यदि "असंभव" मामले के प्रकट होने का एक वैध कारण है, तो आपने बहुत अधिक जोर दिया है।
cHao

1
@cHao @Tim पोस्ट मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि क्यों न होना मुखर होना एक अच्छी बात है क्योंकि आप में से अधिकांश मानते हैं कि जोर देना जरूरी है।
अर्लेन

5
अभिकथन (या अभिकथन जैसा कोड) अप्रासंगिक है। गो जैसी भाषाओं में कोड डेटा की संरचना के बारे में धारणा बना सकता है; यह सिर्फ उन मान्यताओं के साथ दस्तावेज़ों को लागू और लागू नहीं कर सकता है। नीचे पंक्ति: आवेदन में एक बग है।
टॉमी मैकगायर 20

41

मुझे इस तरह के पेचीदा हालात पर टिप्पणी करने से नफरत है, लेकिन आपके सभी अपरिवर्तनीयों को फिर से पेश न करने का सबसे आसान तरीका यह है कि आप अपने ग्राफ़ में एक प्रेत शीर्ष बनाएँ जो कि अनाड़ी पिता के लिए एक प्रॉक्सी के रूप में काम करता है।


37

इसलिए, मैंने फैमिली ट्री सॉफ्टवेयर पर कुछ काम किया है। मुझे लगता है कि आप जिस समस्या को हल करने की कोशिश कर रहे हैं, वह यह है कि आपको अनंत छोरों में पेड़ के बिना चलने में सक्षम होने की आवश्यकता है - दूसरे शब्दों में, पेड़ को चक्रीय होने की आवश्यकता है।

हालाँकि, ऐसा लगता है कि आप यह मान रहे हैं कि किसी व्यक्ति और उनके पूर्वजों के बीच केवल एक ही रास्ता है। यह गारंटी देगा कि कोई चक्र नहीं हैं, लेकिन बहुत सख्त है। जैविक रूप से बोलना, वंशज एक निर्देशित चक्रीय ग्राफ (DAG) है। आपके पास जो मामला है, वह निश्चित रूप से पतित मामला है, लेकिन उस तरह का काम बड़े पेड़ों पर हर समय होता है।

उदाहरण के लिए, यदि आप पीढ़ी ^ पर 2 ^ n पूर्वजों को देखते हैं, यदि कोई ओवरलैप नहीं था, तो आपके पास 1000 ईस्वी में पूर्वजों की तुलना में अधिक लोग जीवित होंगे। तो, वहाँ ओवरलैप होना चाहिए।

हालाँकि, आप ऐसे चक्र भी प्राप्त करते हैं जो अमान्य हैं, बस खराब डेटा है। यदि आप पेड़ पर चढ़ रहे हैं, तो चक्रों से निपटा जाना चाहिए। आप इसे प्रत्येक व्यक्तिगत एल्गोरिथ्म में, या लोड पर कर सकते हैं। मैंने इसे लोड पर किया।

एक पेड़ में सच्चे चक्रों को खोजना कुछ तरीकों से किया जा सकता है। गलत तरीका यह है कि दिए गए व्यक्ति से प्रत्येक पूर्वजों को चिह्नित करें, और जब पता लगाया जाए, तो जिस व्यक्ति के साथ आप अगले चरण पर जा रहे हैं वह पहले से ही चिह्नित है, तो लिंक को काट दें। यह संभावित सटीक रिश्तों को गंभीर रूप से प्रभावित करेगा। ऐसा करने का सही तरीका प्रत्येक व्यक्ति से शुरू करना है, और प्रत्येक पूर्वज को उस व्यक्ति के मार्ग के साथ चिह्नित करना है। यदि नए पथ में उपपथ के रूप में वर्तमान पथ है, तो यह एक चक्र है, और इसे तोड़ दिया जाना चाहिए। आप वेक्टर <bool> (MFMF, MFFFMF, आदि) के रूप में पथों को संग्रहीत कर सकते हैं जो तुलना और भंडारण को बहुत तेज बनाता है।

चक्रों का पता लगाने के कुछ अन्य तरीके हैं, जैसे दो पुनरावृत्तियों को बाहर भेजना और यह देखना कि क्या वे कभी उपसमुच्चय परीक्षण से टकराते हैं, लेकिन मैंने स्थानीय भंडारण पद्धति का उपयोग करके समाप्त किया।

यह भी ध्यान दें कि आपको वास्तव में लिंक को अलग करने की आवश्यकता नहीं है, आप इसे सामान्य लिंक से एक 'कमजोर' लिंक में बदल सकते हैं, जिसका आपके कुछ एल्गोरिदम द्वारा पालन नहीं किया जाता है। आप यह भी ध्यान रखना चाहेंगे कि कमजोर होने के लिए कौन सा लिंक चुनना है; कभी-कभी आप यह पता लगा सकते हैं कि जन्मतिथि की जानकारी को देखते हुए साइकिल को कहां से तोड़ा जाना चाहिए, लेकिन अक्सर आप कुछ भी पता नहीं लगा सकते क्योंकि इतना डेटा गायब है।


उन मान्यताओं के बारे में सावधान; एक नर और एक मादा जनक एक दिया है, जब लोग अनुकूलन नहीं है, या lesibans जो माता-पिता के रूप में खुद को निकट भविष्य में वे भी वास्तव में करने के लिए सक्षम हो सकता है हो सकता है , जैविक रूप से माता-पिता लड़कियों की कम से कम। उस बात के लिए, यदि हम मनुष्यों पर डोली लगाते हैं, तो भी यह धारणा "एक व्यक्ति के दो अलग-अलग माता-पिता हैं" बाहर है।
अग्रज

1
@ आराजग, हां, इसीलिए मैंने चक्र का पता लगाने के लिए "जैविक रूप से बोलना" निर्दिष्ट किया। यहां तक ​​कि जैविक रूप से, सरोगेट मां और कृत्रिम गर्भाधान जैसे कई संभावित मुद्दे हैं। यदि आप माता-पिता को परिभाषित करने के लिए गोद लेने और अन्य गैर-जैविक तरीकों की भी अनुमति देते हैं, तो एक पेड़ में एक वैध वास्तविक चक्र होना संभव है - उदाहरण के लिए, शायद कोई अपने दादा-दादी को गोद लेता है जब वे बूढ़े हो जाते हैं और अब खुद की देखभाल करने में सक्षम नहीं होते हैं । लोगों के पारिवारिक जीवन के बारे में धारणा बनाना हमेशा जटिल होता है। लेकिन सॉफ्टवेयर लिखते समय आपको कुछ धारणाएँ बनाने की आवश्यकता होती है ..
tfinniga

36

एक मूर्खतापूर्ण सवाल के लिए एक और नकली गंभीर जवाब:

वास्तविक उत्तर यह है, एक उपयुक्त डेटा संरचना का उपयोग करें। मानव वंशावली को पूरी तरह से बिना चक्र वाले शुद्ध वृक्ष का उपयोग करके व्यक्त नहीं किया जा सकता है। आपको किसी प्रकार के ग्राफ का उपयोग करना चाहिए। इसके अलावा, इसके साथ किसी भी आगे जाने से पहले एक मानवविज्ञानी से बात करें, क्योंकि बहुत सी अन्य जगह समान हैं वंशावली को मॉडल करने की कोशिश की जा सकती है, यहां तक ​​कि "पश्चिमी पितृसत्तात्मक एकांगी विवाह" के सबसे सरल मामले में भी।

यहां तक ​​कि अगर हम स्थानीय रूप से वर्जित रिश्तों को अनदेखा करना चाहते हैं, तो यहां चर्चा की गई है, एक परिवार के पेड़ में चक्रों को पेश करने के लिए पूरी तरह से कानूनी और पूरी तरह से अप्रत्याशित तरीके हैं।

उदाहरण के लिए: http://en.wikipedia.org/wiki/Cousin_marriage

असल में, चचेरे भाई की शादी न केवल सामान्य और अपेक्षित है, यही कारण है कि दुनिया भर में 6 अरब की आबादी के हजारों छोटे परिवार समूह से मनुष्य चले गए हैं। यह किसी अन्य तरीके से काम नहीं कर सकता है।

वंशावली, परिवार और वंश की बात आती है तो वास्तव में बहुत कम सार्वभौमिक हैं। मानदंडों के बारे में लगभग कोई सख्त धारणा यह सुझाव देती है कि चाची कौन हो सकती है, या कौन विवाह कर सकता है या विरासत के उद्देश्य से किस तरह बच्चों को वैध ठहराया जाता है, दुनिया या इतिहास में कहीं न कहीं कुछ अपवादों से परेशान हो सकते हैं।


9
आपकी टिप्पणी ने मुझे बहुविवाह के बारे में सोचा। वंशावली सॉफ्टवेयर है कि केवल यौन प्रजनन मॉडल शुक्राणु और अंडे से जुड़े नाम की आवश्यकता हो सकती है, लेकिन परिवार की संरचना की व्यापक परिभाषा नहीं है।
स्टीव कालेमकिविज़

वंशावली सॉफ़्टवेयर अक्सर मॉडल में एक से अधिक जीवनसाथी की अनुमति देगा। दृश्य में आप मॉडल कैसे प्रदर्शित करते हैं, यह एक कार्यक्रम के भीतर व्यापक रूप से भिन्न होता है, यहां तक ​​कि प्रदान किए गए "मोड" पर निर्भर करता है।
टॉड हॉपकिंसन

20

संभावित कानूनी निहितार्थ एक तरफ, यह निश्चित रूप से लगता है कि आपको परिवार के पेड़ पर एक 'नोड' का इलाज करने की आवश्यकता है जो पूर्ववर्ती व्यक्ति के बजाय यह मानते हैं कि नोड एक-और-केवल व्यक्ति हो सकता है।

क्या पेड़ के नोड में एक व्यक्ति के साथ-साथ उत्तराधिकारी भी शामिल हैं - और फिर आप उस पेड़ के नीचे एक और नोड को गहरा कर सकते हैं जिसमें अलग-अलग उत्तराधिकारियों के साथ एक ही व्यक्ति शामिल है।


13

कुछ जवाबों ने अभिकथन / अपरिवर्तनीयों को बनाए रखने के तरीके दिखाए हैं, लेकिन ऐसा लगता है कि यह जोर / दुरुपयोग का है। दावे यह सुनिश्चित करने के लिए हैं कि जो कुछ सच होना चाहिए वह सच है, और अपरिवर्तनीयों को यह सुनिश्चित करना है कि जो परिवर्तन नहीं होना चाहिए वह नहीं बदलता है।

यहाँ जो आप मुखर कर रहे हैं वह यह है कि अनाचार संबंध मौजूद नहीं है। जाहिर है वे कर अस्तित्व है, तो अपने दावे अमान्य है। आप इस दावे के इर्द-गिर्द काम कर सकते हैं, लेकिन असली बग़ावत में ही है। जोर हटा दिया जाना चाहिए।



5

वंशावली डेटा चक्रीय है और एक चक्रीय ग्राफ में फिट नहीं होता है, इसलिए यदि आपके पास चक्रों के खिलाफ जोर है तो आपको उन्हें हटा देना चाहिए।

कस्टम दृश्य बनाए बिना इसे एक दृश्य में संभालने का तरीका चक्रीय माता-पिता को "भूत" माता-पिता के रूप में मानना ​​है। दूसरे शब्दों में, जब एक व्यक्ति एक ही व्यक्ति के लिए पिता और दादा दोनों होता है, तो दादाजी नोड को सामान्य रूप से दिखाया जाता है, लेकिन पिता नोड को "भूत" नोड के रूप में प्रस्तुत किया जाता है जिसमें एक साधारण लेबल होता है जैसे ("दादा देखें") ) और दादाजी को इंगित करता है।

गणना करने के लिए आपको चक्रीय रेखांकन को संभालने के लिए अपने तर्क को बेहतर बनाने की आवश्यकता हो सकती है ताकि चक्र होने पर एक बार से अधिक नोड का दौरा न हो।


4

सबसे महत्वपूर्ण बात यह है avoid creating a problem, इसलिए मेरा मानना ​​है कि आपको एक चक्र से बचने के लिए एक सीधा संबंध का उपयोग करना चाहिए ।

जैसा कि @markmywords ने कहा है, #include "fritzl.h"।

अंत में मुझे कहना होगा recheck your data structure। हो सकता है कि वहां कुछ गलत हो रहा हो (शायद एक द्विदिश से जुड़ी सूची आपकी समस्या को हल कर देती है)।


4

दावे वास्तविकता से नहीं बचे हैं

आमतौर पर दावे वास्तविक दुनिया के डेटा के संपर्क से बचे नहीं हैं। यह तय करने के लिए सॉफ्टवेयर इंजीनियरिंग की प्रक्रिया का एक हिस्सा है कि आप किस डेटा से निपटना चाहते हैं और कौन से दायरे से बाहर हैं।

चक्रीय पारिवारिक रेखांकन

परिवार के बारे में "पेड़" (वास्तव में यह चक्र सहित पूर्ण विकसित ग्राफ़ हैं), एक अच्छा किस्सा है:

मैंने एक विधवा से विवाह किया, जिसकी एक बड़ी बेटी थी। मेरे पिता, जो अक्सर हमसे मिलने जाते थे, मेरी सौतेली बेटी के प्यार में पड़ गए और उससे शादी कर ली। नतीजतन, मेरे पिता मेरे बेटे बन गए, और मेरी बेटी मेरी मां बन गई। कुछ समय बाद, मैंने अपनी पत्नी को एक बेटा दिया, जो मेरे पिता का भाई था, और मेरे चाचा का। मेरे पिता की पत्नी (जो मेरी बेटी और मेरी मां भी है) को एक बेटा हुआ। परिणामस्वरूप, मुझे उसी व्यक्ति में एक भाई और एक पोता मिला। मेरी पत्नी अब मेरी दादी है, क्योंकि वह मेरी माँ की माँ है। इसलिए मैं अपनी पत्नी का पति हूं, और साथ ही अपनी पत्नी का सौतेला पोता हूं। दूसरे शब्दों में, मैं अपना दादा हूं।

चीजें तब और भी अजीब हो जाती हैं, जब आप सरोगेट्स या "फजी फादरहुड" को ध्यान में रखते हैं।

उससे कैसे निपटा जाए

बाहर के दायरे के रूप में चक्रों को परिभाषित करें

आप तय कर सकते हैं कि आपके सॉफ्टवेयर को ऐसे दुर्लभ मामलों से नहीं निपटना चाहिए। यदि ऐसा कोई मामला होता है, तो उपयोगकर्ता को एक अलग उत्पाद का उपयोग करना चाहिए। यह अधिक सामान्य मामलों से निपटने के लिए और अधिक मजबूत बनाता है, क्योंकि आप अधिक जोर और एक सरल डेटा मॉडल रख सकते हैं।

इस मामले में, अपने सॉफ़्टवेयर में कुछ अच्छे आयात और निर्यात सुविधाएँ जोड़ें, ताकि उपयोगकर्ता आसानी से आवश्यक होने पर एक अलग उत्पाद में माइग्रेट कर सके।

मैनुअल संबंधों की अनुमति दें

आप उपयोगकर्ता को मैन्युअल संबंध जोड़ने की अनुमति दे सकते हैं। ये संबंध "प्रथम श्रेणी के नागरिक" नहीं हैं, यानी सॉफ्टवेयर उन्हें जैसा भी लेता है, उन्हें चेक नहीं करता है और न ही मुख्य डेटा मॉडल में उन्हें संभालता है।

उपयोगकर्ता हाथ से दुर्लभ मामलों को संभाल सकता है। आपका डेटा मॉडल अभी भी काफी सरल रहेगा और आपके दावे जीवित रहेंगे।

मैन्युअल संबंधों से सावधान रहें। उन्हें पूरी तरह से कॉन्फ़िगर करने योग्य बनाने के लिए एक प्रलोभन है और इसलिए पूरी तरह से कॉन्फ़िगर करने योग्य डेटा मॉडल बनाएं। यह काम नहीं करेगा: आपका सॉफ्टवेयर स्केल नहीं करेगा, आपको अजीब कीड़े मिलेंगे और आखिरकार यूजर इंटरफेस अनुपयोगी हो जाएगा। इस विरोधी पैटर्न को "सॉफ्ट कोडिंग" कहा जाता है , और "दैनिक डब्ल्यूटीएफ" इसके लिए उदाहरणों से भरा है।

अपने डेटा मॉडल को अधिक लचीला बनाएं, अभिकथन छोड़ें, आक्रमणकारियों का परीक्षण करें

अंतिम उपाय आपके डेटा मॉडल को अधिक लचीला बना देगा। आपको लगभग सभी अभिक्रियाओं को छोड़ना होगा और अपने डेटा मॉडल को पूर्ण विकसित ग्राफ़ पर आधारित करना होगा। जैसा कि ऊपर दिए गए उदाहरण से पता चलता है, यह आसानी से आपके अपने दादा होने के लिए संभव है, इसलिए आप साइकिल भी रख सकते हैं।

इस मामले में, आपको अपने सॉफ़्टवेयर का बड़े पैमाने पर परीक्षण करना चाहिए। आपको लगभग सभी दावे छोड़ना पड़ा, इसलिए अतिरिक्त बग के लिए एक अच्छा मौका है।

असामान्य परीक्षण मामलों की जांच के लिए एक परीक्षण डेटा जनरेटर का उपयोग करें। हास्केल , एर्लांग या सी के लिए त्वरित चेक लाइब्रेरी हैं । Java / Scala के लिए ScalaCheck और Nyaya हैं । एक परीक्षण का विचार एक यादृच्छिक जनसंख्या का अनुकरण करना होगा, इसे यादृच्छिक पर इंटरब्रेट करने दें, फिर अपने सॉफ़्टवेयर को पहले आयात करें और फिर परिणाम को निर्यात करें। उम्मीद यह होगी, कि आउटपुट में सभी कनेक्शन इनपुट और वाइस कविता में भी हैं।

एक मामला, जहां एक संपत्ति एक ही रहती है उसे एक अपरिवर्तनीय कहा जाता है। इस मामले में, अयोग्य व्यक्ति नकली आबादी में व्यक्तियों के बीच "रोमांटिक संबंधों" का सेट है। जितना संभव हो उतने अपरिवर्तनों को खोजने की कोशिश करें और बेतरतीब ढंग से उत्पन्न डेटा के साथ उनका परीक्षण करें। आक्रमणकारी कार्यात्मक हो सकते हैं, जैसे:

  • जब आप अधिक "रोमांटिक संबंध" जोड़ते हैं, तब भी एक चाचा चाचा रहता है
  • हर बच्चे के माता-पिता होते हैं
  • दो पीढ़ियों वाली आबादी में कम से कम एक भव्य माता-पिता होते हैं

या वे तकनीकी हो सकते हैं:

  • आपका सॉफ्टवेयर 10 बिलियन सदस्यों तक ग्राफ पर क्रैश नहीं होगा (चाहे कितने भी इंटरकनेक्ट हों)
  • ओ (नंबर-ऑफ-नोड्स) और ओ (नंबर-ऑफ-एज- 2) के साथ आपका सॉफ़्टवेयर स्केल
  • आपका सॉफ्टवेयर हर परिवार के ग्राफ को 10 बिलियन सदस्यों तक सहेज और फिर से लोड कर सकता है

नकली परीक्षणों को चलाने से, आपको बहुत सारे अजीब कोने के मामले मिलेंगे। उन्हें ठीक करने में बहुत समय लगेगा। इसके अलावा आप बहुत सारे अनुकूलन खो देंगे, आपका सॉफ्टवेयर बहुत धीमा चलेगा। आपको तय करना होगा, अगर यह इसके लायक है और यदि यह आपके सॉफ़्टवेयर के दायरे में है।


3

सभी कथनों को हटाने के बजाय, आपको अभी भी चीजों की जांच करनी चाहिए जैसे कि एक व्यक्ति अपने माता-पिता या अन्य असंभव परिस्थितियों में और एक त्रुटि प्रस्तुत करता है। शायद एक चेतावनी जारी करें यदि यह संभावना नहीं है तो उपयोगकर्ता अभी भी सामान्य इनपुट त्रुटियों का पता लगा सकता है, लेकिन अगर सब कुछ सही है तो यह काम करेगा।

मैं डेटा को वेक्टर में प्रत्येक व्यक्ति के लिए एक स्थायी पूर्णांक के साथ संग्रहीत करूँगा और माता-पिता और बच्चों को व्यक्तिगत वस्तुओं में संग्रहीत करूँगा जहाँ उक्त int वेक्टर का सूचकांक है। यह पीढ़ियों के बीच जाने के लिए बहुत तेज़ होगा (लेकिन नाम खोजों जैसी चीजों के लिए धीमा)। जब वे बनाए गए थे तब वस्तुएं क्रम में होंगी।


-3

पिता को डुप्लिकेट करें (या सिमलिंक / संदर्भ का उपयोग करें)।

उदाहरण के लिए, यदि आप पदानुक्रमित डेटाबेस का उपयोग कर रहे हैं:

$ #each person node has two nodes representing its parents.
$ mkdir Family
$ mkdir Family/Son
$ mkdir Family/Son/Daughter
$ mkdir Family/Son/Father
$ mkdir Family/Son/Daughter/Father
$ ln -s Family/Son/Daughter/Father Family/Son/Father
$ mkdir Family/Son/Daughter/Wife
$ tree Family
Family
└── Son
    ├── Daughter
       ├── Father
       └── Wife
    └── Father -> Family/Son/Daughter/Father

4 directories, 1 file

3
ln -sआदेश इस तरह से काम नहीं करता है; लिंक के संकल्प Family/Son/Fatherके लिए दिखेगा Family/Son/Daughter/Fatherके नीचे से Family/Sonहै, जहां लिंक बसता था, से नहीं .जहां जारी ln -sआदेश।
मुशीफिल

48
क्लोनिंग
जीनवा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.