Vom Stammbaum zum Algorithmus
Ein Stammbaum ist ein Graph. Sobald man ihn so betrachtet, lässt sich ein Vererbungsmuster mit genau einem Durchlauf über die Knoten prüfen.
Das Problem
Ein Stammbaum ist eine Menge von Personen, jede mit einem Geschlecht und einem Erkrankungsstatus, die über Eltern-Kind-Kanten miteinander verbunden sind. Wir wollen eine Funktion, die einen Stammbaum entgegennimmt und true zurückgibt, wenn er mit einem bestimmten Vererbungsmuster konsistent ist, und false, wenn irgendeine Beziehung ihm widerspricht.
Wir gehen ein Muster Schritt für Schritt durch: den autosomal-rezessiven Erbgang. Die anderen fünf folgen derselben Struktur, nur mit einer anderen Regel innerhalb der Schleife.
Die Regel
Beim autosomal-rezessiven Erbgang sind zwei Kopien des rezessiven Allels nötig, damit der betroffene Phänotyp entsteht. Der Genotyp aa ist betroffen, AA und Aa sind es nicht. Eine Konstellation führt sicher zu einem Widerspruch: Wenn beide Eltern aa sind, müssen auch alle Kinder aa sein, weil kein Elternteil ein A-Allel weitergeben kann. Sind beide Eltern betroffen und ein Kind ist nicht betroffen, verletzt das die Regel. Zwei nicht betroffene Eltern mit einem betroffenen Kind tun das nicht – das sind einfach zwei Anlageträger.
Der Code
Wir stellen jede Person als Datensatz mit vier Feldern dar: id, affected, father und mother. Dabei verweisen father und mother auf andere Datensätze oder auf nil, wenn sie unbekannt sind. Es reicht, jede Person einmal zu besuchen und die Regel anhand ihrer Eltern zu prüfen. Die Reihenfolge spielt keine Rolle, weil die Regel nur eine Person und ihre beiden direkten Eltern betrachtet.
- für jede person in people
- father = person.father
- mother = person.mother
- wenn father == nil oder mother == nil
- weiter // ohne beide Eltern gibt es nichts zu prüfen
- wenn father.affected und mother.affected und nicht person.affected
- return false
- return true
Acht Zeilen, eine einzige echte Prüfung. Die Laufzeit beträgt O(n): ein Durchlauf, konstanter Aufwand pro Person.
Die anderen fünf Muster
Dieselbe Funktion, nur Zeile 6 ist anders. Beim X-chromosomal-rezessiven Erbgang prüft man einen betroffenen Sohn mit einem betroffenen Vater und einer nicht betroffenen Mutter, denn das X-Chromosom eines Sohnes kommt nie vom Vater. Beim autosomal-dominanten Erbgang ist die Regel genau umgekehrt: Ein Widerspruch liegt vor, wenn eine betroffene Person zwei nicht betroffene Eltern hat – nicht wenn eine nicht betroffene Person zwei betroffene Eltern hat. Y-chromosomale und mitochondriale Vererbung betrachten nur ein Elternteil, weil diese Muster nur von einer Seite kommen.
Das Tool führt alle sechs Prüfungen jeweils in einem einzigen Durchlauf aus und meldet, welche davon true zurückgeben. Wenn mehr als eine zutrifft, ist das bei einem kleinen Stammbaum die ehrliche Antwort – nichts, was man durch Raten auflösen sollte.
Die echte Implementierung ansehen
Das Tool führt genau diese Prüfung plus die fünf anderen Vererbungsmuster für jeden Stammbaum aus, den du erstellst.
Stammbaum-Tool öffnenWenn du eine grundlegende Erklärung der Vererbungsmuster suchst, lies unseren Artikel zu den Grundlagen der Genetik. Ein durchgerechnetes Beispiel für einen X-chromosomal-rezessiven Erbgang bei einer realen Erkrankung findest du unter Duchenne-Muskeldystrophie.