Soy ağacı yazılımındaki döngüler


1594

Bazı aile ağacı yazılımlarının geliştiricisiyim (C ++ ve Qt ile yazılmış). Müşterilerimden biri bana bir hata raporu gönderene kadar hiçbir sorun yaşamadım. Sorun şu ki, müşterinin kendi kızı olan iki çocuğu var ve sonuç olarak hatalar nedeniyle yazılımımı kullanamıyor.

Bu hatalar, işlenen aile grafiğiyle ilgili çeşitli iddia ve değişmezlerimin sonucudur (örneğin, bir döngü yürüdükten sonra, program X'in Y'nin babası ve dedesi olamayacağını belirtmektedir).

Tüm veri iddialarını kaldırmadan bu hataları nasıl çözebilirim?



30
Soy ağacınızı yeterince geriye doğru izlerseniz, bu sorunu istediğinizden çok daha sık vurursunuz. Ağaç temsilinden vazgeçmek acı verici olabilir ama sonuçta daha doğru olur.
Thomas

55
Olası olmayan şeyler için iddialar eklememelisiniz, sadece imkansız şeyler için. Döngüler bir soy ağacı grafiğinde mümkün olmayan bariz şeylerdir ... hiç kimse herhangi bir yöntemle kendi atası olamaz. Bu diğer iddialar sadece sahte ve kaldırılmalıdır.
pgod

44
Bu, evcil hayvan yetiştiriciliği dünyasında hiç de saçma bir soru değil. Baba kız, anne oğul, kız kardeş, büyükanne ve büyükbaba torunları standart tekniktir ve evcil hayvan yetiştiricileri de aile ağacı yazılımına ihtiyaç duyar. "Safkan" benim ¤% # &.
kaleissin

31
İlk kuzenlerle evlenmek Victoria İngiltere'sinde, özellikle üst sınıflar arasında çok yaygındı (parayı aile içinde tutmanın mükemmel bir yoluydu). Örneğin Charles Darwin, ilk kuzeni Emma Wedgwood ile evlendi. Herhangi bir soy ağacı yazılımının bu gibi durumları desteklemesi gerekir.
rtperson

Yanıtlar:


727

Görünüşe göre siz (ve / veya şirketiniz) bir soy ağacının ne olması gerektiği konusunda temel bir yanlış anlaşılmaya sahipsiniz.

Açıklığa kavuşturalım, ayrıca (ürünlerinden biri olarak) portföyünde bir aile ağacı olan bir şirkette çalışıyorum ve benzer sorunlarla mücadele ediyoruz.

Sorun, bizim durumumuzda, ve ben de sizin durumunuzu varsayalım, bir ailenin ne olması gerektiği konusunda son derece düşünülen GEDCOM formatından geliyor . Ancak bu biçim, bir aile ağacının gerçekte nasıl göründüğüne dair bazı yanlış yanılgılar içerir.

GEDCOM'un aynı cinsiyet ilişkileriyle uyumsuzluk, ensest vb.Gibi birçok sorunu var ... Gerçek hayatta hayal ettiğinizden daha sık gerçekleşir (özellikle 1700-1800'e geri giderken).

Aile ağacımızı gerçek dünyada olanlara göre modelledik: Olaylar (örneğin, doğumlar, düğünler, nişan, sendikalar, ölümler, evlat edinmeler vb.). Mantıken imkansız olanlar dışında bunlara herhangi bir kısıtlama getirmiyoruz (örneğin, kişinin kendi ebeveyni olamaz, ilişkiler iki kişiye ihtiyaç duyar, vb.)

Doğrulama eksikliği bize daha "gerçek bir dünya", daha basit ve daha esnek bir çözüm sunuyor.

Bu özel duruma gelince, evrensel olarak geçerli olmadıkları için iddiaları kaldırmanızı öneririm.

(Bu ortaya çıkacak) sorunları görüntülemek için, aynı düğümü gerektiği kadar çizmenizi, bunlardan birini seçerek tüm kopyaları aydınlatarak çoğaltmayı ima etmenizi öneririm.


32
Bu doğru yaklaşıma benziyor ve daha karmaşık sorunları tespit etmek için genişletmek yeterince kolay. Olaylar arasında bir dizi "B'den önce oldu" ilişkisini çalıştırabilirsiniz. Örneğin, bir kişi onları içeren diğer olaylardan önce doğmuştur. Bu yönlendirilmiş bir grafik. Daha sonra grafiğin döngü içermediğini kontrol edebilirsiniz. StackOverflow ile ilgili bu soruya bakın. Zaman yolculuğu icat edilene kadar bu iyi olmalıdır.
Paul Harrison

41
@ paul-harrison Sadece bu kadar basit olsaydı. Daha eski kayıtlarda (hatta yeni kayıtlarda) tarih tutarsızlıkları vardır. Doğumdan önce vaftiz, çoklu doğum kayıtları vb ... Yani bir dereceye kadar resmi kayıtlarda zaman yolculuğu var. Bu tutarsız verilere izin veriyoruz. Yinelenen durumlarda, kullanıcıların doğum kaydı olarak uygulamanın neyi "dikkate alması gerektiğini" belirtmelerine izin veriyoruz. Ve eğer bulunursa, kırık zaman çizgilerini göstereceğiz.
Bert Goethals

38
@ ben-voigt GEDCOM, Son Zaman Azizler İsa Mesih Kilisesi tarafından oluşturulan bir formattır. Spesifikasyon açıkça evliliğin (MARR) erkekler ve kadınlar arasında olacağını belirtir. Aynı eşcinsel evlilik veya ensest için ASSO etiketi kullanılmalıdır (ASSOCIATES), aynı zamanda arkadaşlığı veya komşu olduğunu belirtmek için kullanılmalıdır. Aynı seks evliliğinin bu spesifikasyon içinde ikinci sınıf bir ilişki olduğu açıktır. Daha tarafsız bir spec erkek kadın ilişkileri talep etmeyecektir.
Bert Goethals

1
@Bert Goethals: GEDCOM'u eşcinsel evlilikleri desteklemeyen bazı programlarla karıştırıyorsunuz (PAF, Legacy). GEDCOM, "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @" gibi yapıları engellemez ve bu nedenle yazılımınız isterse aynı cinsiyetten evlilikleri destekler.
Pierre

1
@Pierre Sistemi gerçekten aldatabilirsiniz. Bu doğrudan 5.5.1 dokümana aittir: "MARR {MARRIAGE}: = Bir erkeğin ve kadının karı koca olarak bir aile birimi oluşturmanın yasal, ortak kanunu veya alışılmış bir etkinliği." ( homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm ) Gördüğünüz gibi, burada aynı eşcinsel evlilik yok.
Bert Goethals

563

İddianızı rahatlatın.

Müşterilerinizin% 99,9'una verilerini girerken hata yakalamada büyük olasılıkla çok yardımcı olan kuralları değiştirerek değil.

Bunun yerine, "yine de ekle" ifadesiyle bir uyarıya "ilişki ekleyemiyorum" hatasını değiştirin.


143
Çok beklenmedik bir durumla karşılaştığında , yani bir kullanıcının genellikle sadece yanlışlıkla yapacağı bir durumla karşılaşıldığında , kullanıcıya bir uyarı göstermek iyi bir fikirdir. Bu iyi bir geri bildirim. Ancak, kullanıcının gerçekten istediklerinden eminseniz devam etmesine izin verin . Bu yüzden, bunun somun ve cıvatalarına girmese bile, bunun iyi bir cevap olduğunu düşünüyorum.
thomasrutter

15
İyi cevap! Merak ediyorum, bu tür bir yazılım "Ben kendi dedemim" ( youtube.com/watch?v=eYlJH81dSiw ) durumunu nasıl ele alacak ?
Zaur Nasibov

4
Bu gerçekten bir cevap değil, çünkü bence sorun aslında ağacın üzerinden geçmekten mi kaynaklanıyor? Ancak, bu iyi bir öneri.
bdwakefield

3
@bdwakefield: Soru "Tüm veri iddialarını kaldırmadan bu hataları nasıl çözerim?" Buna cevap verdiğime inanıyorum.
Ben Voigt

2
@Ben İddiaların ne olduğuna bağlı. Sonsuz döngülerin veya ölümcül hataların olmasını önlüyorlarsa, iddiaları etkili bir şekilde kaldırmanızı öneririz. Bir kullanıcıyı potansiyel bir hata hakkında uyarmak için oradalarsa, cevabınız iyi bir sorudur.
rm999

224

İşte aile ağaçlarıyla ilgili sorun: ağaç değiller. Bunlar asiklik grafikler veya DAG'lardır. İnsan üreme biyolojisinin prensiplerini doğru anlarsam, herhangi bir döngü olmayacaktır.

Bildiğim kadarıyla, Hıristiyanlar bile, soyağacını bir aile DAG'sine dönüştürecek olan kuzenler arasındaki evlilikleri (ve böylece çocukları) kabul ediyorlar.

Hikayenin ahlaki: doğru veri yapılarını seçin.


7
İn vitro ve cinsel üreme için kendisine işaret eden maksimum 1 veya 2 düğüme sahip her düğümün daha fazla kısıtlanması gerekecektir. Gerçek hayata daha doğru olmakla birlikte, baba tarafında belirsiz torunlar için birden çok kesikli çizgiye izin verebilirsiniz (annenin kim olduğu her zaman açıktır, ancak sadece DNA testi babanın kim olduğunu garanti edebilir ve bu bugün bile nadiren yapılır), ya da her ikisi için bile benimsenme dikkate alınır.
manixrock

7
@manixrock - bu soru nadir vakalarla ilgili olduğundan, annenin kim olduğu her zaman net olmayan olduğunu iddia etmek istiyorum. evlat edinme, terk edilmiş bebekler, vekil anneler, vb.
Peter Recore

9
Mutlaka döngüsel değil, değil mi? Man-evlenmekteydi annesi.
Ed Ropple

13
Büyükannesi ile evlenen adam, kendi büyükbabası olmayacak ve bir döngü ekleyecektir. Çocukları varsa, bisiklete binmeyen düzenli bir grafik kenarı olacaktır.
exDM69

11
Aslında İKİ ADG. Ebeveynlik grafiği ve yasal ilişki grafiği vardır. Genellikle aynı, ancak birden fazla farklı olabilir.
JSacksteder

115

Çeklerinizi dayandırabileceğiniz bir kişiyi benzersiz bir şekilde tanımlayan bir değeriniz olduğunu düşünüyorum.

Bu biraz zor. Yapıyı bir ağaç tutmak istediğinizi varsayarsak, şunu öneririm:

Varsayın: Akendi kızıyla çocukları var.

Aolarak programa kendisini ekler Agibi B. Babanın rolündeyken, ona erkek arkadaş diyelim.

is_same_for_out()Çıktı üreten programınızın Bdahili olarak giden tüm bağlantıların Averi sunumunda olması gerektiğini bildiren bir fonksiyon ekleyin .

Bu kullanıcı için fazladan iş yapar, ancak BT'nin uygulanması ve bakımı nispeten kolay olacaktır.

Bundan yola çıkarak kod senkronizasyonu üzerinde çalışabilir Ave Btutarsızlıkları önleyebilirsiniz.

Bu çözüm kesinlikle mükemmel değildir, ancak ilk yaklaşımdır.


9
Muhtemelen bu tür "vekil" düğümler gerçekten uygun bir çözümdür. Ancak bu hiçbir kullanıcı rahatsız etmeden kullanıcı arayüzü koymak nasıl bir fikrim yok. Size gerçek insanlarla (özellikle müşterilerinizle) ilgilenen yazılım yazmanın kolay olmadığını söyleyebilirim.
Partick Höse

6
Asla bitmez - B'nin yeni oğlu kendi amcası olacaktır. Program için tam bir geri ödeme düşünecektim!
Bo Persson

3
@ A: O zaman onun da kendi annesi olduğunu fark eder ve genç benliğini zaman ajansına dahil eder?
Null Set

2
Bir sistem içinde verilerin çoğaltılması (ve senkronize edilmesi) kötü bir uygulamadır. Çözeltinin alt optimal olduğunu ve yeniden düşünülmesi gerektiğini gösterir. Ekstra (yinelenen) düğümler oluşturmak gerekirse, bunu proxy olarak belirtin ve veri okuma ve yazma işlemlerini orijinal düğüme devredin.
Bert Goethals

84

Yazılımınız için gerçekten değer yaratan konulara odaklanmalısınız . Bir tüketici için çalışmasını sağlamak için harcanan zaman lisans fiyatına değer mi? Muhtemelen hayır.

Bu müşteriden özür dilemenizi, durumunun yazılımınız için kapsam dışı olduğunu ve geri ödeme yapmasını söylemenizi tavsiye ederim.


3
Çok doğru. Ancak, başkalarının ortaya çıkardığı benzer sorunlarla ilgili diğer potansiyel problemleri de tartın.
Prof. Falken sözleşmesi

2
Elbette. Sebep şudur: Kritik olmayan bir uygulamada nadir bir durum ise, herhangi bir şeyi düzeltmeniz veya uygulamanız gerekmez. Kullanıcılarınızı gerçekten incitiyorsa, üzerinde çalışmanın değeri vardır.
christopheml

10
Muhtemelen herkesin soyunun bir yerinde ensest vakası vardır. Eğer kişi aile geçmişini (çok) derin kazarsa bu yumruya çarpacaksınız.
datenwolf

1
Bazı tuhaf durumların soy ağacı (inbreed royalty, Fritzl vb.) Yapmak, yazılımın geçerli kullanımıdır.
Bulwersator

1
İkinci kuzenlerin evlenmesine izin vermeyen bir soy ağacı yazılımı işe yaramaz. Neredeyse tüm aileler bunun en az bir vakasına sahiptir. Bu yüzden orijinal örneğin etkili olması gerektiğini düşünüyorum.
Fuzzy76

79

Atreides ailesini (modern, Dune veya antik Oedipus Rex ) bir test çantası olarak kurmuş olmalısınız . Dezenfekte edilmiş verileri test durumu olarak kullanarak hataları bulamazsınız.


2
Ne yazık ki, çok fazla insan ilk önce sistemlerini bozan uç durumlar yerine 'tamam' verileri düşünüyor.
sjas

59

"Git" gibi dillerin iddialarda bulunmamasının nedenlerinden biri de budur. Muhtemelen düşünmediğiniz vakaları çok sık ele almak için kullanılırlar. Sadece imkansız olduğunu iddia etmelisiniz, sadece olası değil . İkincisini yapmak, iddialara kötü bir itibar veren şeydir. Her yazdığınızda assert(, on dakika yürüyüp gerçekten düşünün.

Özellikle rahatsız edici durumunuzda, böyle bir iddianın nadir fakat olası koşullar altında sahte olması hem düşünülebilir hem de korkunçtur. Bu nedenle, yalnızca "Bu yazılım sunduğunuz senaryoyu işlemek için tasarlanmamıştır" demekse uygulamanızda kullanın.

Büyük, büyük, büyük büyükbabanızın imkansız olarak babanız olduğunu iddia etmek makul bir şeydir.

Yazılımınızı test etmek için işe alınmış bir test şirketi için çalışsaydım, elbette bu senaryoyu sunardım. Neden? Her çocuk, ancak akıllı 'kullanıcı' aynı şeyi yapacak ve sonuçta ortaya çıkan 'hata raporunda' zevk alacaktır.


5
'İddiaların ne zaman kullanılacağı' argümanını kabul edin; 'bazı dillerin öne sürdüğü, Go bilmediği' ile nasıl alakalı olduğunu görmeyin.
phooji

2
@Red Hue - bazen derleyiciler imkansızı mümkün kılar ... Gcc'nin bazı sürümleri abs () uygulamasında -10 == 10 düşünür.
Tim Post

2
@Kırmızı Renk Tonu: Tüm iddialar her zaman doğru (veya yanlış) olması gereken koşulları belgelemek ve test etmektir. Sizi (ve diğerlerini), bu imkansız vakaların ortaya çıkacağı şekilde "düzeltmekten" kaçınmanıza yardımcı olur. "İmkansız" bir vakanın ortaya çıkması için geçerli bir neden varsa, çok fazla iddiada bulundunuz.
cHao

1
@cHao @Tim Post Sadece iddiaların neden gitmediğini anlamaya çalışıyorum, çünkü birçoğunuz iddianın önemli olduğunu kabul ediyor.
Arlen

5
İddianın (veya iddianın benzeri kodun) ilgisi yoktur. Go gibi dillerde kodlama, verilerin yapısı hakkında varsayımlar yapabilir; sadece bu varsayımları iddialarla belgeleyemez ve uygulayamaz. Alt satır: uygulamada bir hata var.
Tommy McGuire

41

Böyle berbat bir durum hakkında yorum yapmaktan nefret ediyorum, ancak tüm değişmezlerinizi reddetmemenin en kolay yolu, grafiğinizde ensest babasına vekalet eden bir hayalet tepe noktası oluşturmaktır.


37

Bu yüzden aile ağacı yazılımları üzerinde biraz çalıştım. Bence çözmeye çalıştığınız sorun, sonsuz döngülere girmeden ağacı yürüyebilmeniz gerektiğidir - başka bir deyişle ağacın döngüsel olmaması gerekir.

Ancak, bir kişi ile atalarından biri arasında sadece bir yol olduğunu iddia ediyorsunuz. Bu, döngü olmadığını garanti eder, ancak çok katıdır. Biyolojik olarak konuşursak, torunlaşma, yönlendirilmiş bir asiklik grafiktir (DAG). Sahip olduğunuz durum kesinlikle yozlaşmış bir durumdur, ancak bu tür şeyler her zaman büyük ağaçlarda olur.

Örneğin, n kuşağında sahip olduğunuz 2 ^ n ataya bakarsanız, çakışma yoksa, MS 1000'de hayatta olanlardan daha fazla ataya sahip olursunuz. Yani, çakışma olmalı.

Ancak, geçersiz, sadece kötü veri döngüleri alma eğilimindedir. Ağacın üzerinden geçiyorsanız, döngüler ele alınmalıdır. Bunu her bir algoritmada veya yükte yapabilirsiniz. Yükte yaptım.

Bir ağaçta gerçek döngüleri bulmak birkaç yolla yapılabilir. Yanlış yol, belirli bir kişiden her atayı işaretlemektir ve çaprazlama yaparken, bir sonraki adıma geçeceğiniz kişi zaten işaretliyse, bağlantıyı kesin. Bu potansiyel olarak doğru ilişkileri kesecektir. Bunu yapmanın doğru yolu, her bir bireyden başlamak ve her bir atayı o kişinin yoluyla işaretlemektir. Yeni yol bir alt yol olarak geçerli yolu içeriyorsa, bu bir döngüdür ve kesilmelidir. Yolları, karşılaştırma ve depolamayı çok hızlı yapan <bool> vektörü (MFMF, MFFFMF vb.) Olarak saklayabilirsiniz.

İki yineleyici göndermek ve alt küme testiyle çarpışıp çarpışmadığını görmek gibi döngüleri algılamanın birkaç yolu daha vardır, ancak yerel depolama yöntemini kullandım.

Ayrıca bağlantıyı gerçekten koparmanız gerekmediğini, normal bir bağlantıdan bazı zayıf algoritmaların takip etmediği bir 'zayıf' bağlantıya dönüştürebileceğinizi unutmayın. Hangi bağlantıyı zayıf olarak işaretleyeceğinizi seçerken de dikkat etmek isteyeceksiniz; bazen doğum tarihi bilgilerine bakarak döngünün nerede kırılması gerektiğini anlayabilirsiniz, ancak çoğu zaman hiçbir şey bulamazsınız çünkü çok fazla veri eksiktir.


Bu varsayımlara dikkat edin; insanlar adapte zaman erkek diğeri dişi ebeveyn verilen değil veya yakın gelecekte, ebeveynler olarak kendilerini görüyorlar lesibans bile gerçekten mümkün olabilir olmak kızların en az biyolojik anne. Bu nedenle, insanlara dolly uygularsak, "bir kişinin iki ayrı ebeveyni vardır" varsayımı bile ortadan kalkar.
Agrajag

1
@Agrajag, evet bu yüzden döngü tespiti için "biyolojik olarak konuşma" yı belirtmiştim. Biyolojik olarak bile, vekil anneler ve suni tohumlama gibi birçok olası sorun vardır. Ebeveynleri tanımlamak için evlat edinme ve biyolojik olmayan diğer yöntemlere de izin verirseniz, bir ağaçta geçerli bir gerçek döngüye sahip olmak mümkündür - örneğin, birileri yaşlandıklarında ve artık kendilerine bakamayacakları zaman büyükanne veya büyükbabalarını benimser. . İnsanların aile hayatı hakkında varsayımlarda bulunmak her zaman karmaşıktır. Ama yazılım yazarken bazı varsayımlar yapmanız gerekir ..
tfinniga

36

Aptalca bir soru için başka bir sahte ciddi cevap:

Asıl cevap, uygun bir veri yapısı kullanmaktır. İnsan şecere, döngüsü olmayan saf bir ağaç kullanılarak tam olarak ifade edilemez. Bir çeşit grafik kullanmalısınız. Ayrıca, daha ileri gitmeden önce bir antropologla konuşun, çünkü "Batılı ataerkil tek eşli evlilik" in en basit durumunda bile, benzer hataların şecere modellemeye çalışırken yapılabileceği başka birçok yer var.

Burada tartışıldığı gibi yerel olarak tabu ilişkilerini göz ardı etmek istesek bile, bir soy ağacına döngüleri tanıtmak için mükemmel derecede yasal ve tamamen beklenmedik yollar vardır.

Örneğin: http://en.wikipedia.org/wiki/Cousin_marriage

Temel olarak, kuzen evlilik sadece yaygın ve beklenen değil, insanların binlerce küçük aile grubundan dünya çapında 6 milyar nüfusa gitmesinin sebebidir. Başka türlü çalışamaz.

Şecere, aile ve soy söz konusu olduğunda gerçekten çok az sayıda evrensel var. Teyzenin kim olabileceğini veya kiminle evlenebileceğini veya çocukların miras amacıyla nasıl meşrulaştırıldığını düşündüren normlar hakkında neredeyse her türlü varsayım, dünyanın veya tarihin herhangi bir yerinde bir istisna ile altüst olabilir.


9
Yorumun beni çokeşlilik konusunda düşündürdü. Sadece cinsel üremeyi modelleyen şecere yazılımı, sperm ve yumurtaya eklenmiş bir isim gerektirebilir, ancak aile yapısının daha geniş tanımları gerektirmez.
Steve Kalemkiewicz

Şecere yazılımı genellikle modelde birden fazla eşe izin verir. Modeli görünümde nasıl görüntülediğiniz, sağlanan "moda" bağlı olarak bir programda bile büyük ölçüde değişir.
Todd Hopkinson

20

Potansiyel yasal çıkarımlar bir yana, düğümün tek ve tek kişi olabileceğini varsaymak yerine, bir aile ağacındaki bir 'düğüme' önceki bir kişi olarak davranmanız gerektiği görülmektedir.

Ağaç düğümünün haleflerin yanı sıra bir kişiyi içermesini sağlayın - ve sonra aynı kişinin farklı halefleri olan aynı kişiyi içeren başka bir düğüme sahip olabilirsiniz.


13

Birkaç cevap, iddiaları / değişmezleri korumanın yollarını göstermiştir, ancak bu, iddiaların / değişmezlerin yanlış kullanımı gibi görünmektedir. İddialar doğru olması gereken bir şeyin doğru olduğundan emin olmak ve değişmezler değişmemesi gereken bir şeyin değişmemesini sağlamak içindir.

Burada iddia ettiğiniz şey, ensest ilişkilerinin olmadığıdır. Açıkçası onlar yapmak sizin iddiası geçersiz nedenle, mevcuttur. Bu iddia üzerinde çalışabilirsiniz, ancak asıl hata iddianın kendisidir. İddia kaldırılmalıdır.



5

Şecere verileri döngüseldir ve döngüsel olmayan bir grafiğe sığmaz, bu nedenle döngülere karşı iddialarınız varsa bunları kaldırmalısınız.

Özel görünüm oluşturmadan bunu bir görünümde ele almanın yolu, döngüsel üst öğeye "hayalet" üst öğe olarak davranmaktır. Başka bir deyişle, bir kişi aynı kişiye hem baba hem de büyükbaba olduğunda, büyükbaba düğümü normal olarak gösterilir, ancak baba düğümü, "" büyükbabayı gör "gibi basit bir etikete sahip bir" hayalet "düğümü olarak oluşturulur. ) ve büyükbabayı işaret eder.

Hesaplamalar yapmak için, döngüsel grafikleri işlemek için mantığınızı geliştirmeniz gerekebilir, böylece bir döngü varsa bir düğüm birden fazla ziyaret edilmez.


4

En önemli şey avoid creating a problem, bu yüzden bir döngüden kaçınmak için doğrudan bir ilişki kullanmanız gerektiğine inanıyorum .

@Markmywords'ün dediği gibi, #inciri "fritzl.h" ekleyin.

Sonunda söylemeliyim recheck your data structure. Belki orada bir şeyler ters gidiyor (belki çift yönlü bağlantılı bir liste sorununuzu çözer).


4

İddialar gerçeklikten kurtulamıyor

Genellikle iddialar gerçek verilerle temastan kurtulamaz. Hangi verilere ve hangilerinin kapsam dışı olduğuna karar vermek için yazılım mühendisliği sürecinin bir parçasıdır.

Devirli aile grafikleri

Aile "ağaçlar" ile ilgili olarak (aslında döngüler de dahil olmak üzere tam şişmiş grafikler), güzel bir fıkra vardır:

Yetişkin bir kızı olan bir dulla evlendim. Bizi sık sık ziyaret eden babam üvey kızıma aşık oldu ve onunla evlendi. Sonuç olarak, babam oğlum, kızım da annem oldu. Bir süre sonra, eşime babamın kardeşi olan bir oğul ve amcam verdim. Babamın karısının (aynı zamanda kızım ve annem olan) bir oğlu oldu. Sonuç olarak, aynı kişide bir erkek kardeşim ve bir torunum var. Eşim şimdi anneannem, çünkü o annemin annesi. Ben de eşimin kocasıyım ve aynı zamanda eşimin üvey torunuyum. Başka bir deyişle, ben kendi dedem.

Suretler veya "bulanık babalık" dikkate alındığında işler daha da garipleşir .

Bununla nasıl başa çıkılır?

Döngüleri kapsam dışı olarak tanımlayın

Yazılımınızın bu tür nadir durumlarla ilgilenmemesi gerektiğine karar verebilirsiniz. Böyle bir durum meydana gelirse, kullanıcı farklı bir ürün kullanmalıdır. Bu, daha yaygın vakalarla uğraşmayı çok daha sağlam hale getirir, çünkü daha fazla iddia ve daha basit bir veri modeli tutabilirsiniz.

Bu durumda, yazılımınıza bazı iyi alma ve verme özellikleri ekleyin, böylece kullanıcı gerektiğinde farklı bir ürüne kolayca geçiş yapabilir.

Manuel ilişkilere izin ver

Kullanıcının manuel ilişkiler eklemesine izin verebilirsiniz. Bu ilişkiler "birinci sınıf vatandaşlar" değildir, yani yazılım onları olduğu gibi alır, kontrol etmez ve ana veri modelinde ele almaz.

Kullanıcı daha sonra nadir vakaları elle halledebilir. Veri modeliniz hala oldukça basit kalacak ve iddialarınız devam edecektir.

Manuel ilişkilere dikkat edin. Onları tamamen yapılandırılabilir hale getirme ve böylece tamamen yapılandırılabilir bir veri modeli oluşturma cazibesi vardır. Bu işe yaramaz: Yazılımınız ölçeklenmez, garip hatalar alırsınız ve son olarak kullanıcı arayüzü kullanılamaz hale gelir. Bu anti-patern "yumuşak kodlama" olarak adlandırılır ve "Günlük WTF" bunun örnekleri ile doludur.

Veri modelinizi daha esnek hale getirin, iddiaları atlayın, değişmezleri test edin

Son çözüm, veri modelinizi daha esnek hale getirmektir. Neredeyse tüm iddiaları atlamanız ve veri modelinizi tam gelişmiş bir grafiğe dayandırmanız gerekir. Yukarıdaki örnekte gösterildiği gibi, kendi büyükbabanız olmak kolayca mümkündür, böylece döngüler bile yapabilirsiniz.

Bu durumda, yazılımınızı kapsamlı bir şekilde test etmelisiniz. Neredeyse tüm iddiaları atlamanız gerekiyordu, bu yüzden ek hatalar için iyi bir şans var.

Olağandışı test senaryolarını kontrol etmek için bir test veri üreteci kullanın. Haskell , Erlang veya C için hızlı kontrol kütüphaneleri vardır . Java / Scala için ScalaCheck ve Nyaya vardır . Bir test fikri, rastgele bir popülasyonu simüle etmek, rastgele karışmasına izin vermek, ardından yazılımınızın önce içe aktarıp ardından sonucu dışa aktarması olacaktır. Beklenti, çıkıştaki tüm bağlantıların da giriş ve çıkış ayetinde olması olacaktır.

Bir mülkün aynı kaldığı duruma bir değişmez denir. Bu durumda değişmez, simüle edilen popülasyondaki bireyler arasındaki "romantik ilişkiler" kümesidir. Mümkün olduğunca çok değişmez bulmaya çalışın ve bunları rastgele oluşturulmuş verilerle test edin. Değişmezler işlevsel olabilir, örneğin:

  • daha "romantik ilişkiler" ekleseniz bile bir amca bir amca kalır
  • her çocuğun bir ebeveyni vardır
  • iki kuşaktan oluşan bir nüfusta en az bir büyük ebeveyn var

Veya teknik olabilirler:

  • Yazılımınız 10 milyar üyeye kadar bir grafikte çökmeyecek (kaç bağlantı olursa olsun)
  • Yazılımınız O (düğüm sayısı) ve O (kenar sayısı ^ 2) ile ölçeklendirilir
  • Yazılımınız 10 milyar üyeye kadar her aile grafiğini kaydedip yeniden yükleyebilir

Simüle edilmiş testleri uygulayarak, çok sayıda garip köşe kutusu bulacaksınız. Onları düzeltmek çok zaman alacaktır. Ayrıca çok fazla optimizasyon kaybedeceksiniz, yazılımınız çok daha yavaş çalışacaktır. Buna değer olup olmadığına ve bunun yazılımınızın kapsamında olup olmadığına karar vermelisiniz.


3

Tüm iddiaları kaldırmak yerine, bir kişinin kendi ebeveyni veya diğer imkansız durumlar gibi şeyleri kontrol etmeli ve bir hata sunmalısınız. Belki de kullanıcı sık karşılaşılan giriş hatalarını algılayabilmesi olası değilse uyarı verir, ancak her şey doğruysa çalışır.

Verileri her bir kişi için kalıcı bir tamsayı olan bir vektörde saklar ve adı geçen int'in vektörün endeksi olduğu ebeveynleri ve çocukları kişi nesnelerinde saklarım. Bu, nesiller arasında gitmek için oldukça hızlı olurdu (ancak isim aramaları gibi şeyler için yavaş). Nesneler, oluşturuldukları sıraya göre olacaktır.


-3

Babayı çoğaltın (veya symlink / reference kullanın).

Örneğin, hiyerarşik veritabanı kullanıyorsanız:

$ #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 -sKomut bu şekilde çalışmaz; bağlantının çözünürlüğü Family/Son/Fatherarayacaktır Family/Son/Daughter/Fatherunder gelen Family/Son, bağlantının nereye bulunduğu, değil dan .sen yayınladı nerede ln -skomutu.
musiphil

48
klonlama
Cenevre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.