This commit is contained in:
2023-06-28 21:41:15 +02:00
parent 77de70cd20
commit 18efec8bb6
30 changed files with 858 additions and 0 deletions

63
AuD/src/UEB08/BBaum.java Normal file
View File

@@ -0,0 +1,63 @@
package UEB08;
class BBaum<T extends Comparable<T>>
{
public BKnoten<T> wurzel;
public BBaum(BKnoten<T> wurzel)
{
assert(wurzel != null);
this.wurzel = wurzel;
}
// Wrapper-Methode
public void traversieren()
{
traversieren(wurzel);
}
// Eigentliche Implementierung
private void traversieren(BKnoten<T> knoten)
{
assert(knoten != null);
int i = 0;
if(knoten.kinder.length!=0){
//System.out.println(knoten.kinder.length +" "+ knoten.elemente.length);
for(i = 0; i < knoten.elemente.length;i++){
if (knoten.kinder[i]!=null){
traversieren(knoten.kinder[i]);
}
System.out.println(knoten.elemente[i]);
}
if (knoten.kinder[i]!=null){
traversieren(knoten.kinder[i]);
}
}
}
// Wrapper-Methode
public boolean suchen(final T daten)
{
assert(daten != null);
return suchen(daten, wurzel);
}
// Eigentliche Implementierung
private boolean suchen(final T daten, BKnoten<T> knoten)
{
for(int i=0;i<knoten.elemente.length;i++){
if(knoten.elemente[i].equals(daten)){
return true;
}
}
for (int i = 0;i<knoten.kinder.length;i++){
if(knoten.kinder[i]!= null){
if(suchen(daten,knoten.kinder[i])){
return true;
}
}
}
return false;
}
}

View File

@@ -0,0 +1,44 @@
package UEB08;
public class BBaumTest
{
public static void main(String[] args)
{
// B-Baum erzeugen
BBaum<Integer> baum = new BBaum<Integer>(
new BKnoten<Integer>(new Integer[]{ 19, 34 }, new BKnoten[]{
new BKnoten<Integer>(new Integer[]{ 4, 7, 10, 14 }, new BKnoten[]{
new BKnoten<Integer>(new Integer[]{ 1, 2, 3 } ),
new BKnoten<Integer>(new Integer[]{ 5, 6 } ),
new BKnoten<Integer>(new Integer[]{ 8, 9 } ),
new BKnoten<Integer>(new Integer[]{ 11, 12, 13 } ),
new BKnoten<Integer>(new Integer[]{ 15, 16, 17, 18 } )
} ),
new BKnoten<Integer>(new Integer[]{ 22, 27, 30 }, new BKnoten[]{
new BKnoten<Integer>(new Integer[]{ 20, 21 } ),
new BKnoten<Integer>(new Integer[]{ 23, 24, 25, 26 } ),
new BKnoten<Integer>(new Integer[]{ 28, 29 } ),
new BKnoten<Integer>(new Integer[]{ 31, 32, 33 } )
} ),
new BKnoten<Integer>(new Integer[]{ 39, 42 }, new BKnoten[]{
new BKnoten<Integer>(new Integer[]{ 35, 36, 37, 38 } ),
new BKnoten<Integer>(new Integer[]{ 40, 41 } ),
new BKnoten<Integer>(new Integer[]{ 43, 44, 45 } )
} )
} )
);
// B-Baum traversieren
System.out.println("Traversieren:");
baum.traversieren();
// Nach Elementen suchen
System.out.println("\n\nSuchen:");
boolean suchen = true;
for (int a = -50; a < 100; a++)
suchen &= (baum.suchen(a) == ((a >=1 ) && (a <= 45)));
System.out.println(suchen ? "Ok" : "Fehler!");
}
}

View File

@@ -0,0 +1,26 @@
package UEB08;
public class BKnoten<T>
{
public T[] elemente;
public BKnoten<T>[] kinder;
// F<>r Bl<42>tter
public BKnoten(final T[] elemente)
{
assert(elemente!=null);
this.elemente = elemente;
this.kinder = (BKnoten<T>[])new BKnoten[elemente.length + 1];
}
// F<>r innere Knoten
public BKnoten(final T[] elemente, final BKnoten<T>[] kinder)
{
assert(elemente != null);
assert(kinder != null);
assert(elemente.length+1 == kinder.length);
this.elemente = elemente;
this.kinder = kinder;
}
}

View File

@@ -0,0 +1,38 @@
package UEB10;
public class BasicSort
{
// Selectionsort:
// Sortiere das Teilfeld von array beginnend mit Index links bis einschlie<69>lich Index rechts
public static void selectionsort(int[] array, final int links, final int rechts)
{
for (int i = links; i < rechts; i++)
{
// Kleinstes Element im unsortierten Teil finden
int min = i;
for (int j = i + 1; j <= rechts; j++)
if (array[min] > array[j])
min = j;
// Elemente tauschen
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
// Insertionsort:
// Sortiere das Teilfeld von array beginnend mit Index links bis einschlie<69>lich Index rechts
public static void insertionsort(int[] array, final int links, final int rechts)
{
// TODO: Praktikum 9
}
// Bubblesort:
// Sortiere das Teilfeld von array beginnend mit Index links bis einschlie<69>lich Index rechts
public static void bubblesort(int[] array, final int links, final int rechts)
{
// TODO: Praktikum 9
}
}

View File

@@ -0,0 +1,43 @@
package UEB10;
public class HeapSort {
// Versickere das Element mit Index pos in dem Teilfeld von Index links bis einschlie<69>lich Index rechts
public static void versickere(int[] array, final int links, int pos, final int rechts) {
int groesster = pos;
int l = 2 * (pos - links) + 1 + links;
int r = 2 * (pos - links) + 2 + links;
if (l <= rechts && array[l] > array[groesster])
groesster = l;
if (r <= rechts && array[r] > array[groesster])
groesster = r;
if (groesster != pos) {
int swap = array[pos];
array[pos] = array[groesster];
array[groesster] = swap;
versickere(array, links, groesster, rechts);
}
}
public static void heapsort(int[] array, final int links, final int rechts) {
int n = rechts - links + 1;
// Heap aufbauen
for (int i = links + n / 2 - 1; i >= links; i--)
versickere(array, links, i, rechts);
// Eines nach dem anderen ein Element aus dem Heap extrahieren
for (int i = rechts; i >= links; i--) {
// Aktuelle Wurzel ans Ende verschieben
int temp = array[links];
array[links] = array[i];
array[i] = temp;
// max heapify auf dem reduzierten Heap aufrufen
versickere(array, links, links, i - 1);
}
}
}

128
AuD/src/UEB10/Main.java Normal file
View File

@@ -0,0 +1,128 @@
package UEB10;
public class Main
{
public static final int SELECTIONSORT = 0;
public static final int INSERTIONSORT = 1;
public static final int BUBBLESORT = 2;
public static final int QUICKSORT = 3;
public static final int HEAPSORT = 4;
public static final int MERGESORT = 5;
public static final int ANZAHLALGORITHMEN = 6;
public static final int N = 10000;
public static final String[] sortNames =
{
"Selection Sort",
"Insertion Sort",
"Bubblesort",
"Quicksort",
"Heapsort",
"Mergesort"
};
// Gibt ein Array mit n Elementen und zuf<75>lligen Zahlen zur<75>ck
public static int[] getRandomArray(final int n)
{
int[] array = new int[n];
for (int a = 0; a < n ; a++)
array[a] = (int)(Math.random()*10*n);
return array;
}
// Pr<50>ft, ob ein Array korrekt sortiert ist
public static boolean checkArray(int[] array)
{
for (int a = 0; a < array.length-1; a++)
if (array[a] > array[a+1])
return false;
return true;
}
// Pr<50>ft einen Algorithmus, und gibt die Laufzeiten aus
public static void checkSortAlgorithmus(final int algorithmus)
{
StopUhr stopUhr = new StopUhr();
boolean isCorrect = true;
long minTime = 0;
long maxTime = 0;
long sumTime = 0;
// Wir testen mit 100 zuf<75>llig erzeugten Feldern
for (int a = 0; a < 100; a++)
{
int[] array = getRandomArray(N);
// Zeitmessung beginnen
stopUhr.start();
// Array sortieren
switch (algorithmus)
{
case INSERTIONSORT:
BasicSort.insertionsort(array, 0, array.length - 1);
break;
case SELECTIONSORT:
BasicSort.selectionsort(array, 0, array.length - 1);
break;
case BUBBLESORT:
BasicSort.bubblesort(array, 0, array.length - 1);
break;
case QUICKSORT:
QuickSort.quicksort(array, 0, array.length - 1);
break;
case HEAPSORT:
HeapSort.heapsort(array, 0, array.length - 1);
break;
case MERGESORT:
MergeSort.mergesort(array, 0, array.length - 1);
break;
}
// Zeitmessung stoppen
stopUhr.stop();
// Ergebnis auswerten
if (!(isCorrect &= checkArray(array)))
break;
if ((a==0) || (stopUhr.getDuration()<minTime))
minTime = stopUhr.getDuration();
if (stopUhr.getDuration()>maxTime)
maxTime = stopUhr.getDuration();
sumTime += stopUhr.getDuration();
}
// Ausgabe
if (isCorrect)
{
System.out.format("%16s %10.4f %10.4f %10.4f\n",
sortNames[algorithmus], minTime / 1000000.0, sumTime / 100000000.0, maxTime / 1000000.0);
}
else
{
System.out.format("%16s %10s\n", sortNames[algorithmus], "-");
}
}
public static void main(String[] args)
{
System.out.println("Arraygr<EFBFBD><EFBFBD>e n = " + N + "\n");
System.out.println(" Algorithmus Laufzeit (ms)");
System.out.println(" minimal durchschnittlich maximal");
for (int algorithmus = 0; algorithmus < ANZAHLALGORITHMEN; algorithmus++)
checkSortAlgorithmus(algorithmus);
}
}

View File

@@ -0,0 +1,88 @@
package UEB10;
public class MergeSort
{
public static void mergesort(int[] array, final int links, final int rechts)
{
int[] hilfsarray = new int[array.length];
mergesortBU(array, hilfsarray, links, rechts);
}
// Top-Down-Mergesort entsprechend der Vorlesung
public static void mergesortTD(int[] array, int[] hilfsarray, final int links, final int rechts)
{
if (links < rechts)
{
// mindestens 2 Elemente
int mitte = (links + rechts)/2;
// Feld in der Mitte teilen und rekursive Aufrufe f<>r Teilfelder
mergesortTD(array, hilfsarray, links, mitte);
mergesortTD(array, hilfsarray, mitte+1, rechts);
// Sortierte Teilfelder mischen
merge(array, hilfsarray, links, mitte, rechts);
}
}
// Bottom-Up-Mergesort
public static void mergesortBU(int[] array, int[] hilfsarray, final int links, final int rechts)
{
int n = rechts - links + 1;
for (int len = 1; len < n; len *= 2) {
for (int lo = links; lo < rechts - len + 1; lo += len+len) {
int mid = lo+len-1;
int hi = Math.min(lo+len+len-1, rechts);
merge(array, hilfsarray, lo, mid, hi);
}
}
}
// Mischen der Teilfelder array[links]...array[mitte] und array[mitte+1]...array[rechts]
private static void merge(int[] array, int[] hilfsarray, final int links, final int mitte, final int rechts)
{
int i, j;
i = links;
j = mitte+1;
// Mischen in Hilfsarray
for (int k=links; k <= rechts; k++)
{
if (i>mitte)
hilfsarray[k] = array[j++]; // 1. Teilfeld schon zu Ende
else if (j>rechts)
hilfsarray[k] = array[i++]; // 2. Zeilfeld schon zu Ende
else if(array[i] < array[j])
hilfsarray[k] = array[i++]; // Element aus 1. Teilfeld <20>bernehmen
else
hilfsarray[k] = array[j++]; // Element aus 2. teilfeld <20>bernehmen
}
for (int k = links; k <= rechts; k++)
{
array[k] = hilfsarray[k];
}
}
// Alternative Metdode zum Mischen
private static void merge2(int[] array, int[] hilfsarray, final int links, final int mitte, final int rechts)
{
int i, j;
// 1. Teilfeld kopieren
for (i = mitte+1; i > links; i--)
hilfsarray[i-1] = array[i-1];
// 2. Teilfeld in umgekehrter Reihenfolge kopieren
for (j = mitte; j < rechts; j++)
hilfsarray[rechts+mitte-j] = array[j+1];
// Zeiger i und j gegeneinander laufen lassen
for (int k = links; k <= rechts; k++ )
if (hilfsarray[j] < hilfsarray[i])
array[k] = hilfsarray[j--];
else
array[k] = hilfsarray[i++];
}
}

View File

@@ -0,0 +1,8 @@
package UEB10;
public class QuickSort
{
public static void quicksort(int[] array, final int links, final int rechts)
{
// TODO: Praktikum 9
}
}

View File

@@ -0,0 +1,20 @@
package UEB10;
public class StopUhr
{
private long startTime, stopTime;
public void start()
{
startTime = System.nanoTime();
}
public void stop()
{
stopTime = System.nanoTime();
}
public long getDuration()
{
return stopTime - startTime;
}
}

View File

@@ -0,0 +1,125 @@
package UEB11;
public class HashTable
{
private static final int START_TABELLENGROESSE = 10; // Standardgr<67><72>e
private IHashable[] table; // Array f<>r Hash-Objekte
private int currentSize; // Die Anzahl der belegten Slots
public HashTable()
{
this(START_TABELLENGROESSE);
}
// Konstruktor mit expliziter Gr<47><72>enangabe
public HashTable(final int groesse)
{
assert(groesse > 0);
table = new IHashable[groesse];
clear();
}
// F<>gt ein Objekt in die Hashtabelle ein.
// Falls der Eintrag bereits existiert passiert NICHTS!
public void insert(final IHashable o)
{
assert(o != null);
final int currentPos = findePosition(o);
if (table[currentPos] == null)
{
table[currentPos] = o;
if (++currentSize > table.length / 2)
rehash();
}
}
// Erweiterung der Hashtabelle
private void rehash()
{
// Debug-Ausgabe
System.out.println("rehash(" + table.length+ ")");
// Kopie der alten Hashtabelle anlegen
IHashable[] oldTable = table;
// Erzeuge table mit mindestens der doppelten Gr<47><72>e
// (f<>hrt zu O(log n) Vergr<67><72>erungs-Operationen f<>r n Objekte)
table = new IHashable[nextPrime(2 * oldTable.length)];
currentSize = 0;
// Einsortieren der Elemente ins neue Array
for (int a = 0; a < oldTable.length; a++)
if (oldTable[a] != null)
insert(oldTable[a]);
}
// Quadratisches Sondieren
public int findePosition(IHashable o)
{
return 0;
}
// Findet ein Objekt in der Hashtabelle
public IHashable find(IHashable o)
{
return table[findePosition(o)];
}
// L<>schen der gesamten Hashtabelle
public void clear()
{
for (int a = 0; a < table.length; a++)
table[a] = null;
currentSize = 0;
}
// Test-Methode
public IHashable getEntry(final int pos)
{
return table[pos];
}
// Test-Methode
public int getSize()
{
return table.length;
}
// Private Funktion, die zu einer vorgegebenen Zahl n die n<>chsth<74>here Primzahl findet
private static int nextPrime(int n)
{
assert(n >= 0);
// N<>chste ungerade Zahl
n |= 1;
while (!isPrime(n))
n += 2;
return n;
}
// Testet, ob eine Zahl eine Primzahl ist (einfache, aber ineffiziente Implementierung)
private static boolean isPrime(final int n)
{
if ((n == 2) || (n == 3))
return true;
if ((n == 1) || ((n & 1) == 0))
return false;
for (int a = 3; a * a <= n; a += 2)
if ((n % a) == 0)
return false;
return true;
}
}

View File

@@ -0,0 +1,76 @@
package UEB11;
import java.util.Random;
public class HashTableTest
{
private static String[][] Profs =
{
{"Bab", "8305"},
{"B<EFBFBD>ckmann", "6728"},
{"Cleven", "6732"},
{"Ecke-Sch<63>th", "6784"},
{"Engels", "6777"},
{"Friedrich", "6796"},
{"Haake", "6766"},
{"Haas", "6719"},
{"Hagen", "6782"},
{"Hamburg", "6708"},
{"Harrer", "6748"},
{"Hesseler", "6732"},
{"Hessel-von Molo", "6779"},
{"Hirsch", "6835"},
{"Hoffmann", "0"},
{"J<EFBFBD>rges", "6741"},
{"Kamsties", "6816"},
{"Kienle", "9777"},
{"K<EFBFBD>nisgmann", "6776"},
{"Kuhnt", "8935"},
{"Kukuk", "6715"},
{"Kunau", "8906"},
{"K<EFBFBD>nemund", "6764"},
{"Lauenroth", "0"},
{"Lenze", "6729"},
{"Lu", "6758"},
{"Preis", "6756"},
{"Recker", "6783"},
{"Reimann", "6786"},
{"Rettinger", "6797"},
{"R<EFBFBD>hrig", "8100"},
{"Saatz", "6765"},
{"Sachweh", "6760"},
{"Sch<EFBFBD>nberg", "8919"},
{"Schuster", "8903"},
{"Stark", "6747"},
{"Teschler-Nunkesser", "6785"},
{"Vollmer", "6737"},
{"Wiesmann", "8918"},
{"Wolff", "0"},
{"Zeppenfeld", "0"}
};
public static void main(String[] args)
{
HashTable h = new HashTable(10);
System.out.println("Hashtablle mit " + Profs.length + " Objekten anlegen:");
// Professorendaten in Hashtabelle eintragen
for (int a = 0; a < Profs.length; a++)
h.insert(new Professor(Profs[a][0], Integer.parseInt(Profs[a][1])));
// Gespeicherte Professorendaten nacheinander aus der Tabelle
// auslesen und den jeweils zugeh<65>rigen Namen ausgeben
System.out.println("\nHash-Tabelle:");
for (int a = 0; a < h.getSize(); a++)
{
final Professor p = (Professor)h.getEntry(a);
if (p != null)
System.out.println(a + " " + p.getName());
}
System.out.println("\nZuordnung per Roundtrip <20>ber den Hashwert testen:");
for (int a = 0; a < h.getSize(); a++)
if ((Professor)h.getEntry(a) != null)
System.out.println("" + a + " <---> " + h.findePosition(h.getEntry(a)));
}
}

View File

@@ -0,0 +1,7 @@
package UEB11;
public interface IHashable
{
// Es wird gefordert, dass von den Objekten, die gespeichert werden sollen,
// eine Methode zur Berechnung des Hash-Wertes angeboten wird.
int hash(final int tableSize);
}

View File

@@ -0,0 +1,54 @@
package UEB11;
public class Professor implements IHashable
{
private String name;
private long hausruf;
public String getName()
{
return name;
}
public long getHausruf()
{
return hausruf;
}
public Professor(String name, int Hausruf)
{
this.name = name;
this.hausruf = Hausruf;
}
// Hash-Wert
public int hash(final int tableSize)
{
char c1 = name.charAt(0);
char c2 = name.charAt(1);
int h1 = c1 - '0';
int h2 = c2 - '0';
int h = (h1 + h2) % tableSize;
// Debug-Ausgabe zu Testzwecken
// System.out.println("Name:" + Name + " Hashwert:" + h);
return h;
}
public boolean equals(Object o)
{
// In diesem Beispiel nur Professor-Objekte zulassen
if (!(o instanceof Professor))
return false;
final Professor p = (Professor)o;
return ((p.name).equals(this.name) && (p.hausruf == this.hausruf));
}
public String toString()
{
return name;
}
}

View File

@@ -0,0 +1,63 @@
package UEB11;
import UEB10.Main;
public class StringSearch {
public static void main(String[] args) {
String[] words = {
"aardvark", "abandon", "ability", "academy", "acorn",
"action", "adventure", "aerial", "aerodynamic", "affection",
"algorithm", "alpine", "amber", "analogy", "anchor",
"antique", "aquarium", "arboreal", "architect", "arctic",
"argument", "armor", "artistic", "asteroid", "athletic",
"atmosphere", "auction", "audio", "authority", "automobile",
"avalanche", "ballad", "banquet", "barrier", "bathtub",
"beacon", "beholder", "biography", "blossom", "blueprint",
"boulder", "broccoli", "brother", "buffalo", "butterfly",
"cabbage", "calculator", "camouflage", "campfire", "candle",
"carnation", "carousel", "cathedral", "cavalry", "celestial",
"chameleon", "character", "cherry", "chestnut", "chimpanzee",
"chronicle", "circus", "cobweb", "compass", "compendium",
"conductor", "constellation", "contraption", "conundrum", "coral",
"corkscrew", "crabapple", "crescendo", "cricket", "crimson",
"cruise", "crystal", "cucumber", "curriculum", "cylinder",
"daffodil", "daisy", "dandelion", "darkness", "daylight",
"demonstration", "desert", "dictionary", "dinosaur", "direction",
"dolphin", "dragonfly", "dream", "dune", "dwarf",
"dynamite", "eagle", "earthquake", "echo", "eclipse",
"education", "electricity", "elephant", "embassy", "engine",
"escalator", "eucalyptus", "exploration", "falcon", "ferry",
"firework", "flamingo", "flower", "fossil", "galaxy"
};
String search = "aardvark" ;
System.out.println(binaereSuche(words,search));
}
static boolean binaereSuche(final String[] worte, final String begriff){
int left = 0;
int right = worte.length;
int midIndex = worte.length/2;
int i=0;
int goal = (int)Math.log(worte.length)+2;
while(i <= goal){
i++;
System.out.println(worte[midIndex]);
int comp = worte[midIndex].compareTo(begriff);
System.out.println(comp);
if (comp > 0) {
right = midIndex-1;
midIndex = (left+right)/2;
} else if (comp < 0) {
left = midIndex+1;
midIndex = (left+right)/2;
} else {
return true;
}
}
return false;
}
}

59
AuD/src/UEB12/Graph.java Normal file
View File

@@ -0,0 +1,59 @@
package UEB12;
import java.util.*;
public class Graph
{
private static final int KNOTENZAHL = 7;
private static boolean[] besucht;
private Knoten[] knoten;
private boolean[][] matrix = {
{false, true, false, false, false, false, false},
{false, false, true, false, false, false, false},
{false, true, false, false, false, false, false},
{false, false, false, false, false, false, false},
{false, false, false, true, false, false, false},
{false, true, true, false, false, false, false},
{false, false, false, false, false, false, false},
};
public Graph()
{
knoten = new Knoten[KNOTENZAHL];
knoten[0] = new Knoten("A");
knoten[1] = new Knoten("B");
knoten[2] = new Knoten("C");
knoten[3] = new Knoten("D");
knoten[4] = new Knoten("E");
knoten[5] = new Knoten("F");
knoten[6] = new Knoten("G");
}
private boolean isKante(int k1, int k2)
{
// TODO
return true;
}
// Tiefensuche
private void rekDfs(final int k)
{
// TODO
// Rekursive Tiefensuche mit Hilfe der Methode isKante implementieren
}
public void zusammenhangskomponenten()
{
besucht = new boolean [KNOTENZAHL];
// TODO
}
// TODO
public static void main(String[] args)
{
new Graph().zusammenhangskomponenten();
}
}

16
AuD/src/UEB12/Knoten.java Normal file
View File

@@ -0,0 +1,16 @@
package UEB12;
public class Knoten
{
private String name;
public Knoten(String s)
{
name = s;
}
public String getName()
{
return name;
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.