Die Mathe-Redaktion - 19.05.2013 10:42
Auswahl
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]

Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter April 2013

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 441 Gäste und 25 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matroid
Informatik » Algorithmen / Datenstrukturen » maximale Intervalle bestimmen
Druckversion
Druckversion
Autor
Universität/Hochschule J maximale Intervalle bestimmen
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2012-08-21 09:04


fed-Code einblenden
Bildbeschreibung
fed-Code einblenden


-----------------
Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)



  Profil  Quote  Link auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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

fed-Code einblenden


-----------------
Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)



  Profil  Quote  Link auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2012-08-21 16:09


fed-Code einblenden


-----------------
Alles was lediglich wahrscheinlich ist, ist wahrscheinlich falsch.
(Rene Descartes)



  Profil  Quote  Link auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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:

Bildbeschreibung

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:

x_1 = -49, x_3 = -9, x_5 = 11, x_2 = 40, x_7 = 71, x_9 = 91, x_4 = 100, x_6 = 130, x_{10} = 190, x_8 =220
(ungerade Indizes sind dabei Anfangspunkte, gerade Endpunkte).
Der Algorithmus laueft dann wie folgt ab:

x_1: counter = 1
x_3: counter = 2
x_5: counter = 3, [11,61] \not\subset [80,B]
x_2: counter = 2
x_7: counter = 3, [71,121] \not\subset [80,B]
x_5: counter = 4, [91,141] \subset [80,B] \Rightarrow s = 91

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 auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Calculus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 10.08.2012
Mitteilungen: 2620
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
NigiriTako
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 24.04.2008
Mitteilungen: 218
Aus: Trier
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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:

x \in [A -l + 1, A - 1]

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 auf diesen Beitrag Link
NigiriTako hat die Antworten auf ihre/seine Frage gesehen.
NigiriTako hat selbst das Ok-Häkchen gesetzt.
Bewerte diesen Thread:
[Was sonst bewertet wurde]
 Neues Thema [Neues Thema]

 Druckversion [Druckversion]


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2013 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]