meine Eingabe aus einer Datei sieht so aus: Die Datei hat Tab als Trennzeichen und ist alphabetisch für Proben und numerisch für die Funktionen in Spalte 2 und 3 sortiert. Was ich tun möchte, ist zu finden überlappende und enthaltene Funktionen und fusionieren sie zu einer Funktion.Finden und Zusammenführen von Intervallen in Perl
SampleA 100 500
SampleA 200 600
SampleA 300 400
SampleA 700 800
SampleA 900 1100
SampleA 1200 1500
SampleA 1400 1700
SampleA 1600 1900
SampleB 400 600
SampleB 700 900
SampleB 1000 1800
SampleB 1500 1600
SampleB 1900 2500
SampleB 2500 2600
SampleB 3000 3600
SampleB 3100 3400
Zum Beispiel: Die ersten drei SampleA Fälle würden:
Sample A 100 600
Mein Problem ist im Moment, dass ich die Fälle finden kann, wenn ich über meine Datenstruktur durchlaufen, aber ich bin etwas stecken beim Versuch, meine Samples zusammenzuführen. Meine Idee war nur, meine Schleife zu wiederholen, bis alles gefunden und zusammengeführt wurde, aber ich bin mir nicht sicher, wie das zu erreichen ist. die Daten in einem 2D-Array Im Moment wie folgt gespeichert werden: @storage = [SampleA, start, stop]
my $j = 1;
for (my $i = 0; $i < scalar(@storage); $i++) {
if ($storage[$i][0] eq $storage[$j][0]) {
if ($storage[$i][2] > $storage[$j][1] && $storage[$i][2] < $storage[$j][2]) {
print "Found Overlapp!\n";
}elsif ($storage[$i][2] > $storage[$j][1] && $storage[$i][2] > $storage[$j][2]) {
print "Found Feature in Feature!\n";
}
}
unless ($j == scalar(@storage)){$j++};
}
Mein Ziel wäre es, diese Schleife erneut ausführen, bis keine Übereinstimmung gefunden wird und dadurch alle Intervalle nicht überlappend sind, aber ich bin eher hier stecken geblieben. Jede Hilfe wäre willkommen, danke.
Können Sie sich darauf verlassen, dass die Bestellung so fortlaufend ist? Z.B. Müssen Sie mit _all_ Bereichen vergleichen, oder nur zuletzt? – Sobrique
Ich kann auf aufeinanderfolgende Bestellung verlassen. Wenn ich Sie richtig verstehe, muss ich mit allen Samples vergleichen, da ich nur den längsten konsekutiven nicht überlappenden Bereich haben möchte und es möglicherweise mehr als einen gibt. ZB sollte ein Bereich, der sich mit nichts überschneidet, ebenfalls zurückgegeben werden. – chrys
Nun, es ist ein bisschen schwieriger, wenn Sie sagen, eine weitere "SampleA" -Linie weiter unten, das hat eine andere Reichweite, das ist alles. Es könnte einen effizienteren Algorithmus geben, der die iterative Natur Ihrer Quelldaten aufbaut. (Beispielsweise wird nur der "jüngste" Probenbereich betrachtet, anstatt alle iterativ) – Sobrique