<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mathematical Engineering - LRT &#187; Ingenieurinformatik</title>
	<atom:link href="http://me-lrt.de/kategorie/studium-1/ingenieurinformatik/feed" rel="self" type="application/rss+xml" />
	<link>http://me-lrt.de</link>
	<description>Lernhilfen für das Studium, Übungsaufgaben mit Musterlösungen, Zusammenfassungen und Skripte, auch für andere technische Studiengänge relevant</description>
	<lastBuildDate>Wed, 18 Aug 2010 13:53:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Prüfungsfrage 10 &#8211; minimaler Abstand von Punkten im QuadTree</title>
		<link>http://me-lrt.de/minimaler-abstand-punkte-quadtree</link>
		<comments>http://me-lrt.de/minimaler-abstand-punkte-quadtree#comments</comments>
		<pubDate>Fri, 04 Jun 2010 18:00:44 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5261</guid>
		<description><![CDATA[Im Einheitsquadrat  werden n Punkte zufällig erzeugt. Das Einheitsquadrat wird rekursiv in jeweils vier gleich große Quadranten zerlegt, die Aufteilung in einem Quadtree gespeichert. Dieser Quadtree erreicht bei der gegebenen Punktwolke eine Tiefe k. Geben Sie an, in welcher Größenordnung der minimale gegenseitige Abstand zweier Punkte der gegebenen Punktwolke liegt!
Lösung

S: Seitenlänge
h: Höhe
c: Diagonale
k: Tiefe
Gesucht: [...]]]></description>
			<content:encoded><![CDATA[<p>Im Einheitsquadrat <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-804605e9ec61bcb4e21e521b3f1168f3.gif" alt="\left( {0;1} \right) \times \left( {0;1} \right)" title="\left( {0;1} \right) \times \left( {0;1} \right)" style="vertical-align: -4px; border: none;"/> werden n Punkte zufällig erzeugt. Das Einheitsquadrat wird rekursiv in jeweils vier gleich große Quadranten zerlegt, die Aufteilung in einem Quadtree gespeichert. Dieser Quadtree erreicht bei der gegebenen Punktwolke eine Tiefe k. Geben Sie an, in welcher Größenordnung der minimale gegenseitige Abstand zweier Punkte der gegebenen Punktwolke liegt!</p>
<h2>Lösung</h2>
<p><img src="http://me-lrt.de/img/inginf-quadtree.png" alt="inginf-quadtree" /></p>
<p>S: Seitenlänge<br />
h: Höhe<br />
c: Diagonale<br />
k: Tiefe</p>
<p>Gesucht: c</p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-8781f4040563ed2c2090b5e01a4404cc.gif" alt="\frac{S}{{{2^k}}} = h = \frac{c}{{\sqrt 2 }}\quad \Rightarrow \quad \frac{{S\sqrt 2 }}{c} = {2^k}\quad \Rightarrow \quad {\log _2}\left( {\frac{{S\sqrt 2 }}{c}} \right) = k" title="\frac{S}{{{2^k}}} = h = \frac{c}{{\sqrt 2 }}\quad \Rightarrow \quad \frac{{S\sqrt 2 }}{c} = {2^k}\quad \Rightarrow \quad {\log _2}\left( {\frac{{S\sqrt 2 }}{c}} \right) = k" style="vertical-align: -12px; border: none;"/></p>
<p>Wenn man die Tiefe nicht bei 0, sondern bei 1 beginnen lässt, so kommet man auf:</p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-77bcca2267549dfc2d7c4b219cd18e8b.gif" alt="k = 1 + {\log _2}\left( {\frac{{S\sqrt 2 }}{c}} \right) = 1 + \underbrace {{{\log }_2}\left( {\sqrt 2 } \right)}_{\frac{1}{2}} + {\log _2}\left( {\frac{S}{c}} \right) = \frac{3}{2} + {\log _2}\left( {\frac{S}{c}} \right)" title="k = 1 + {\log _2}\left( {\frac{{S\sqrt 2 }}{c}} \right) = 1 + \underbrace {{{\log }_2}\left( {\sqrt 2 } \right)}_{\frac{1}{2}} + {\log _2}\left( {\frac{S}{c}} \right) = \frac{3}{2} + {\log _2}\left( {\frac{S}{c}} \right)" style="vertical-align: -44px; border: none;"/></p>
<p><strong>Anzahl der Knoten des Baums:</strong> O(n)</p>
<p><strong>Tiefe:</strong> <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-80099b2a768c7c541952fd76542f2e22.gif" alt="O\left( {\log \frac{S}{c}} \right)" title="O\left( {\log \frac{S}{c}} \right)" style="vertical-align: -6px; border: none;"/></p>
<p><strong>Gesamtaufwand: </strong><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-992dc1f17b9307834adbb391561ffb3d.gif" alt="O\left( {n \cdot \log \frac{S}{c}} \right)" title="O\left( {n \cdot \log \frac{S}{c}} \right)" style="vertical-align: -6px; border: none;"/></p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/minimaler-abstand-punkte-quadtree/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 09 &#8211; n kleinste Elemente eines Feldes</title>
		<link>http://me-lrt.de/kleinste-elemente-eines-feldes</link>
		<comments>http://me-lrt.de/kleinste-elemente-eines-feldes#comments</comments>
		<pubDate>Thu, 03 Jun 2010 18:00:20 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5258</guid>
		<description><![CDATA[Gegeben ist ein Feld mit n unsortierten Einträgen . Geben Sie einen Algorithmus an (in Pseudocode oder einer gängigen Programmiersprache), mit der die m kleinsten Einträge des Feldes gefunden werden können , ohne dass das Feld komplett sortiert wird. Welche Rechenzeitkomplexität besitzt der von Ihnen angegebene Algorithmus?
Lösung

public class Suche {
	public static void main(String[] args) {
		double [...]]]></description>
			<content:encoded><![CDATA[<p>Gegeben ist ein Feld mit n unsortierten Einträgen <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-8f657311880529c4c28297e1a07ebe75.gif" alt="\left( {{x_i}} \right),\:\:i \in \mathbb{N}" title="\left( {{x_i}} \right),\:\:i \in \mathbb{N}" style="vertical-align: -4px; border: none;"/>. Geben Sie einen Algorithmus an (in Pseudocode oder einer gängigen Programmiersprache), mit der die m kleinsten Einträge des Feldes gefunden werden können <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-9ac86aa1a2fa952ca686775bb247b6df.gif" alt="\left( {0 < m < n} \right)" title="\left( {0 < m < n} \right)" style="vertical-align: -4px; border: none;"/>, ohne dass das Feld komplett sortiert wird. Welche Rechenzeitkomplexität besitzt der von Ihnen angegebene Algorithmus?</p>
<h2>Lösung</h2>
<pre class="brush: java;">
public class Suche {
	public static void main(String[] args) {
		double x[] = {10, 12, 50, 5, 13, 6, 8, 11};
		double Min = Double.POSITIVE_INFINITY;
		double LastMin = Double.NEGATIVE_INFINITY;
		int m = 3;
		int n = x.length;
		for (int j = 0; j &lt; m ; j++){
			for (int i = 0; i &lt; n ; i++)
				if (x[i] &lt; Min &amp;&amp; x[i] &gt; LastMin)
					Min = x[i];
			LastMin = Min;
			Min = Double.POSITIVE_INFINITY;
			System.out.print(LastMin+&quot; ; &quot;);
		}
	}
}
</pre>
<p>Liefert: 5.0 ; 6.0 ; 8.0 ; </p>
<p>Rechenzeitkomplexität wäre allerdings: <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-4e64a25cfba1355977d26e794a651954.gif" alt="O\left( {m \cdot n} \right)" title="O\left( {m \cdot n} \right)" style="vertical-align: -4px; border: none;"/></p>
<p>Ein besserer Algorithmus hat den Aufwand n:</p>
<pre class="brush: java;">
sortiere den Vektor x im Bereich [0, m]
für i = m bis n
	tausche x[i] mit x[m]
	j = m
	solnge j &gt; 0 und x[j-1] &gt; x[j]
		tausche x[j-1] mit x[j]
		-- j
</pre>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/kleinste-elemente-eines-feldes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 08 &#8211; Tiefensuche am Beispiel</title>
		<link>http://me-lrt.de/tiefensuche-beispiel</link>
		<comments>http://me-lrt.de/tiefensuche-beispiel#comments</comments>
		<pubDate>Wed, 02 Jun 2010 18:00:03 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5254</guid>
		<description><![CDATA[Auf dem Beiblatt ist die rechnerorientierte Darstellung eines Graphen als Kantenliste angegeben. Zeichnen Sie den Graphen und geben Sie an, in welcher Reihenfolge die Knoten des Graphen aufgefunden werden, wenn man, ausgehend vom Knoten A, eine Tiefensuche durchführt.
Lösung
Sei folgende Kantenliste gegeben:

Damit erhält man folgenden Graphen:

Mit Hilfe der Tiefensuche (LiFo) ermittelt man nun die Reihenfolge, in [...]]]></description>
			<content:encoded><![CDATA[<p>Auf dem Beiblatt ist die rechnerorientierte Darstellung eines Graphen als Kantenliste angegeben. Zeichnen Sie den Graphen und geben Sie an, in welcher Reihenfolge die Knoten des Graphen aufgefunden werden, wenn man, ausgehend vom Knoten A, eine Tiefensuche durchführt.</p>
<h2>Lösung</h2>
<p>Sei folgende Kantenliste gegeben:</p>
<p><img src="http://me-lrt.de/img/inginf-kantenliste.png" alt="inginf-kantenliste" /></p>
<p>Damit erhält man folgenden Graphen:</p>
<p><img src="http://me-lrt.de/img/inginf-tiefensuche.png" alt="inginf-tiefensuche" /></p>
<p>Mit Hilfe der Tiefensuche (LiFo) ermittelt man nun die Reihenfolge, in der die Knoten gefunden werden:</p>
<p><img src="http://me-lrt.de/img/inginf-tiefensuche-breitensuche-tabellen.png" alt="inginf-tiefensuche-breitensuche-tabellen" /></p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/tiefensuche-beispiel/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 07 &#8211; Binärbaum, AVL-Baum, Algorithmus, Datenstruktur</title>
		<link>http://me-lrt.de/binarbaum-avl-tree-baum-algorithmus-datenstruktur</link>
		<comments>http://me-lrt.de/binarbaum-avl-tree-baum-algorithmus-datenstruktur#comments</comments>
		<pubDate>Tue, 01 Jun 2010 18:00:22 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5251</guid>
		<description><![CDATA[Gegeben ist ein Binärbaum. Nun wird der Knoten D gelöscht. Wie sieht der Baum nach Löschen des Knotens aus? Geben Sie eine Programmskizze „Löschen eines Knotens“ an“!
Wie kann die durch Löschen oder Einfügen von Knoten ausgelöste Unbalanciertheit eines Baums vermieden werden?
Lösung
Der Unterschied der Höhen hlinks und hrechts der beiden Nachfolger-Teilbäume eines Knotens soll minimiert werden.

Hier [...]]]></description>
			<content:encoded><![CDATA[<p>Gegeben ist ein Binärbaum. Nun wird der Knoten D gelöscht. Wie sieht der Baum nach Löschen des Knotens aus? Geben Sie eine Programmskizze „Löschen eines Knotens“ an“!<br />
Wie kann die durch Löschen oder Einfügen von Knoten ausgelöste Unbalanciertheit eines Baums vermieden werden?</p>
<h2>Lösung</h2>
<p>Der Unterschied der Höhen h<sub>links</sub> und h<sub>rechts</sub> der beiden Nachfolger-Teilbäume eines Knotens soll minimiert werden.</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-01.png" alt="inf-avl-tree-01" /></p>
<p>Hier ist h<sub>rechts</sub>-h<sub>links</sub> = -2. Dies muss verbessert werden. Die Idee hinter selbstbalancierten Binärbäumen (AVL-Bäume nach Adelson-Velsky-Landis) ist es, in jedem Knoten ein Balancekriterium zu speichern. Dieser Wert wird berechnet mit der Formel bal = h<sub>rechts</sub>-h<sub>links</sub>.<br />
Zulässige Werte für bal sind <strong>nur</strong> {-1, 0, 1}, das heißt der linke und der rechte Teilbaum eines Knotens dürfen sich höchstens um 1 in der Höhe unterscheiden.</p>
<p>Es kann nachgewiesen werden, dass in diesem Fall der Aufwand zum Einfügen eines neuen Knotens nur O(log n) ist.</p>
<p><strong>Beispiel</strong>:</p>
<p>1. bis 3. Knoten einfügen:</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-02.png" alt="inf-avl-tree-02" /></p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-03.png" alt="inf-avl-tree-03" /></p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-04.png" alt="inf-avl-tree-04" /></p>
<p>4. und 5. Knoten einfügen:</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-05.png" alt="inf-avl-tree-05" /></p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-06.png" alt="inf-avl-tree-06" /></p>
<h3>Operationen in AVL-Bäumen</h3>
<p><strong>Einfügen neuer Knoten mit insert</strong></p>
<p>Wenn wir einen neuen Knoten einfügen, gehen wir wie beim normalen Binärbaum vor. Jedoch wird rückwärts, vom neuen Knoten aus, dem vorausgehende Knoten mitgeteilt, dass der entsprechende Teilbaum gewachsen ist.<br />
bal erhöht oder verringert sich dadurch um 1. Wenn sich bal nicht mehr im zulässigen Wertebereich befindet, muss der Baum lokal umgebaut werden. Der Funktion wird wie beim Binärbaum der Schlüssel des neuen Elementes übergeben, sowie die Stelle, an der das Element eingefügt werden soll. Beim Aufruf durch den Benutzer ist dies der Wurzelknoten. Programmintern wird die Funktion dann im weiteren Verlauf rekursiv von sich selbst mit einem anderen Parameter für t aufgerufen.<br />
Im ersten Schritt wird geprüft, ob an der Stelle t schon ein Knoten existiert. Wenn nicht, wird an genau dieser Stelle der neue Knoten erzeugt. Wenn der Knoten t schon existiert, muss geprüft werden, ob der neue Knoten als linker oder als rechter Nachfolger in Frage kommt. Hierfür wird der übergebene Schlüssel mit dem Schlüssel des Knotens t verglichen. An dieser Stelle wollen wir nun vier verschiedene Fälle untersuchen, die beim Einfügen des Knotens auf der linken oder der rechten Seite auftreten können.</p>
<p><strong>Fall 1:</strong></p>
<p>Durch das Einfügen des neuen Knotens wird der linke Arm zu lang. Diese Situation ist der “Left-Left-Case”. Das Problem wird behoben durch eine einfache Rotation nach rechts:</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-07.png" alt="inf-avl-tree-07" /></p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-08.png" alt="inf-avl-tree-08" /></p>
<p>Der linke Teilarm (Element 2) wird dabei einfach mitgezogen. Da auf dieses linke “Kind” geachtet werden muss, wird die Rotation “rotateWithLeftChild” genannt.</p>
<p><strong>Fall 2:</strong></p>
<p>Durch das Einfügen des neuen Knotens wird der linke Arm zu lang. Dieser Fall (Right-Right-Case) ist analog zu Fall 1. Hier wird also auch das Problem mit der gleichen Herangehensweise gelöst: Der Baum wird nach links rotiert mit der Funktion “rotateWithRightChild”</p>
<p><strong>Fall 3:</strong></p>
<p>Durch das Einfügen des neuen Knotens wird der linke Arm zu lang, allerdings ist der neue Knoten nun nicht linker Nachfolger, sondern rechter Nachfolger. Hier kann der Baum nicht einfach nach rechts rotiert werden, denn dann wäre der Knoten 3 an der Stelle der Wurzel. Sowohl Knoten 4 als auch Knoten 5 haben aber einen größeren Schlüsselwert als Knoten 3, deshalb hätte Knoten 3 zwei rechte Nachfolger. Es muss jedoch immer einen linken und einen rechten Nachfolger geben.</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-11.png" alt="inf-avl-tree-11" /></p>
<p>Die Lösung des Problems ist eine doppelte Rotation. Zuerst wird eine lokale Rotation nach links durchgeführt, anschließend folgt eine Rotation nach rechts, wobei das linke “Kind” mitgezogen wird:</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-12.png" alt="inf-avl-tree-12" /></p>
<p>Knoten 4 ist nun die neue Wurzel, er hat einen linken und einen rechten Nachfolger und der Baum ist wieder ausbalanciert. Die Funktion, die diesen beiden Rotationen kombiniert, ist “doubleWithLeftChild”.</p>
<p><strong>Fall 4:</strong></p>
<p>Durch das Einfügen des neuen Knotens wird der rechte Arm zu lang, allerdings ist der neue Knoten nun nicht rechter Nachfolger, sondern linker Nachfolger. Dies ist analog zu 3.</p>
<p><strong>Löschen eines Knotens</strong></p>
<p>Es gibt zwei Varianten, einen Knoten aus einem Binärbaum zu löschen. </p>
<p><strong>Erste Möglichkeit</strong>:</p>
<p>Der linke Nachfolgerbaum wird an die Stelle des gelöschten Knotens gesetzt. Der rechte Nachfolgerbaum wird an den untersten rechten Knoten des linken angehängt. Anschließend muss mit den oben beschriebenen Rotationen die Balance des Baumes wiederhergestellt werden.</p>
<p><img src="http://me-lrt.de/img/inf-avl-tree-15.png" alt="inf-avl-tree-15" /></p>
<p><strong>Zweite Möglichkeit</strong>: </p>
<p>Der zu löschende Knoten wird durch das kleinste Element des rechten Nachfolgerbaumes ersetzt (im Fall oben wäre dies der Knoten F). Dieses Element lässt sich finden, indem man im rechten Baum immer dem linken Weg nach unten folgt, bis es nur noch einen Weg nach rechts oder gar keinen Weg mehr gibt. Diese Möglichkeit des Löschens verhindert, dass sich die Geometrie des Baumes stark ändern kann, es müssen daher nicht viele, sondern höchstens eine Rotation zur Balancierung durchgeführt werden.</p>
<p><strong>Rechenaufwand</strong></p>
<p>Die Links- und Rechtsrotationen sind alle lokale Operationen mit dem Aufwand O(1). Als obere Abschätzung kann man sagen, dass schlimmstenfalls bei jedem Einfügen eine Rotation durchgeführt werden muss. Dieser schlimmste Fall kann aber mathematisch nachweislich nicht auftreten, der Rechenaufwand zum Einfügen eines Knotens geht nicht über O(log n) hinaus.</p>
<p>Der Rechenaufwand, um den gesamten Baum aufzubauen ist somit O(n log n), das Optimum für einen Binärbaum.<br />
Der fertig aufgebaute AVL-Baum ist ein perfekter Binärbaum, in dem mit minimalem Aufwand eine sortierte Traversierung durchgeführt werden kann. Zusätzlich ist der AVL-Baum eine dynamische Datenstruktur (Vorteile gegenüber statischen Feldern). Somit ist der AVL-Baum auch ein optimales Sortierverfahren.</p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/binarbaum-avl-tree-baum-algorithmus-datenstruktur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 06 &#8211; k-d-Baum Algorithmus, Datenstruktur</title>
		<link>http://me-lrt.de/k-d-baum-tree-algorithmus-datenstruktur</link>
		<comments>http://me-lrt.de/k-d-baum-tree-algorithmus-datenstruktur#comments</comments>
		<pubDate>Mon, 31 May 2010 18:00:36 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5248</guid>
		<description><![CDATA[Es wird ein zweidimensionaler k-d-Baum aufgebaut, bei dem in jedem Knoten (innere Knoten und Blätter) jeweils ein Punkt gespeichert ist. Die Punkte einer aus n Punkten bestehenden Punktwolke werden dazu zufällig permutiert und dann nacheinander in den Baum eingefügt.
Welche maximale Tiefe kann der Baum dabei erreichen?
Bei welcher geometrischen Lage der Punkte wird die maximale Tiefe [...]]]></description>
			<content:encoded><![CDATA[<p>Es wird ein zweidimensionaler k-d-Baum aufgebaut, bei dem in jedem Knoten (innere Knoten und Blätter) jeweils ein Punkt gespeichert ist. Die Punkte einer aus n Punkten bestehenden Punktwolke werden dazu zufällig permutiert und dann nacheinander in den Baum eingefügt.<br />
Welche maximale Tiefe kann der Baum dabei erreichen?<br />
Bei welcher geometrischen Lage der Punkte wird die maximale Tiefe des Baums erreicht?</p>
<h2>Lösung</h2>
<p>Die maximale Tiefe wäre n:</p>
<p><img src="http://me-lrt.de/img/inginf-k-d-baum-tiefe-a.png" alt="inginf-k-d-baum-tiefe-a" /></p>
<p>Die geometrische Lage der Punkte müsste für die maximale Tiefe so aussehen, dass der jeweils eingefügte Punkt stets unten rechts (oder auch in andere Diagonalrichtungen) von den vorher eingezeichneten Trennlinien liegt.</p>
<p><img src="http://me-lrt.de/img/inginf-k-d-baum-tiefe-lage.png" alt="inginf-k-d-baum-tiefe-lage" /></p>
<p>Aufbau der Klasse k-d-Tree:</p>
<p><img src="http://me-lrt.de/img/inginf-k-d-baum-aufbau-klasse.png" alt="inginf-k-d-baum-aufbau-klasse" /></p>
<p><strong>Einfügen in einen k-d-Baum</strong></p>
<p>Für den ersten Punkt: Erzeuge Blatt</p>
<p>Neuen Punkt einfügen:(vs: Startknoten, xp: x-Wert des Punktes; xv: x-Wert des Knotens)</p>
<pre class="brush: java;">
Prozedur Einfügen(vs)
Wenn Tiefe gerade:
Wenn xp &lt; xv
		Wenn linker Teilbaum existiert
			Einfügen(xv.links)
		Sonst
			Erzeuge neues Blatt(links)
Wenn xp &gt; xv
		Wenn rechter Teilbaum existiert
			Einfügen(xv.rechts)
		Sonst
			Erzeuge neues Blatt(rechts)
Sonst: Selbes mit xp und yv
</pre>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/k-d-baum-tree-algorithmus-datenstruktur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 05 &#8211; Sortieralgorithmen (Selectionsort, Quicksort, Bubble, Merge)</title>
		<link>http://me-lrt.de/sortieralgorithmen-selectionsort-quicksort-bubble-merge</link>
		<comments>http://me-lrt.de/sortieralgorithmen-selectionsort-quicksort-bubble-merge#comments</comments>
		<pubDate>Sun, 30 May 2010 18:00:23 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5245</guid>
		<description><![CDATA[Es sei eine Folge von Datensätzen gegeben, die gemäß einem Schlüssel sortiert werden sollen.
Mehrere Datensätze weisen denselben Schlüssel auf, sind jedoch ansonsten verschieden (z.B. Liste nach Namen sortiert, jedoch haben die Personen trotz gleichen Nachnamens verschiedene Vornamen). Sie sollen einen Algorithmus angeben, nach dem die Daten sortiert werden sollen, jedoch die (zufällige) Reihenfolge der Datensätze [...]]]></description>
			<content:encoded><![CDATA[<p>Es sei eine Folge von Datensätzen gegeben, die gemäß einem Schlüssel sortiert werden sollen.<br />
Mehrere Datensätze weisen denselben Schlüssel auf, sind jedoch ansonsten verschieden (z.B. Liste nach Namen sortiert, jedoch haben die Personen trotz gleichen Nachnamens verschiedene Vornamen). Sie sollen einen Algorithmus angeben, nach dem die Daten sortiert werden sollen, jedoch die (zufällige) Reihenfolge der Datensätze mit gleichem Schlüssel erhalten bleiben soll.<br />
Wenn zum Beispiel <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-630b981651c52924343812c3455b9487.gif" alt="{x_5}" title="{x_5}" style="vertical-align: -3px; border: none;"/> der Datensatz „Maier, Hans“ der unsortierten Datei ist und <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-5ef1bad312117d93c8ad37093418219b.gif" alt="{x_{10}}" title="{x_{10}}" style="vertical-align: -4px; border: none;"/> der Datensatz „Maier, Alfred“, dann soll auch nach dem Sortieren der Datei „Maier, Hans“ noch vor „Maier, Alfred“ einsortiert bleiben.<br />
Prüfen Sie, ob die Ihnen bekannten Sortieralgorithmen diese Anforderung erfüllen (so genannte „Stabilität“).</p>
<h2>Lösungsvorschlag</h2>
<p><strong>Bekannte Sortieralgorithmen</strong>:</p>
<ul>
<li>Selectionsort</li>
<li>Quicksort</li>
<li>Bubblesort</li>
<li>Mergesort</li>
</ul>
<p><strong>Selection Sort</strong>:</p>
<p>Idee: Starte beim ersten Element. Suche ein Element, das kleiner ist als das Startelement und tausche die beiden. Verfahre mit den restlichen ebenso.</p>
<p>Beispiel:</p>
<p><img src="http://me-lrt.de/img/inginf-selection-sort.png" alt="inginf-selection-sort" /></p>
<p>Dieses Verfahren ist allerdings nicht stabil.</p>
<p>Bsp:</p>
<p><img src="http://me-lrt.de/img/inginf-selection-sort-2.png" alt="inginf-selection-sort-2" /></p>
<p>Damit sind 13a und 13b in ihrer Reihenfolge vertauscht worden!</p>
<p><strong>Quicksort</strong>:</p>
<p>Idee: „Teile und herrsche!“. Partitionieren in zwei Teilmengen mit je n/2 Einträgen anhand eines Pivot-Elements. Diese rekursiv wieder Partitionieren.<br />
Dieses Verfahren ist allerdings auch nicht stabil.</p>
<p>Bsp:</p>
<p><img src="http://me-lrt.de/img/inginf-quick-sort.png" alt="inginf-quick-sort" /></p>
<p><strong>Bubblesort</strong>:</p>
<p>Idee: Benachbarte Elemente werden getauscht, wenn z.B. das rechte kleiner ist, als das linke. </p>
<p>Dieses Verfahren ist stabil, da immer nur benachbarte Elemente getauscht werden. Es ist also nicht möglich, dass 13a und 13b vertauscht werden.</p>
<p><strong>Mergesort</strong>:</p>
<p>Idee: Ebenfalls „Teile und herrsche!“, allerdings wird je in Listen aufgeteilt, die dann für sich sortiert werden und dann in einem Reißverschlussverfahren wieder zusammengefügt werden.<br />
Damit ist Mergesort ebenfalls stabil, sofern der Merge-Schritt geeignet implementiert wird.</p>
<p><img src="http://me-lrt.de/img/inginf-vergleich-sortierverfahren.png" alt="inginf-vergleich-sortierverfahren" /></p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/sortieralgorithmen-selectionsort-quicksort-bubble-merge/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 04 &#8211; Tiefensuche, Breitensuche, Dijkstra, A-Star</title>
		<link>http://me-lrt.de/tiefensuche-breitensuche-dijkstra-a-star</link>
		<comments>http://me-lrt.de/tiefensuche-breitensuche-dijkstra-a-star#comments</comments>
		<pubDate>Sat, 29 May 2010 18:00:29 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5242</guid>
		<description><![CDATA[Ein Land führt ein Mautsystem ein, in dem an jeder Autobahnanschlussstelle oder Kreuzung eine Mautstelle eingerichtet wird und Maut für die seit der letzten Mautstelle zurückgelegte Strecke zu zahlen ist. Je gefahrenem km wird 1 Cent verlangt, mindestens jedoch 10 Cent. Geben Sie die Idee zu einem Algorithmus an, mit dem möglichst effizient die kostengünstigste [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Land führt ein Mautsystem ein, in dem an jeder Autobahnanschlussstelle oder Kreuzung eine Mautstelle eingerichtet wird und Maut für die seit der letzten Mautstelle zurückgelegte Strecke zu zahlen ist. Je gefahrenem km wird 1 Cent verlangt, mindestens jedoch 10 Cent. Geben Sie die Idee zu einem Algorithmus an, mit dem möglichst effizient die kostengünstigste Strecke zwischen zwei Autobahnanschlussstellen A und B berechnet werden kann! Welche Varianten des Verfahrens ergeben sich, wenn man </p>
<ol>
<li>davon ausgeht, dass die Koordinaten der Anschlussstellen und Kreuzungen bekannt sind?</li>
<li>davon ausgeht, dass nur das Netz und die Streckenlängen zwischen den Anschlussstellen gegeben sind?</li>
</ol>
<h2>Lösung</h2>
<p><img src="http://me-lrt.de/img/inf-a-star-algorithmus-1.png" alt="inf-a-star-algorithmus-1" /></p>
<p>Es handelt sich hierbei um ein Problem aus der Graphentheorie: „Finde den kürzesten Weg!“<br />
Das Straßennetz muss also zunächst wie in der Abbildung links als Graph dargestellt werden, dessen Kanten als Gewichte die Mautkosten haben.<br />
Der Graph muss anschließend möglichst zielgerichtet traversiert werden. Es gibt verschiedene Algorithmen zur Traversierung, die aber vom Grundlegenden Aufbau her alle gleich sind. Die Knoten werden zu Beginn in eine Menge U (unbekannt) geschrieben, der Startknoten wird in eine Menge A (aktiv) übernommen. Dann werden nach und nach die erreichbaren Knoten von U nach A geschoben und untersucht. Knoten, deren Nachbarn alle schon betrachtet wurden, wandern in die Menge F (fertig):</p>
<pre class="brush: java;">
für alle Knoten v aus V
	v.status = unbesucht
A.einfügen(vstart)
solange A.anzahl() &gt; 0 wiederhole
	v = A.entferneEinenKnoten()
	für alle Nachbarknoten w von v
		falls w.status == unbesucht
			w.status = aktiv
			A.einfügen(w)
	v.status = erledigt
</pre>
<p><img src="http://me-lrt.de/img/inf-wegsuche-traversierung.png" alt="inf-wegsuche-traversierung" /></p>
<p>Die verschiedenen Algorithmen unterscheiden sich nun vor allem in der Auswahl des Knotens beim Befehl „entferneEinenKnoten“ und bei der Reihenfolge der Knoten im Befehl danach.</p>
<p><strong>Tiefensuche</strong></p>
<p>Die Tiefensuche verwaltet die Menge A als einen Stapel. Der Knoten, der zuletzt gefunden wurde, wird also als erstes besucht („last in, first out“). Algorithmus:</p>
<pre class="brush: java;">
für alle Knoten v aus V
	v.status = unbesucht
Stapel A.push(vstart)
solange A.anzahl() &gt; 0 wiederhole
	v = A.pop()
	für alle Nachbarknoten w von v
		falls w.status == unbesucht
			w.status = aktiv
			A.push(w)
	v.status = erledigt
</pre>
<p><strong>Breitensuche</strong></p>
<p>Bei der Breitensuche wird die Menge A als Warteschlange verwaltet. Daraus resultiert, dass die Knoten in der Reihenfolge besucht werden, in der sie gefunden wurden (first in first out).<br />
Der Algorithmus ist ansonsten der gleiche. Damit die Wege später nachvollzogen werden können, muss bei der Traversierung in jedem Knoten der Vorgänger gespeichert werden.<br />
Sollen nicht alle Wege im Graphen, sondern nur ein bestimmter, gefunden werden, kann der Algorithmus vorzeitig abgebrochen werden.</p>
<p><strong>Dijkstra</strong></p>
<p>Um nun statt nur irgend einen Weg den kürzesten Weg zu finden, brauchen wir eine Steuerungsfunktion, die jeweils ein passendes Element aus der Menge A aussucht. Als Bewertungsfunktion nutzt man im Dijkstra-Verfahren die aufsummierten Kantengewichte der Kanten, die auf dem bisher zurückgelegten Weg liegen. Wir ordnen also jedem erreichbaren Knoten als „Abstand vom Startknoten“ den Abstand seines Vorgängers v vom Startknoten, zuzüglich des Gewichtes der Kante vw, zu. Das System funktioniert nur, wenn alle Kantengewichte größer oder gleich 0 sind (bei der Routensuche automatisch erfüllt). Wenn ein Knoten zum ersten Mal eine Bewertung erhält, ist noch nicht sicher, dass dies die minimal mögliche ist. Es könnte sein, dass der Knoten später noch auf einem kürzeren Weg vom Startknoten aus erreicht wird. Daher ist die Bewertungen der Knoten in der Menge A variabel: </p>
<pre class="brush: java;">
für alle Knoten v aus V
	v.status = unbesucht
	v.vorgänger = NULL
	f(v) = INF
A.einfügen(vstart)
f(vstart) = 0
solange A.anzahl() &gt; 0 wiederhole
	v = A.entferneKnotenF_min()
	für alle Nachbarknoten w von v
		falls w.status == unbesucht
			w.status = aktiv
			w.vorgänger = v
			f(w) = f(v)+KantenGewicht(v,w)
			A.einfügen(w)
		sonst // w schon bekannt
			falls f(v)+KantenGewicht(v,w) &lt; f(w)
			w.vorgänger = v
			f(w) = f(v)+KantenGewicht(v,w)
	v.status = erledigt
</pre>
<p><strong>A*-Algorithmus</strong></p>
<p><img src="http://me-lrt.de/img/inf-a-star-algorithmus-2.png" alt="inf-a-star-algorithmus-2" /></p>
<p>Der größte Nachteil des Dijkstra-Verfahrens ist, dass der Graph nicht zielgerichtet durchsucht wird. Wie bei der Breitensuche geht man sternförmig vom Startknoten aus. Eine Weiterentwicklung des Dijkstra-Algorithmus ist der A*-Algorithmus. Es handelt sich bei diesem um ein 1968 von Peter Hart, Nils Nilsson und Bertram Raphael entwickeltes „informiertes“ Suchverfahren. Im Gegensatz zu Dijkstra wird bei der Suche nicht der Knoten mit den geringsten Wegkosten zum Startknoten besucht, sondern der am günstigsten <em>erscheinende</em>.<br />
Die Abbildung zeigt einen Graphen mit zehn von A bis J bezeichneten Knoten und elf ungerichteten gewichteten Kanten. Die Wegkosten entsprechen den grünen Zahlen, die blauen Zahlen repräsentieren zum Vergleich die Luftlinienentfernung zwischen den Knoten. In der linken unteren Ecke sind die Luftlinienentfernungen aller Knoten zu A angegeben.<br />
Wenn wir als Mensch in diesem Graphen den kürzesten Weg von I nach A suchen sollten, würden wir spontan in Richtung F losgehen, weil es unlogisch erschiene, J oder G zu besuchen. Das liegt daran, dass F dem Zielknoten viel näher ist (32 Einheiten) als die beiden anderen Knoten (jeweils 60 Einheiten). Doch wie machen wir diese Logik dem Computer verständlich? Die Lösung ist eine so genannte <em>Heuristik</em>.</p>
<p><em>„Heuristik ist die Bezeichnung für ein Lösungsverfahren, das nur zum Teil auf wissenschaftlich gesicherten Erkenntnissen, sondern vorwiegend auf Hypothesen, Analogien oder Erfahrungen aufbaut. Die Güte solcher Verfahren ist deshalb meist nicht beweisbar, sondern wird durch wiederholte Experimente an typischen Problemstellungen nachgewiesen.“</em></p>
<p>Besonders wichtig ist der letzte Satz dieser Definition. Es ist nämlich nicht zu beweisen, dass durch die Verwendung der Luftlinie als Entscheidungsgrundlage für den als nächsten zu besuchenden Knoten der Weg schneller gefunden wird. Da die in der Informatik verwendeten Graphen allerdings meist nicht willkürlich gewählt werden, sondern Darstellungen realer Gegebenheiten sind, gehorchen sie denselben Gesetzen wie die zu modellierenden Objekte. Es ist logisch, dass in einem eine Landkarte darstellenden Graphen die meisten Kantengewichte stark von der Luftlinienentfernung abhängen, obwohl dies nicht zwingend notwendig ist.<br />
Funktion für die Luftlinienentfernung zwischen einem Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> und dem Zielknoten: </p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-880c380cdd038012ac17a02c37e43acc.gif" alt="h\left( u \right) = \sqrt {{{\left( {{x_{Ziel}}-{x_u}} \right)}^2}+{{\left( {{y_{Ziel}}-{y_u}} \right)}^2}} " title="h\left( u \right) = \sqrt {{{\left( {{x_{Ziel}}-{x_u}} \right)}^2}+{{\left( {{y_{Ziel}}-{y_u}} \right)}^2}} " style="vertical-align: -9px; border: none;"/></p>
<p>Diese wird nun zu der schon bei Dijkstra verwendeten Funktion <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ae6bd2fb672eb15943b028ef28b24b3e.gif" alt="f\left( u \right)" title="f\left( u \right)" style="vertical-align: -4px; border: none;"/> addiert, die einem Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> die bekannten Wegkosten vom Startknoten nach <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> zuordnet:</p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-42a9e3e9c0f840bc53abf9726b3664a3.gif" alt="a\left( u \right) = f\left( u \right)+h\left( u \right)" title="a\left( u \right) = f\left( u \right)+h\left( u \right)" style="vertical-align: -4px; border: none;"/></p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ae6bd2fb672eb15943b028ef28b24b3e.gif" alt="f\left( u \right)" title="f\left( u \right)" style="vertical-align: -4px; border: none;"/> muss nun als Kriterium für den jeweils als nächstes zu besuchenden Knoten benutzt werden. Das geschieht, indem dieser Knoten nach dem Kriterium <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-3c84a96a7eb6ad482351d57f0fbe8169.gif" alt="f\left( u \right) = \min " title="f\left( u \right) = \min " style="vertical-align: -4px; border: none;"/> gewählt wird. Hier nun ein Beispiel, um die beschriebene Arbeitsweise zu verdeutlichen.</p>
<p><strong>Beispiel: Berechnung des in der Abbildung gesuchten Weges</strong></p>
<p><img src="http://me-lrt.de/img/inf-a-star-algorithmus-3.png" alt="inf-a-star-algorithmus-3" /></p>
<p><img src="http://me-lrt.de/img/inginf-a-star-table-1.png" alt="inginf-a-star-table-1" /></p>
<p>Es werden zuerst von den drei an den Startknoten angrenzenden Knoten sowohl die Kantengewichte zum Startknoten I als auch die Luftlinien-entfernungen zum Zielknoten A bestimmt und jeweils die Summe daraus gebildet.<br />
Der Dijkstra-Algorithmus würde nun als erstes Knoten J besuchen, da dieser die kleinsten Wegkosten zum Startknoten hat, und liefe damit genau in die falsche Richtung.<br />
Beim A*-Algorithmus ist das Kriterium die berechnete Summe aus Wegkosten und Luftlinie. Daher wird im ersten Schritt Knoten F besucht. Im zweiten Schritt werden alle Knoten überprüft, die von einem der schon besuchten Knoten aus erreicht werden können (also von I oder von F). Das sind die Knoten B, E, G, H und J. Wieder werden die Summen aus Wegkosten und Luftlinienentfernung gebildet und verglichen:</p>
<p><img src="http://me-lrt.de/img/inginf-a-star-table-2.png" alt="inginf-a-star-table-2" /></p>
<p>Diese Summe ist bei Knoten B minimal, daher wird er im zweiten Schritt besucht. Im dritten Schritt steht der Algorithmus vor der Wahl zwischen den Knoten E, G, H, J und <STRONG>A</STRONG>. Da A der Zielknoten ist, könnte man meinen, er würde als nächstes besucht, so dass der Weg komplett wäre. Auch die Luftlinienentfernung von Knoten A zu sich selbst, nämlich 0, spricht dafür. Doch der Weg I-F-B-A wäre 75 Einheiten lang. Bei Betrachtung der folgenden Tabelle fällt auf, dass es einen potentiell kürzeren Weg gibt, nämlich über I-F-E. Dieser wäre im Optimalfall (der restliche Weg ab Knoten E entspricht der Luftlinienentfernung von E zu A) nur 63 Einheiten lang, also 12 Einheiten kürzer als der Weg über B.</p>
<p><img src="http://me-lrt.de/img/inginf-a-star-table-3.png" alt="inginf-a-star-table-3" /></p>
<p>Da allein die Summe das Kriterium für den als nächstes zu besuchenden Knoten ist, fällt die Wahl auf Knoten E. </p>
<p><img src="http://me-lrt.de/img/inf-a-star-algorithmus-4.png" alt="inf-a-star-algorithmus-4" /></p>
<p><img src="http://me-lrt.de/img/inginf-a-star-table-4.png" alt="inginf-a-star-table-4" /></p>
<p>Der Weg über die Knoten E und D hat die geringste Summe aus Wegkosten nach I und Luftlinie nach A. Es gibt also einen potentiell kürzeren Weg von I nach A, der über diese beiden Knoten statt über B führt. Auch wenn der optimale Weg über E und D nun „nur noch“ zwei Einheiten kürzer ist als der schon sichere Weg über B, muss er weiter verfolgt werden. Im vierten Schritt wird D besucht.</p>
<p><img src="http://me-lrt.de/img/inginf-a-star-table-5.png" alt="inginf-a-star-table-5" /></p>
<p>Der kürzeste Weg ist gefunden. Es ist <STRONG>I-F-E-D-A</STRONG> mit der Länge 74, also genau eine Einheit weniger als der Weg über den Knoten B gehabt hätte. Hier wird deutlich, dass es wichtig ist, dass die Schätzfunktion die Länge des optimalen Weges von einem Knoten zum Ziel <strong>immer unterschätzt</strong>, da sonst vielleicht der Weg über B als kürzester gefunden worden wäre, obwohl er nicht optimal ist. Die Luftlinienentfernung als Heuristik zu benutzen ist zulässig, da der kürzeste Weg immer mindestens so lang oder länger als die Luftlinie sein muss.</p>
<p><img src="http://me-lrt.de/img/inf-a-star-algorithmus-5.png" alt="inf-a-star-algorithmus-5" /></p>
<h3>Optimalitätsbeweis</h3>
<p>Ob die optimale Lösung gefunden wird, hängt zuerst einmal davon ab, ob die verwendete Heuristik zulässig ist, ob sie also wie schon beschrieben die Wegkosten immer unterschätzt. Wenn diese Bedingung erfüllt ist, kann bewiesen werden, dass die Lösung immer optimal ist.<br />
Im Folgenden werden die folgenden Funktionen verwendet:</p>
<ul>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-e3ebb50e5461fee3213156f9d1c8c024.gif" alt="g\left( u \right)" title="g\left( u \right)" style="vertical-align: -4px; border: none;"/> ordnet dem Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> die bisher vom Startknoten aus benötigten Wegkosten zu</li>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-e9c5a319d191791aa5d91ccbd9587229.gif" alt="h\left( u \right)" title="h\left( u \right)" style="vertical-align: -4px; border: none;"/> schätzt die Wegkosten vom Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> zum Zielknoten</li>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-31c48bead39f8f2327e63c68b6c7d60d.gif" alt="f\left( u \right) = g\left( u \right)+h\left( u \right)" title="f\left( u \right) = g\left( u \right)+h\left( u \right)" style="vertical-align: -4px; border: none;"/> schätzt somit die Gesamtkosten vom Start- zum Zielknoten</li>
</ul>
<p>Bedingt durch die Vorgehensweise des Algorithmus wird immer zuerst der Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> besucht, dem die Funktion <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ae6bd2fb672eb15943b028ef28b24b3e.gif" alt="f\left( u \right)" title="f\left( u \right)" style="vertical-align: -4px; border: none;"/> den geringsten Funktionswert zuordnet. Wenn also zum Beispiel für einen Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-0cc175b9c0f1b6a831c399e269772661.gif" alt="a" title="a" style="vertical-align: 0px; border: none;"/> gilt: <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-104e7a1808c338e6d2cfaffe84c3f7b2.gif" alt="f\left( a \right) = 23" title="f\left( a \right) = 23" style="vertical-align: -4px; border: none;"/>, dann werden zuerst alle Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-9dd4e461268c8034f5c8564e155c67a6.gif" alt="x" title="x" style="vertical-align: 0px; border: none;"/> weiter erkundet, für die gilt: <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-5719597978e27948743ecb455f362904.gif" alt="f\left( x \right) < 23" title="f\left( x \right) < 23" style="vertical-align: -4px; border: none;"/>. Dadurch ist sichergestellt, dass kein Knoten bei der Wegfindung ausgelassen werden kann, über den ein kürzerer Weg zum Ziel möglich wäre. Hier wird auch klar, warum die Kantengewichte nicht negativ sein dürfen, denn sonst könnte nach einem weit vom Ziel entfernten und daher nicht weiter beachteten Knoten noch eine Kante mit einem hohen negativen Kantengewicht kommen, die den schlecht anmutenden Weg dann doch zum kürzesten macht. Aus diesen Überlegungen ergibt sich der <strong>formale Beweis</strong>:</p>
<p><strong>Annahme:</strong> Der A*-Algorithmus findet eine suboptimale Lösung <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-026c908401fb38b306661b1b94df04dc.gif" alt="{G_2}" title="{G_2}" style="vertical-align: -3px; border: none;"/>, wobei die optimale Lösung <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-c6323045d12d06c6faae510ba0081f9a.gif" alt="{G_1}" title="{G_1}" style="vertical-align: -4px; border: none;"/> die Wegkosten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-4ce444d7d0b938f38e5d45a2d94b20c4.gif" alt="{C_1}" title="{C_1}" style="vertical-align: -4px; border: none;"/> hat.<br />
Für jeden vom Algorithmus gefundenen Zielknoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-fbade9e36a3f36d3d676c1b808451dd7.gif" alt="z" title="z" style="vertical-align: 0px; border: none;"/> gilt <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-0add55c4056984dba7fef005c8de7ec4.gif" alt="h\left( z \right) = 0" title="h\left( z \right) = 0" style="vertical-align: -4px; border: none;"/>, daraus folgt: <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-a3d2f7b98c601faab7e69f1650eee7c8.gif" alt="h\left( {{G_2}} \right) = 0" title="h\left( {{G_2}} \right) = 0" style="vertical-align: -4px; border: none;"/></p>
<p>Außerdem gilt: </p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-2db9685f765cda847f7ca43ee1b4389c.gif" alt="f\left( {{G_2}} \right) = g\left( {{G_2}} \right)+h\left( {{G_2}} \right) = g\left( {{G_2}} \right){\text{ > }}{C_1}" title="f\left( {{G_2}} \right) = g\left( {{G_2}} \right)+h\left( {{G_2}} \right) = g\left( {{G_2}} \right){\text{ > }}{C_1}" style="vertical-align: -4px; border: none;"/></p>
<p>Da für jeden beliebigen Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="n" title="n" style="vertical-align: 0px; border: none;"/> gilt: </p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-22f63df06db00083254fe89ccf7e990d.gif" alt="h\left( n \right) \leq {\text{Wegkosten}}\left( {n,Ziel} \right)" title="h\left( n \right) \leq {\text{Wegkosten}}\left( {n,Ziel} \right)" style="vertical-align: -4px; border: none;"/></p>
<p>folgt für einen Knoten auf dem kürzesten Pfad zum optimalen Ziel <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-c6323045d12d06c6faae510ba0081f9a.gif" alt="{G_1}" title="{G_1}" style="vertical-align: -4px; border: none;"/>: </p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-18ab9b6d01719946eaaa0e9e7c6c3def.gif" alt="f\left( n \right) = g\left( n \right)+h\left( n \right) \leq {C_1}" title="f\left( n \right) = g\left( n \right)+h\left( n \right) \leq {C_1}" style="vertical-align: -4px; border: none;"/></p>
<p>Diese beiden Gleichungen kann man nun zu der folgenden zusammenfassen:</p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-aa079b78045c4e4f89304fd5ae0f8316.gif" alt="f\left( n \right) \leq {C_1} < f\left( {{G_2}} \right)" title="f\left( n \right) \leq {C_1} < f\left( {{G_2}} \right)" style="vertical-align: -4px; border: none;"/></p>
<p>Das bedeutet aber, dass der Knoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-026c908401fb38b306661b1b94df04dc.gif" alt="{G_2}" title="{G_2}" style="vertical-align: -3px; border: none;"/> gar nicht besucht wird, bevor die optimale Lösung <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-c6323045d12d06c6faae510ba0081f9a.gif" alt="{G_1}" title="{G_1}" style="vertical-align: -4px; border: none;"/> gefunden wurde, es wird also zuerst <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-c6323045d12d06c6faae510ba0081f9a.gif" alt="{G_1}" title="{G_1}" style="vertical-align: -4px; border: none;"/> gefunden, das Verfahren ist optimal, q.e.d.</p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/tiefensuche-breitensuche-dijkstra-a-star/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 03 &#8211; incremental insertion Algorithmus, Delaunay</title>
		<link>http://me-lrt.de/incremental-insertion-algorithmus-delaunay</link>
		<comments>http://me-lrt.de/incremental-insertion-algorithmus-delaunay#comments</comments>
		<pubDate>Fri, 28 May 2010 18:00:27 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5239</guid>
		<description><![CDATA[Eine Punktwolke wurde durch den incremental insertion Algorithmus Delaunay-dreiecksvernetzt. Dabei wurde der gerichtete azyklische Dalaunay-Graph aufgebaut. Geben Sie an, wie unter Benützung dieser Datenstruktur möglichst effizient bestimmt werden kann, in welchem Dreieck sich ein neuer, beliebiger Punkt befindet!
Lösung
Die Aufgabenstellung ist es, eine Menge P an Punkten zu einer dreidimensionalen Oberfläche zu verbinden. Zu diesem Zweck [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Punktwolke wurde durch den incremental insertion Algorithmus Delaunay-dreiecksvernetzt. Dabei wurde der gerichtete azyklische Dalaunay-Graph aufgebaut. Geben Sie an, wie unter Benützung dieser Datenstruktur möglichst effizient bestimmt werden kann, in welchem Dreieck sich ein neuer, beliebiger Punkt befindet!</p>
<h2>Lösung</h2>
<p>Die Aufgabenstellung ist es, eine Menge P an Punkten zu einer dreidimensionalen Oberfläche zu verbinden. Zu diesem Zweck könnte man die Fläche um je einen Punkt auf die Höhe des Punktes heben. Dadurch würde das Terrain allerdings diskret werden, es gäbe zwischen den Höhenstufen senkrechte Absätze, was nicht besonders realistisch ist. Stattdessen sollen die Punkte zu Dreiecken verbunden werden. Das Problem löst man durch eine Delaunay-Triangulierung in der Ebene, anschließend werden die Punkte auf ihre jeweilige Höhe gehoben, wobei die Verbindungslinien erhalten bleiben. So entsteht ein vielflächiges Terrain, der Graph einer stetigen stückweise linearen Funktion.<br />
Die Frage ist nun, wie in der Ebene die Punkte am günstigsten zu Dreiecken verbunden werden können. Welche Art der Verbindung am realistischsten ist, kann nicht festgestellt werden, da wir nur die gemessenen Punkte, nicht aber das wirkliche Terrain als Vergleich kennen. Trotzdem wirken manche Triangulierungen natürlicher als andere:</p>
<p><img src="http://me-lrt.de/img/inf-incremental-insertion-algorithmus-beispiel.png" alt="inf-incremental-insertion-algorithmus-beispiel" /></p>
<p>Von den Werten her könnten die schwarzen Punkte einen Bergrücken beschreiben. Triangulierung a unterstützt diese Vorstellung, da der neue Punkt etwa die gleiche Höhe hat. Bei Triangulierung b gibt es einen scharfen Schnitt in der Kette, der neue Punkt ist auf dem Niveau der äußeren Punkte, was unnatürlich wirkt. Das hier auftretende Problem ist, dass die Höhe des neuen Punktes im Fall b von zwei weit entfernten Punkten bestimmt wird. Das wird dadurch deutlich, dass die Winkel der beiden neuen Dreiecke klein sind.<br />
Es gibt eine endliche Anzahl an Möglichkeiten zur Triangulierung, wobei die Anzahl m der Dreiecke immer gleich ist. Gesucht ist die optimale Triangulierung. Diese zeichnet sich dadurch aus, dass der Winkelvektor <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-f65af275f68b5c10da206e4938bcd342.gif" alt="A\left( \mathcal{T} \right) = {\left( {{\alpha _1},{\alpha _2},&#8230;,{\alpha _{3m}}} \right)^T}" title="A\left( \mathcal{T} \right) = {\left( {{\alpha _1},{\alpha _2},&#8230;,{\alpha _{3m}}} \right)^T}" style="vertical-align: -4px; border: none;"/> maximal ist.<br />
Ein beliebiges Viereck kann auf genau zwei Arten in Dreiecke zerlegt werden (zwei Diagonalen). Die optimale Variante zeichnet sich dadurch aus, dass der kleinste auftretende Winkel größer ist als in der alternativen Triangulierung: </p>
<p><img src="http://me-lrt.de/img/inf-incremental-insertion-edge-flip.png" alt="inf-incremental-insertion-edge-flip" /></p>
<p>Die Kante <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-d939be2432902853d8f0a808478c72c6.gif" alt="e = {p_i}{p_j}" title="e = {p_i}{p_j}" style="vertical-align: -6px; border: none;"/> ist illegal, da die „geflippte“ Kante zu einem größeren kleinsten Winkel führt. Um zu vermeiden, für jede Version sechs Winkel messen zu müssen, nutzen wir ein Kriterium, dass uns direkt sagt ob eine Kante illegal ist, ohne dass wir die alternative Triangulierung bilden müssen. Hierzu nutzen wir den Satz von Thales in der allgemeinen Form:</p>
<p>Sei <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-a5f3c6a11b03839d46af9fb43c97c188.gif" alt="K" title="K" style="vertical-align: 0px; border: none;"/> ein Kreis, <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-2db95e8e1a9267b7a1188556b2013b33.gif" alt="l" title="l" style="vertical-align: 0px; border: none;"/> eine Sekante und <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-b345e1dc09f20fdefdea469f09167892.gif" alt="a,b" title="a,b" style="vertical-align: -4px; border: none;"/> die Schnittpunkte. Dann ist der sich an einem dritten Punkt <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-4a8a08f09d37b73795649038408b5f33.gif" alt="c" title="c" style="vertical-align: 0px; border: none;"/> ergebene Winkel des Dreiecks abhängig von der Position von <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-4a8a08f09d37b73795649038408b5f33.gif" alt="c" title="c" style="vertical-align: 0px; border: none;"/>:</p>
<p>(<img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-16019995766f0eab8649727d50ca8aae.gif" alt="{c_1}" title="{c_1}" style="vertical-align: -4px; border: none;"/> innerhalb des Kreises, <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-3833beaff5307193ea51dfd03421e273.gif" alt="{c_2},{c_3}" title="{c_2},{c_3}" style="vertical-align: -4px; border: none;"/> auf dem Kreis, <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-9a206ab6ee36e4c1974c7277726ea97b.gif" alt="{c_4}" title="{c_4}" style="vertical-align: -3px; border: none;"/> außerhalb des Kreises)</p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-a3153a93df2cb4179625b4e8a0e7c8ed.gif" alt="\measuredangle ab{c_1} > \measuredangle ab{c_2} = \measuredangle ab{c_3} > \measuredangle ab{c_4}" title="\measuredangle ab{c_1} > \measuredangle ab{c_2} = \measuredangle ab{c_3} > \measuredangle ab{c_4}" style="vertical-align: -4px; border: none;"/></p>
<p>Das Kriterium ist also, dass bei einer legalen Triangulierung kein Punkt im Umkreis eines Dreiecks anderer Punkte liegen darf. Der Algorithmus zu Delaunay-Triangulierung funktioniert wie folgt: Alle Punkte werden zunächst zufällig permutiert. Anschließend wird der höchste Punkt (z.B. größte y-Koordinate) ermittelt und mit zwei weit entfernten, nicht in der Menge der Punkte enthaltenen Hilfspunkten verbunden, so dass die gesamte Punktwolke innerhalb des entstandenen Dreiecks liegt. Dadurch werden Probleme am Außenrand der Triangulierung verhindert.<br />
Die Punkte werden dann nacheinander dem Graph hinzugefügt, wobei das Delaunay-Kriterium immer aufrecht erhalten wird. Abschließend werden die beiden Hilfsknoten einschließlich aller inzidenten Kanten aus dem Graph gelöscht.</p>
<p><strong>Algorithmus in Pseudocode:</strong></p>
<pre class="brush: java;">
für r = 1 bis n
	Finde das Dreieck p_ijk, das p_r enthält.
	wenn p_r im Inneren des Dreiecks p_ijk liegt
		dann füge die Kanten von p_r zu p_i, p_j und p_k dem Graphen hinzu,
		so dass das alte Dreieck in drei neue aufgeteilt wird.
		LegalizeEdge(p_r, p_ij)
		LegalizeEdge(p_r, p_jk)
		LegalizeEdge(p_r, p_ki)
	sonst // Punkt liegt auf Kante von Dreieck
		teile beide an die Kante angrenzenden Dreiecke in zwei neue.
		LegalizeEdge(p_r, p_il)
		LegalizeEdge(p_r, p_lj)
		LegalizeEdge(p_r, p_jk)
		LegalizeEdge(p_r, p_ki)
</pre>
<p><img src="http://me-lrt.de/img/inf-quad-edge-datenstruktur-nutzung-beispiel.png" alt="inf-quad-edge-datenstruktur-nutzung-beispiel" /></p>
<p>Es gibt mehrere Möglichkeiten, den ersten Befehl („finde das Dreieck“) zu implementieren.</p>
<p><strong>1. Nutzung einer QuadEdge Datenstruktur</strong></p>
<p>Vom zuletzt eingefügten Punkt aus wird zunächst ein Orientierungstest gemacht, um im Beispiel links das Dreieck sab zu bestimmen. Anschließend wird die Kante ermittelt, die von line geschnitten wird. Mit Hilfe der QuadEdge Datenstruktur wird der Algorithmus mit dem Dreieck f<sub>1</sub> fortgesetzt. In f<sub>1</sub> werden die Kanten traversiert, bis erneut eine Kante line schneidet. Dies geht rekursiv weiter, bis ein Dreieck nur eine Kante hat, die line schneidet. Dieses Dreieck enthält dann den Punkt dest. </p>
<p><strong>2: Nutzung des gerichteten azyklischen Dalaunay-Graphen</strong></p>
<p><img src="http://me-lrt.de/img/inf-azyklischer-delaunay-graph-algorithmus.png" alt="inf-azyklischer-delaunay-graph-algorithmus" /></p>
<p>Um mit der gegebenen Struktur einen Punkt zu lokalisieren, starten wir mit dem aus dem höchsten Punkt und den beiden Hilfspunkten bestehenden Dreieck, das die gesamte Punktwolke enthält.<br />
Von dort aus prüfen wir die drei Nachfolger, die beim Einfügen des zweiten Punktes entstanden sind. Nur einer der Nachfolger kann den neuen Punkt enthalten. Das Dreieck selbst existiert allerdings schon nicht mehr, da auch die Nachfolger des Startknotens im Laufe des Hinzufügens neuer Punkte in kleinere Dreiecke unterteilt wurden. Wir können uns aber an der Struktur des Baumes entlanghangeln und finden so irgendwann ein Blatt im Baum. Dieses repräsentiert ein noch existierendes Dreieck im Delaunay-Graph, das den neu eingefügten Punkt enthält.</p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/incremental-insertion-algorithmus-delaunay/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 02 &#8211; Biegebalken, lineare Interpolation</title>
		<link>http://me-lrt.de/biegebalken-lineare-interpolation</link>
		<comments>http://me-lrt.de/biegebalken-lineare-interpolation#comments</comments>
		<pubDate>Thu, 27 May 2010 18:00:35 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5236</guid>
		<description><![CDATA[Sie haben die Verformung  eines Balkens unter Einwirkung einer Last  gemessen.
Dabei wurden in mehreren Messserien insgesamt  verschiedene Lasten  aufgebracht, und die zugehörigen Verformungen  gemessen.
Nun wollen Sie als Näherung an die unbekannte Funktion  zwischen den gemessenen Werten abschnittsweise linear interpolieren, d.h. für einen gegebenen Lastwert  sollen die beiden nächstgelegenen [...]]]></description>
			<content:encoded><![CDATA[<p>Sie haben die Verformung <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b774effe4a349c6dd82ad4f4f21d34c.gif" alt="u" title="u" style="vertical-align: 0px; border: none;"/> eines Balkens unter Einwirkung einer Last <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-44c29edb103a2872f519ad0c9a0fdaaa.gif" alt="P" title="P" style="vertical-align: 0px; border: none;"/> gemessen.<br />
Dabei wurden in mehreren Messserien insgesamt <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="n" title="n" style="vertical-align: 0px; border: none;"/> verschiedene Lasten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-057b9cf5469bdf489d7fd93a4037b78f.gif" alt="{P_i}\:,\:i = 1,2,&#8230;,n" title="{P_i}\:,\:i = 1,2,&#8230;,n" style="vertical-align: -4px; border: none;"/> aufgebracht, und die zugehörigen Verformungen <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-c1e54eb5321b56115694bb3b898d58a4.gif" alt="{u_i}" title="{u_i}" style="vertical-align: -3px; border: none;"/> gemessen.<br />
Nun wollen Sie als Näherung an die unbekannte Funktion <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ef2e4962a8757e7318089ff9531e3875.gif" alt="u\left( P \right)" title="u\left( P \right)" style="vertical-align: -4px; border: none;"/> zwischen den gemessenen Werten abschnittsweise linear interpolieren, d.h. für einen gegebenen Lastwert <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-44c29edb103a2872f519ad0c9a0fdaaa.gif" alt="P" title="P" style="vertical-align: 0px; border: none;"/> sollen die beiden nächstgelegenen gemessenen Lastwerte <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-19018b86ea9148c321e58690001ab8d8.gif" alt="{P_j}" title="{P_j}" style="vertical-align: -6px; border: none;"/> und <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-e8d57d07fe9e730d71ec7c3257df071e.gif" alt="{P_{j+1}}" title="{P_{j+1}}" style="vertical-align: -6px; border: none;"/> bestimmt werden, so dass <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-df6b927709134eecb7276b62a1159ccf.gif" alt="{P_j} \leq P \leq {P_{j+1}}" title="{P_j} \leq P \leq {P_{j+1}}" style="vertical-align: -6px; border: none;"/> ist.<br />
Dann soll zwischen den Punkten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-572e5151d6c0b7385a809e8b0be5ddeb.gif" alt="\left( {{P_j};{u_j}} \right)" title="\left( {{P_j};{u_j}} \right)" style="vertical-align: -6px; border: none;"/> und <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ac289382bc835e2b03198b275ddec6c9.gif" alt="\left( {{P_{j+1}};{u_{j+1}}} \right)" title="\left( {{P_{j+1}};{u_{j+1}}} \right)" style="vertical-align: -6px; border: none;"/> linear interpoliert werden auf den gesuchten Wert <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-bbd76bbe654886a52f597055e590b549.gif" alt="\left( {P;u} \right)" title="\left( {P;u} \right)" style="vertical-align: -4px; border: none;"/>.<br />
Geben Sie an, wie Sie die Aufgabe lösen wollen. Dabei soll berücksichtigt werden, dass Sie die Interpolationsaufgabe <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-6f8f57715090da2632453988d9a1501b.gif" alt="m" title="m" style="vertical-align: 0px; border: none;"/>-mal mit <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-5773cb486c7d5691897f1b278d13f464.gif" alt="m > > n" title="m > > n" style="vertical-align: 0px; border: none;"/> lösen wollen!</p>
<h2>Lösung</h2>
<p>Dateneingabe in Form von:</p>
<ul>
<li>Liste, Array, Hashtable</li>
<li>AVL-Baum</li>
</ul>
<p>Seien dies die Ermittelten Messwerte u in Abhängigkeit von P:</p>
<p><img src="http://me-lrt.de/img/inf-messwerte-lineare-interpolation.png" alt="inf-messwerte-lineare-interpolation" /></p>
<p>Um nun linear interpolieren zu können, benötigt man die Steigung der Geraden zwischen den Punkten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-19018b86ea9148c321e58690001ab8d8.gif" alt="{P_j}" title="{P_j}" style="vertical-align: -6px; border: none;"/> und <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-e8d57d07fe9e730d71ec7c3257df071e.gif" alt="{P_{j+1}}" title="{P_{j+1}}" style="vertical-align: -6px; border: none;"/> und kann daraus eine Funktion für <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-ef2e4962a8757e7318089ff9531e3875.gif" alt="u\left( P \right)" title="u\left( P \right)" style="vertical-align: -4px; border: none;"/> aufstellen:</p>
<p><img src="http://me-lrt.de/img/inf-lineare-interpolation.png" alt="inf-lineare-interpolation" /></p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-adc4622a51f534227ddd8f8661659ab4.gif" alt="m = \frac{{{u_{j+1}}-{u_j}}}{{{P_{j+1}}-{P_j}}}" title="m = \frac{{{u_{j+1}}-{u_j}}}{{{P_{j+1}}-{P_j}}}" style="vertical-align: -10px; border: none;"/></p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-b360f26c44ba40379e960efbf84130c6.gif" alt=" u\left( P \right) = {u_j}+m \cdot \left( {P-{P_j}} \right) " title=" u\left( P \right) = {u_j}+m \cdot \left( {P-{P_j}} \right) " style="vertical-align: -6px; border: none;"/></p>
<p><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-a36dc3eccb668a65591704b3704fb768.gif" alt=" = {u_j}+\frac{{{u_{j+1}}-{u_j}}}{{{P_{j+1}}-{P_j}}} \cdot \left( {P-{P_j}} \right) " title=" = {u_j}+\frac{{{u_{j+1}}-{u_j}}}{{{P_{j+1}}-{P_j}}} \cdot \left( {P-{P_j}} \right) " style="vertical-align: -10px; border: none;"/></p>
<p>Bestimmen der beiden nächstgelegenen gemessenen Lastwerte:</p>
<p>Dies könnte man in einer Liste mit folgender Schleife realisieren: (Pseudocode)</p>
<pre class="brush: java;">
for k = 1 to m
for j = 1 to n
		If P(j) &lt;= P
			u(P)= u(j)+(u(j+1)-u(j))/(P(j+1)-P(j))*(P-P(j))
			break
next j
next k
</pre>
<p>Andere Variante: Baum</p>
<pre class="brush: java;">
Knoten = Root
Suche(Knoten)
if Knoten.value &gt; P
		Suche(Knoten.Left)
if P(j) == null OR Knoten.left.value &lt; P And
Knoten.left.value &gt; P(j) then P(j) = Knoten.left.value
	else
		Suche(Knoten.Right)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/biegebalken-lineare-interpolation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfungsfrage 01 &#8211; Quadtree, iterativer Algorithmus</title>
		<link>http://me-lrt.de/quadtree-iterativer-algorithmus</link>
		<comments>http://me-lrt.de/quadtree-iterativer-algorithmus#comments</comments>
		<pubDate>Wed, 26 May 2010 18:00:08 +0000</pubDate>
		<dc:creator>admin2</dc:creator>
				<category><![CDATA[Ingenieurinformatik]]></category>

		<guid isPermaLink="false">http://me-lrt.de/?p=5233</guid>
		<description><![CDATA[Es soll ein Quadtree konstruiert werden, der in jedem inneren Knoten und in jedem Blatt je einen Punkt  einer Punktwolke mit  paarweise verschiedenen Knoten speichert. Der Punkt, der in dem Knoten gespeichert ist, soll die weitere rekursive Aufteilung der zweidimensionalen Ebene vorgeben. Der Quadtree soll erzeugt werden, indem die  gegebenen Punkte zufällig [...]]]></description>
			<content:encoded><![CDATA[<p>Es soll ein Quadtree konstruiert werden, der in jedem inneren Knoten und in jedem Blatt je einen Punkt <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-eac3e8e241eb4774fc63cf3a3da819ec.gif" alt="\left( {{x_i},{y_i}} \right),\:\:i \in \mathbb{N}" title="\left( {{x_i},{y_i}} \right),\:\:i \in \mathbb{N}" style="vertical-align: -4px; border: none;"/> einer Punktwolke mit <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="n" title="n" style="vertical-align: 0px; border: none;"/> paarweise verschiedenen Knoten speichert. Der Punkt, der in dem Knoten gespeichert ist, soll die weitere rekursive Aufteilung der zweidimensionalen Ebene vorgeben. Der Quadtree soll erzeugt werden, indem die <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="n" title="n" style="vertical-align: 0px; border: none;"/> gegebenen Punkte zufällig permutiert und dann nacheinander (inkrementell) in den Quadtree eingefügt werden. Geben Sie (in einer objektorientierten Programmiersprache oder in Pseudocode) die Definition der Klasse QuadTree (Knoten des QuadTrees) sowie die Funktion Insert dieser Klasse an. Welche Tiefe kann der Baum im ungünstigsten Fall erreichen? Für welche Art der Eingabe erreicht der Baum diese maximale Tiefe?</p>
<h2>Lösung</h2>
<p>Ein QuadTree dient in diesem Zusammenhang zur Zerlegung eines zweidimensionalen Gebietes in nichtüberlappende, quadratische Zellen. Der QuadTree muss dazu den folgenden Aufbau haben:</p>
<p><img src="http://me-lrt.de/img/inf-quadtree-datenstruktur.png" alt="inf-quadtree-datenstruktur" /></p>
<p><strong>Definition des herkömmlichen QuadTrees</strong></p>
<p>Gegeben ist die Menge <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-44c29edb103a2872f519ad0c9a0fdaaa.gif" alt="P" title="P" style="vertical-align: 0px; border: none;"/> an Punkten und das Quadrat <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-f09564c9ca56850d4cd6b3319e541aee.gif" alt="Q" title="Q" style="vertical-align: -4px; border: none;"/>, das die Punkte enthält. Wenn in der Menge <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-44c29edb103a2872f519ad0c9a0fdaaa.gif" alt="P" title="P" style="vertical-align: 0px; border: none;"/> weniger als zwei Punkte enthalten sind, ist der QuadTree definiert als ein einzelnes Blatt, das den Punkt und das Quadrat speichert. Ansonsten werden die vier Quadranten von <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-f09564c9ca56850d4cd6b3319e541aee.gif" alt="Q" title="Q" style="vertical-align: -4px; border: none;"/> nach ihrer Position benannt: Q<sub>NW</sub>, Q<sub>NO</sub>, Q<sub>SW</sub>, Q<sub>SO</sub>. Die Unterteilung des Quadrates erfolgt genau in der Mitte, dementsprechend entstehen vier neue Punktmengen:</p>
<ul>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-8bef7672094fb674efc25398e29ec2c2.gif" alt="{P_{NW}} = \left\{ {p \in P:{p_x} \leq {x_{mid}}\quad \wedge \quad {p_y} > {y_{mid}}} \right\}" title="{P_{NW}} = \left\{ {p \in P:{p_x} \leq {x_{mid}}\quad \wedge \quad {p_y} > {y_{mid}}} \right\}" style="vertical-align: -6px; border: none;"/></li>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-f73e4de1842bd31b95a933b1e4d0b0ce.gif" alt="{P_{NO}} = \left\{ {p \in P:{p_x} > {x_{mid}}\quad \wedge \quad {p_y} > {y_{mid}}} \right\}" title="{P_{NO}} = \left\{ {p \in P:{p_x} > {x_{mid}}\quad \wedge \quad {p_y} > {y_{mid}}} \right\}" style="vertical-align: -6px; border: none;"/></li>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-6c6e888e9761f4a647d3c2be81bf0a19.gif" alt="{P_{SW}} = \left\{ {p \in P:{p_x} \leq {x_{mid}}\quad \wedge \quad {p_y} \leq {y_{mid}}} \right\}" title="{P_{SW}} = \left\{ {p \in P:{p_x} \leq {x_{mid}}\quad \wedge \quad {p_y} \leq {y_{mid}}} \right\}" style="vertical-align: -6px; border: none;"/></li>
<li><img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-214c7af0e5fb9507bd411cef2624a725.gif" alt="{P_{SO}} = \left\{ {p \in P:{p_x} > {x_{mid}}\quad \wedge \quad {p_y} \leq {y_{mid}}} \right\}" title="{P_{SO}} = \left\{ {p \in P:{p_x} > {x_{mid}}\quad \wedge \quad {p_y} \leq {y_{mid}}} \right\}" style="vertical-align: -6px; border: none;"/></li>
</ul>
<p>Der QuadTree enthält dann einen Wurzelknoten <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-9e3669d19b675bd57058fd4664205d2a.gif" alt="v" title="v" style="vertical-align: 0px; border: none;"/>, in dem das Quadrat <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-03c7c0ace395d80182db07ae2c30f034.gif" alt="s" title="s" style="vertical-align: 0px; border: none;"/> gespeichert ist. Außerdem enthält er untergeordnet vier neue QuadTrees, die jeweils aus einer der oben beschriebenen neuen Punktmengen gebildet werden.</p>
<p><strong>Definition eines der Aufgabenstellung entsprechenden QuadTrees</strong></p>
<p>Die Punkte werden nacheinander eingefügt. Beim Einfügen eines neuen Punktes wird geprüft, ob der neue Knoten einfach als Blatt an einen bestehenden Knoten angefügt werden kann, oder ob der entsprechende Platz schon belegt ist und daher eine neue Unterteilung durchgeführt werden muss. Der QuadTree ist also definiert als ein Punkt mit den Koordinaten (x, y), der bis zu vier Nachfolger haben kann. Die Unterteilung des Rechtecks erfolgt nicht wie bei dem herkömmlichen QuadTree in der Mitte, sondern genau bei den Koordinaten des Punktes. Der Algorithmus funktioniert also nicht rekursiv (wie oben beschrieben), sondern iterativ.</p>
<p><img src="http://me-lrt.de/img/inf-quadtree-algorithmus.png" alt="inf-quadtree-algorithmus" /></p>
<p>Die Funktion insert funktioniert wie im der Abbildung oben dargestellt: </p>
<pre class="brush: java;">
für r = 1 bis n
	Finde das Rechteck, das p_r enthält.
	wenn das Rechteck nun genau einen Punkt enthält
		dann füge den neuen Punkt p_r als Blatt an den QuadTree an,
		der das Rechteck begrenzt
	sonst // es befinden sich schon Punkt p_m im Rechteck
		unterteile das Rechteck bei den Koordinaten von p_m und füge
		den neuen Punkt p_r als Blatt an den QuadTree an, der den
		Punkt p_m_ enthält.
</pre>
<p><strong>Maximale Tiefe</strong></p>
<p>Im Gegensatz zum herkömmlichen Quadtree (vergleiche Aufgabe 10) ist die Tiefe des Baumes hier nicht von dem geometrischen Abstand der Punkte abhängig, sondern von ihrer Anordnung und ihrer Anzahl.</p>
<p><img src="http://me-lrt.de/img/inf-quadtree-worst-case.png" alt="inf-quadtree-worst-case" /></p>
<p>Im ungünstigsten Fall sieht der QuadTree so aus wie oben abgebildet. Die Tiefe des Baumes ist dann gleich <img src="http://me-lrt.de/wp-content/ql-cache/quicklatex-7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="n" title="n" style="vertical-align: 0px; border: none;"/>, da für jeden Knoten eine Unterteilung durchgeführt werden muss.</p>
<p>Damit der dargestellte Fall eintritt, müssen die Punkte allerdings nicht nur die entsprechende Anordnung haben, sondern sie müssen auch genau in der Reihenfolge von p1 nach oben links in den Graphen eingefügt werden. Eine zufällige Permutation vor dem Einfügen verhindert so etwas und kann daher die Tiefe des Baumes reduzieren (im dargestellten Fall um 50%).</p>
]]></content:encoded>
			<wfw:commentRss>http://me-lrt.de/quadtree-iterativer-algorithmus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
