Auswahl Aktion im Forum Suche Kontakt Für Mitglieder Mathematisch für Anfänger Wer ist Online | |
| Autor |
maximale Intervalle bestimmen |
|
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Themenstart: 2012-08-21 09:04
|
 
Hallo, ich stehe vor folgendem Problem: gegeben: eine Menge von Intervallen (genannt I) der Form [a,b] aus dem Bereich [0,L] und ein weiteres Intervall [A,B] \subsetequal\ [0,L] mit a,b,A,B,L \el\ \IN. Zudem zwei weitere Zahlen l,m \el\ \IN. gesucht: die maximalen Intervalle [\alpha,\beta] \subsetequal\ [A,B] mit der folgenden Eigenschaft: Für alle Teilintervalle [\alpha_i, \beta_i] \subset\ [\alpha,\beta] mit \beta_i - \alpha_i = l gilt: [\alpha_i, \beta_i] schneidet mindestens m Intervalle aus I Schneiden bedeutet dabei, dass der Schnitt aus mindestens zwei Punkten bestehen muss. Ich hoffe, folgendes Bild macht es ein wenig deutlicher:

 
Der besseren Übersicht wegen sind die Intervalle aus I nach oben geschoben worden. Im Intervall [\alpha, \beta]_1 befinden sich 6 Intervall aus I, folglich gilt die Bedingung. Im Intervall [\alpha, \beta]_2 befinden sich 4 Intervall aus I, folglich gilt auch hier die Bedingung. Schiebt man nun aber dieses Intervall um 1 nach rechts, so befinden sich nur noch 2 Intervalle aus I darin und die Bedingung ist verletzt, sodass das erste maximale Intervall nur bis 25 reicht. Ich habe zwar schon eine Lösung, aber weil diese sehr naive ist, suche ich eine Verbesserung dazu: Bisherige Methode: 1) Schiebe ein Suchintervalls [e-l,e] der Länge l von A nach B. 2) Falls die obige Bedingung erfüllt ist, merke dir die linke Position des Suchintervall (linker Startpunkt des Gültigkeitsbereiches, genannt s) 3) Falls die Bedingung nicht mehr erfüllt ist und man sich in einem Gültigkeitsbereich befindet, dann bildet das Intervall [s,e-1] ein maximales Intervall der gesuchten Form. 4) Mache bei 1) weiter Verbesserungsmöglichkeiten sehe ich darin, dass ich, statt das Suchintervall [e-l,e] um 1 nach rechts zu schieben, nur die Anfangs- und Endpunkte betrachte, doch leider kam ich damit nicht so weit. Hat jemand eine Idee oder kennt Literatur, die sich damit beschäftigt? LG Johannes
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.1, eingetragen 2012-08-21 10:48
|
Wenn man ein Intervall [alpha, beta] nach rechts verschiebt, kann sich die Anzahl der damit geschnittenen Intervalle nur in zwei Fällen ändern:
1) alpha ist ein Endpunkt eines Intervalls
2) beta - 1 [= alpha + l - 1] ist der Anfangspunkt eines Intervalls
Nun speicherst du alle Werte beta_i und alpha_i + 1 - l [zusammen mit der Info ob es ein Anfags- oder ein Endpunkt ist] in einem Array und sortierst die Werte. Nun kannst du aufsteigend durch das Array gehen und die Anzahl an geschnittenen Intervalle um 1 erhöhen wenn der Punkt ein Anfangspunkt war und um 1 verringern, wenn es ein Endpunkt war [Bei Werten die doppelt vorkommen musst du aufpassen und sämtliche gleichen Werte in einem Schritt abarbeiten].
Wie die Ergebnis-Intervalle dabei zu verändern sind sollte klar sein.
Die Laufzeit von diesem Algorithmus wird von der Sortierung der Elemente dominiert, ist das in deinem Fall effektiv genug?
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.2, vom Themenstarter, eingetragen 2012-08-21 14:28
|
2012-08-21 10:48 - Calculus in Beitrag No. 1 schreibt:
Nun speicherst du alle Werte beta_i und alpha_i + 1 - l
 
Geh ich richtig davon aus, dass du mit \beta_i den Endpunkt und mit \alpha_i den Anfangspunkt eines Intervalls aus I bezeichnest? Oder doch umgekehrt? Und warum wird \alpha_i + 1 - l gespeichert? Das ist mir noch nicht so klar.
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.3, eingetragen 2012-08-21 14:37
|
Die alpha sollen Anfangspunkte sein, die beta Endpunkte.
Bei den alphas wird + 1 - l gerechnet, weil geprüft werden muss ob beta = alpha_i + 1 gilt; Das ist aber genau dann der Fall, wenn alpha + l = alpha_i + 1 <=> alpha = alpha_i + 1 - l.
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.4, vom Themenstarter, eingetragen 2012-08-21 16:09
|
 
Ich glaub, im Moment ist es echt zu heiss hier. Vlt. kannst du mir die Vorgehensweise am obigen Bsp. naeher erlaeutern: Wenn ich es machen, wie's oben beschrieben ist \(Anfang eines Intervalls um +1 - l verschieben; aufsteigend sortieren\), erhalte ich: x_(1)=-6 x_(3)=-5 x_(5)=-3 x_(7)=4 x_(9)=4 x_(2)=5 x_(11)=5 x_(13)=6 x_(6)=9 x_(8)=12 x_(4)=14 x_(15)=16 x_(10)=18 x_(14)=18 x_(12)=19 x_(17)=20 x_(19)=23 x_(21)=24 x_(16)=27 x_(22)=32 x_(18)=35 x_(20)=35 \(gerade Indizes: Endpunkte; ungerade Indizes: Anfangspunkte\) Und nun? Wie kommen die Grenzen A und B ins Spiel?
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.5, eingetragen 2012-08-21 19:29
|
Wir fangen an: Unsere Zählvariable ist M, wir gehen durch die Liste und erhöhen immer dann, wenn wir einen ungeraden Index finden; Wenn wir einen geraden Index finden verringern wir die Variable wieder. Bei den ersten drei Werten passiert noch nichts spannendes.
Nach den ersten drei Zahlen ist M = 3; Das heißt das erste Intervall bei dem mindestens 3 Intervalle überdeckt sind lautet [-3, 5]. Das liegt aber nicht innerhalb von [A, B] und damit können wir es nicht gebrauchen.
Danach sehen wir zwei mal den selben Eintrag, eine 4. Beide male ist der Index ungerade, als erhöhen wir M auf 5. Damit ist M >= 3 und wir haben unseren ersten Intervallanfang gefunden: 4.
Danach passiert erstmal nichts interessantes, der Wert von M schwankt nach oben und unten. Erst bei x_14 haben wir einen Wert von 2 erreicht. Wenn wir also ein Intervall an der Stelle x_14 = 18 starten lassen, überdeckt es nur 2 Intervalle; Folglich kann der späteste Anfang eines Intervalls bei 17 liegen, das Ende ist dementsprechend 17 + 8 = 25. Damit haben wir das Ende unseres ersten Intervalls gefunden: 25
Nun geht es weiter, bei x_19 nimmt M den Wert 3 an; Hier haben wir also einen neuen Intervallanfang: 23
Bei x_22 = 32 hat M wieder den Wert 2, also kann ein Intervall maximal an der Stelle 31 anfangen und somit bei 39 enden. Die 39 ist allerdings schon größer als B = 31, bleibt noch die Hoffnung dass das Intervall [23, 31] "zulässig" ist. Das ist der Fall, weil 23 + 8 <= 31.
Damit hat man zwei Intervalle gefunden: [4, 25] und [23, 31];
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.6, vom Themenstarter, eingetragen 2012-08-22 14:23
|
Hi!
Super, danke dir! Hier nur noch der Pseudocode der Vollstaendikeit halber - sollte so richtig sein oder sieht jemand Fehler?
Pseudocode 1. Erstelle eine Liste 'NEXT'
2. Sortiere NEXT
3. Gehe NEXT durch:
counter <- 0
s <- -1 // Startpunkt eines maximalen Intervalls; falls s == -1, so liegt ein solches nicht vor
while (NEXT nicht leer) do
e <- NEXT.pop()
x <- e.val
if (e.type == AP) then
counter++
else
counter--
// falls es mehrere Eintraege mit dem Wert x gibt...
while (NEXT.top().val == x) do
n <- NEXT.pop()
if (n.type == AP) then
counter++
else
counter--
if (counter >= m) then
if ([x, x + l] in [A, B] && s == -1) then
s <- x // neuer Startpunkt fuer ein maximales Intervall gefunden
else
if ( s \neq -1 ) then
if ([s, x -1 + l] in [A, B]) then
[s, x -1 + l] ist ein maximales Intervall
else
if (B - s >= l) then
[s, B] ist ein maximales Intervall
s <- -1 |
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.7, eingetragen 2012-08-22 16:31
|
Der Teil mit dem s sieht noch nicht so gut aus, schließlich hast du nicht immer wenn counter >= m ist ein maximales Intervall gefunden, sondern erst wenn counter < m, nachdem es vorher >= m war.
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.8, vom Themenstarter, eingetragen 2012-08-23 08:56
|
2012-08-22 16:31 - Calculus in Beitrag No. 7 schreibt:
...sondern erst wenn counter < m, nachdem es vorher >= m war.
Aber das gewaehrleiste ich doch durch
Pseudocode if (counter >= m) then
if ( ... s == -1) then
...
else
if ( s \neq -1 ) then
... |
Erst wenn man
1. sicher ist, dass das moegliche Intervall in [A, B] liegt und
2. den Startpunkt noch nicht gesetzt hat,
erst dann wird der Startpunkt s gewaehlt.
Falls der Counter < m wird und s > -1 (weswegen vorher counter >= m gewesen sein muss), dann liegt ein maximales Intervall vor.
Oder wo ist der Denkfehler?
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.9, eingetragen 2012-08-23 10:16
|
Das Problem ist folgendes: Wenn du s setzt und der counter im nächsten Schritt immernoch >= m ist, gibst du aus dass ein maximales Intervall gefunden wurde - das ist jedoch nicht der Fall.
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.10, vom Themenstarter, eingetragen 2012-08-23 10:38
|
Wenn ich doch im vorherigen Schritt s gesetzt habe (da counter >= m), und im naechsten Schritt die Bedingung 'counter >= m' noch immer erfuellt ist, gehe ich doch gar nicht in den else-Zweig rein, wodurch es zu keiner Ausgabe eines maximalen Intervalls kommen kann.
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.11, eingetragen 2012-08-23 10:58
|
Mein Fehler, ich hab das else irgendwie zu dem inneren if gezählt. Dann sollte der Code so passen ;)
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.12, vom Themenstarter, eingetragen 2012-08-23 11:01
|
Dann ist ja gut! Hatte schon an meinen Faehigkeiten gezweifelt :-D
Danke nochmal fuer deine Hilfe!
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.13, vom Themenstarter, eingetragen 2012-10-06 15:49
|
Bei der Implementation hat sich leider heraus gestellt, dass der Algorithmus nicht immer die maximalen Intervalle liefert. Genauer gesagt, geht es um das erste maximale Intervall, das berechnet wird (falls es ex.):
Je nachdem, wie die Intervalle aus I liegen, berechnet der Algorithmus ein zu kleines Intervall. Ein Beispiel dazu:
hierbei handelt es sich nur um den linken (relevanten) Teil. Die Mindestanzahl sei m = 3 und die Referenzlaenge sei l = 50.
Folgende sortierte Liste erhaelt man:
(ungerade Indizes sind dabei Anfangspunkte, gerade Endpunkte).
Der Algorithmus laueft dann wie folgt ab:
: counter = 1
: counter = 2
: counter = 3,
: counter = 2
: counter = 3,
: counter = 4,
Aber eigentlich sollte sich s = 80 ergeben.
Laesst sich der Algorithmus trotzdem noch retten? Er muss irgendwie geeignet initialisiert werden, doch etwas gescheites hab ich noch nicht gefunden.
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.14, eingetragen 2012-10-06 20:39
|
Machs einfach andersrum: Erstell erstmal alle Intervalle unabhängig von dem Gesamtintervall. Wenn du damit fertig bist, beschneidest du alle Intervalle auf die entsprechende Länge [und wirfst zu kurze Intervalle raus].
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.15, vom Themenstarter, eingetragen 2012-10-07 22:04
|
Hey,
koenntest du das ein wenig genauer erklaeren? Am besten am obigen Beispiel, weil so ganz steig ich noch nicht dahinter.
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
Calculus
Senior  Dabei seit: 10.08.2012 Mitteilungen: 2620
Aus:
 |     Beitrag No.16, eingetragen 2012-10-07 22:10
|
Achte nicht darauf, ob die Intervalle in [80, B] liegen, sondern erstell sie erstmal unabhängig davon die maximalen Intervalle. Dann gehst du alle durch und korrigierst zu kleine/ zu große Grenzen.
|
Profil
Quote
Link |
NigiriTako
Aktiv  Dabei seit: 24.04.2008 Mitteilungen: 218
Aus: Trier
 |     Beitrag No.17, vom Themenstarter, eingetragen 2012-10-08 17:35
|
Hi!
Ich hab mir nun folgendes ueberlegt:
Statt wie vorgeschlagen am Ende alle Intervalle zu uberpruefen, mache ich nun folgendes:
falls der Zaehler groesser/gleich der geforderten Mindestanzahl ist, frage ich nach, ob fuer den aktuelle Punkt x gilt:
Falls ja, dann setzt man den Startpunkt nun auf A. Also:
Pseudocode 1. Erstelle eine Liste 'NEXT'
2. Sortiere NEXT
3. Gehe NEXT durch:
counter <- 0
s <- -1 // Startpunkt eines maximalen Intervalls; falls s == -1, so liegt ein solches
nicht vor
while (NEXT nicht leer) do
e <- NEXT.pop()
x <- e.val
if (e.type == AP) then
counter++
else
counter--
fi
// falls es mehrere Eintraege mit dem Wert x gibt...
while (NEXT.top().val == x) do
n <- NEXT.pop()
if (n.type == AP) then
counter++
else
counter--
od
if (counter >= m) then
if (x in [A-l+1, A-1])
s <- A
else
if ([x, x + l] in [A, B] && s == -1) then
s <- x // neuer Startpunkt fuer ein maximales Intervall gefunden
fi
fi
else
if ( s \neq -1 ) then
if ([s, x -1 + l] in [A, B]) then
[s, x -1 + l] ist ein maximales Intervall
else
if (B - s >= l) then
[s, B] ist ein maximales Intervall
fi
fi
fi
s <- -1
fi
od |
Sollte so eigentlich passen, oder?
----------------- Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)
|
Profil
Quote
Link |
|