Grundlagen der Informatik zusammengefasst

Grundlagen der Informatik zusammengefasst für Klausur

Grundlagen der Informatik zusammengefasst für Klausur


Phil Wienen
Diese Lernkarten bieten einen umfassenden Überblick über die Grundlagen der Informatik auf Universitätsniveau. Sie behandeln zentrale Themen wie reguläre Sprachen, Automaten, Graphen und Algorithmen, wobei Schwerpunkte auf Knoten, Listen, Mengen und Sprachen liegen. Besonders nützlich sind sie für Studierende, die sich mit formalen Sprachen, Automaten und deren Eigenschaften auseinandersetzen möchten, sowie für alle, die ein tieferes Verständnis der theoretischen Informatik erlangen wollen.
Flashcards
115
Students
8
Language
German
Category
Computer Science
Level
University
Created / Updated
05.07.2014 / 22.02.2018

Flashcards

1.1 Informatik Definition

Wissenschaft von automatisierter Verarbeitung von Daten und Informationen

1.2 Daten Definition

  1. Strukturiert und unstrukturiert

  2. 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)

  1. Analyse des Problems

  2. Problemlösung (Algorithmus)

  3. Programmierung (Codierung)

  4. Test

  5. Inbetriebnahme

  6. 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)

Study