Grundlagen der Informatik zusammengefasst
Grundlagen der Informatik zusammengefasst für Klausur
Grundlagen der Informatik zusammengefasst für Klausur
-
- 1 / 115
-
Flashcards
1.1 Informatik Definition
Wissenschaft von automatisierter Verarbeitung von Daten und Informationen
1.2 Daten Definition
-
Strukturiert und unstrukturiert
-
Codiert (zeichenweise) – formartiert oder unformatiert
oder: uncodiert (bitweise) – statisch (Bilder) oder dynamisch (Radio)
1.3 Information Definition
Information = Daten + Kontext
Qualität von Informationen: zeitgerecht, aktuell, konsistente Datenbasis
1.4 Gebiete der Informatik
Theoretische Informatik
Technische Informatik
Angewandte Informatik
„Bindestrich-“Informatik
1.5 Vergleich Algorithmus und Programm
Algorithmus: Allgemeine Folge von Anweisungen zur Lösung eines Problems.
Programm: Umsetzung eines Algorithmus in einer Programmiersprache
1.6 Software-Entwicklungszyklus (vgl. Wasserfall-Modell)
-
Analyse des Problems
-
Problemlösung (Algorithmus)
-
Programmierung (Codierung)
-
Test
-
Inbetriebnahme
-
Wartung
Existieren verschiedene Modelle, je nach Analysephase, der Elementgröße und Interaktionsgrad zwischen Beteiligten.
1.7 Kostentreiber bei Softwareentwicklung
Früher 90 % Hardware, 10 % Software, heute 10% Hardware und 90% Software. Tendenz geht gegen 99%.
Ca. 20% der Kosten entstehen bei Analyse und Problemlösung, ca. 80 % Kosten entstehen ab der Codingphase.
==> vernünftige Spezifikation senken Kosten!
Hilfsmittel Use-CASEs, Datenflussdiagramme, Verteilungsmodelle
CASE = Computer Aided Software Engineering
Deshalb: Ersparnis entsteht durch Kenntnis von
-
Algorithmen & Datenstrukturen
-
Berechenbarkeitstheorie
-
Standards
-
IT-Sicherheit
1.8 SW- Engineering Aufgaben
-
Softwareentwicklung
-
Projektmanagement
-
Qualitätssicherung (von Anfang an, da Zwischenprüfung unmöglich)
-
Projektverwaltung
1.9 Datenschutz &-sicherheit
1.9 Datenschutz &-sicherheit
1.9.1 Schutz
Schutz vor unberechtigter Nutzung
1.9.2 Sicherheit
Schutz vor Verlust bei z.B.:
-
Überschwemmung, Feuer
-
Einbruch
-
Hardwaredefekt
Maßnahmen dagegen: Backup, Redundanz, z.B. RAID Array
1.9.3 Backup-Typen
Volles Backup,
Dump
,
Inkrementelles Backup
1.9.3.1 Volles Backup
Alle Daten werden gesichert, eine vollständige Wiederherstellung ist möglich, aber hoher Platz und Zeitbedarf
1.9.3.2 Dump
1 zu 1 Kopie des Datenträgers, Problem ist hierbei der Platzbedarf, „Leerraumsicherung“, bitweise
1.9.3.3 Inkrementelles Backup
Nur die Änderungen seit dem letzten Backup werden berücksichtigt, aber typische Probleme: Keine Verifizierung, Backup-recovery nie erprobt und Backup ist am gleichen Ort.
1.10 Betriebssysteme
BS steht zwischen Anwendungen und BIOS.
Aufgabengebiet ist die Verwaltung von Systemressourcen wie:
-
Prozessor
-
Arbeitsspeicher
-
Plattenspeicher
-
Monitor
Ziel: ungestörter Ablauf von Programmen
2.Algorithmen und Datenstrukturen
2.Algorithmen und Datenstrukturen
2.1 Datentypen
Mathematik → Algebra (Datentyp)
Algorithmik → Datenstruktur
Programmierung → Typ, Modul,Klasse
2.1.1 atomare Datentypen
-
Integer
-
real
-
boolean
-
char
Pointer = zeigt auf die entsprechende Speicherstelle von Datentypen.
2.1.2 Komplexe Datentypen
-
Array
-
Struct (Liste)
2.1.3 Knoten
Ein Knoten bezeichnet ein Element der Liste, welches die Daten und einen Zeiger auf seinen Nachfolger enthält
2.1.4 einfach verkettete Liste
Einfachste Form der verketteten Liste, da sie neben den einzelnen Knoten nur einen „Start“-Zeiger besitzt. Dieser zeigt auf den ersten Knoten in der Liste. Der letzte Knoten in der Liste zeigt auf den Wert „NULL“
Verbale Definition: Eine Liste ist entweder leer oder sie besteht aus einem Kopf und einem Zeiger, der wiederum eine Liste ist.
Vorteile
-
Elemente können sehr schnell am Anfang der Liste eingefügt werden; sehr geringer Speicherbedarf
-
Im Gegensatz zu einem Array ist das Einfügen problemlos möglich, ohne dass der komplette Datensatz bei jeder Vergrößerung umkopiert werden muss
2.1.5 doppelt verkettete Liste
m Gegensatz zur einfach-verketteten Liste hat jedes Element sowohl einen Zeiger auf das nachfolgende als auch auf das vorhergehende Element.
Der Vorgänger-Zeiger des ersten und der Nachfolger-Zeiger des letzten Elementes zeigen auf den Wert NULL. Dieses besondere Element dient zum Auffinden des Anfangs und des Endes einer doppelt verketteten Liste.
Vorteile
-
Die Elemente in der zweiten Hälfte einer sortierten Liste sind schneller aufzufinden.
-
Schnelles Löschen und Einfügen von Elementen.
-
Das macht zum Beispiel das effiziente Sortieren der Liste möglich.
-
-
Über die Liste kann von hinten nach vorne iteriert werden.
Nachteile
-
Höherer Speicherbedarf für die zusätzlichen Zeiger.
2.2.O-Notation
Verwendung, um das Verhalten von Funktionen und Folgen beschreiben.
Ist wichtig, um eine Größenordnung im Zeitbedarf einschätzen zu können.
Relevante Klassen:
-
O(1)
-
O(log n)
-
O(n)
-
O(n hoch x)
-
O(x hoch n)
2.2.1 Ordnung der Größen
Reihenfolge anhand der Komplexität.
2.3 Sortier- & Suchalgorithmen
2.3 Sortier- & Suchalgorithmen
2.3.1 InsertionSort
2.3.1.1 Funktionsweise
Insertionsort entnimmt der unsortierten Eingabefolge ein beliebiges Element und fügt es an richtiger Stelle in die (anfangs leere) Ausgabefolge ein. Geht man hierbei in der Reihenfolge der ursprünglichen Folge vor, so ist das Verfahren stabil. Wird auf einem Array gearbeitet, so müssen die Elemente hinter dem neu eingefügten Element verschoben werden. Dies ist die eigentlich aufwändige Operation von Insertionsort, da das Finden der richtigen Einfügeposition über eine binäre Suche vergleichsweise effizient erfolgen kann. Grundsätzlich jedoch ist Insertionsort weit weniger effizient als andere anspruchsvollere Sortierverfahren.
2.3.1.2 Komplexität
Best Case: O(n) - Wenn zu durchsuchendes Array bereits vorsortiert ist
Average Case:O(n²) – schwierige Abschätzung, geht aber dahin
Worst Case: O(n²) Wenn zu durchsuchendes Array absteigend vorsortiert ist
2.3.1.3 Pseudocode
INSERTIONSORT(A)
1 for i ← 2 to Länge(A) do
2 einzusortierender_wert ← A[i]
3 j ← i
4 while j > 1 and A[j-1] > einzusortierender_wert do
5 A[j] ← A[j - 1]
6 j ← j − 1
7 A[j] ← einzusortierender_wert
2.3.2 BubbleSort
2.3.2.1 Funktionsweise
In der Bubble-Phase wird die Eingabe-Liste von links nach rechts durchlaufen. Dabei wird in jedem Schritt das aktuelle Element mit dem rechten Nachbarn verglichen. Falls die beiden Elemente das Sortierkriterium verletzen, werden sie getauscht. Am Ende der Phase steht bei auf- bzw. absteigender Sortierung das größte bzw. kleinste Element der Eingabe am Ende der Liste.
Die Bubble-Phase wird solange wiederholt, bis die Eingabeliste vollständig sortiert ist. Dabei muss das letzte Element des vorherigen Durchlaufs nicht mehr betrachtet werden, da die restliche zu sortierende Eingabe keine größeren bzw. kleineren Elemente mehr enthält.
Je nachdem, ob auf- oder absteigend sortiert wird, steigen die größeren oder kleineren Elemente wie Blasen im Wasser (daher der Name) immer weiter nach oben, das heißt, an das Ende der Liste. Auch werden immer zwei Zahlen miteinander in „Bubbles“ vertauscht.
2.3.2.2 Komplexität
Best Case: O(n) - wenn die Liste bereits vorsortiert ist, muss der Sort nur einmal durchgehen, um festzustellen, dass schon alle Elemente in der richtigen Reihenfolge sind.
Worst Case: O(n²) - wenn die Liste auch wieder umgekehrt vorsortiert ist.
2.3.2.3 Pseudocode
bubbleSort(Array A)
for (n=A.size; n>1; n=n-1){
for (i=0; i<n-1; i=i+1){
if (A[i] > A[i+1]){
A.swap(i, i+1)
} // ende if
} // ende innere for-Schleife
} // ende äußere for-Schleife
2.3.3 Lineare Suche
2.3.3.1 Funktionsweise
Lineare Suche ist ein Such-Algorithmus, der auch unter dem Namen sequentielle Suche bekannt ist. Er ist der einfachste Suchalgorithmus überhaupt.
Die Aufgabe besteht darin, ein Element in einer Liste oder einem Array mit n Elementen zu finden. Man geht dazu die Liste Element für Element durch, bis man es gefunden hat. Der Suchaufwand wächst linear mit der Anzahl der Elemente in der Liste.
Wenn die Daten zufallsverteilt sind, dann werden im Schnitt n/2 Vergleichsoperationen benötigt. Im besten Fall ist gleich das erste Element der Liste dasjenige, das man sucht, im schlechtesten ist es das letzte.
Wenn die Anzahl der Elemente in einer Liste klein ist, dann ist es oft auch das effizienteste Verfahren.
2.3.3 Lineare Suche
2.3.3.2 Komplexität
Generell: O(n)
2.3.3.3 Pseudocode
BEGINN LinearSearch
EINGABE: (S)uchschlüssel, (A)rray
VARIABLE: N = Anzahl Elemente im Array 'A'
VARIABLE: SucheErfolgreich = falsch
VARIABLE: i = 0
FÜR i BIS N ODER SucheErfolgreich
WENN A[i] = S
DANN SucheErfolgreich = wahr
WENN SucheErfolgreich = wahr
DANN AUSGABE: i
SONST AUSGABE: Suche nicht erfolgreich
ENDE
2.3.4 Bisektionssuche
2.3.4.1 Funktionsweise
Die Liste wird in zwei möglichst gleich große Hälften geteilt, indem zunächst ein Element möglichst nah der Mitte der Liste ausgewertet wird. Der Fall, dass sich die Liste aufgrund einer ungeraden Anzahl von Elementen lediglich in zwei nur ungefähr gleich große Teile teilen lässt, kann unterschlagen werden, er wirkt sich bei großen Elementzahlen so gut wie nicht aus. Nach jedem Schritt kann also eine Hälfte der zuletzt untersuchten Menge verworfen werden, die Menge halbiert sich mit jeder Auswertung von der Elementen. Das Verfahren endet spätestens, wenn die Menge nur noch ein Element enthält, dieses muss das Gesuchte sein, sofern es überhaupt in der Ausgangsmenge enthalten war.
2.3.4 Bisektionssuche
2.3.4.2 Komplexität
O(log n), da maximale Anzahl der Versuche: [log2n]
2.3.5 Merge-Sort
2.3.5.1 Funktionsweise
Arbeitet nach dem Prinzip „Teile & Herrsche“
Mergesort betrachtet die zu sortierenden Daten als Liste und zerlegt sie in kleinere Listen, die jede für sich sortiert werden. Die sortierten kleinen Listen werden dann im Reißverschlussverfahren zu größeren Listen zusammengefügt, bis wieder eine sortierte Gesamtliste erreicht ist. Das Verfahren arbeitet bei Arrays in der Regel nicht in-place, es sind dafür aber (trickreiche) Implementierungen bekannt, in welchen die Teil-Arrays üblicherweise rekursiv zusammengeführt werden. Verkettete Listen sind besonders geeignet zur Implementierung von Mergesort, dabei ergibt sich die in-place-Sortierung fast von selbst.
2.3.5 Merge-Sort
2.3.5.2 Komplexität
Im Best-, Average- & Worst Case: stets O(n)
Damit ist Mergesort hinsichtlich der Komplexität dem Quicksort gewissermaßen überlegen, da der Quicksort (ohne besondere Vorkehrungen) ein Worst-Case-Verhalten von O(n²) besitzt. Die Wahrscheinlichkeit, dass dieser Fall auftritt, ist jedoch so gering, dass Quicksort in der Praxis bessere Ergebnisse erzielt.
2.3.5 Merge-Sort
2.3.5.3 Pseudocode
funktion mergesort(liste);
falls (Größe von liste <= 1) dann antworte liste
sonst
halbiere die liste in linkeListe, rechteListe
linkeListe = mergesort(linkeListe)
rechteListe = mergesort(rechteListe)
antworte merge(linkeListe, rechteListe)