Αλγόριθμοι - Δομές Δεδομένων

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή - Πίνακες

Καλώς ήρθατε

Αλγόριθμοι και Δομές Δεδομένων

Τι περιλαμβάνει το μάθημα

  1. Εισαγωγή - Πίνακες
  2. Στοίβες
  3. Ουρές
  4. Λίστες
  5. Δένδρα
  6. Β-Δένδρα
  7. Γράφοι
  8. Αναζήτηση
  9. Κατακερματισμός
  10. Ταξινόμηση
  11. Τεχνικές αρχείων
  12. Ανασκόπηση - επανάληψη

Οι σημειώσεις

Οι ασκήσεις

Οι ασκήσεις είναι υποχρεωτικό και απαραίτητο στοιχείο του μαθήματος. Τα παρακάτω πρόσθετα στοιχεία εξηγούν τις τυπικές απαιτήσεις των ασκήσεων.

Χρόνος παράδοσης

Τρόπος παράδοσης

Περιεχόμενο

Οι ασκήσεις βαθμολογούνται σύμφωνα με τα παρακάτω κριτήρια: Για τα παραπάνω δίδονται - όπου χρειάζεται - συμβουλές στο μάθημα και τα εργαστήρια.

Συνεργασία

Γενική βιβλιογραφία

Αφηρημένοι τύποι δεδομένων

Οι αφηρημένοι τύποι δεδομένων (abstract data types) μας επιτρέπουν να διαχωρίσουμε τον τύπο των δεδομένων από την υλοποίησή του.

Πίνακες

Παράδειγμα

(* Άθροισμα στοιχείων του πίνακα n στοιχείων a *)
var
   a : array [1..10] of integer;
   n, i, sum : integer;

begin
     sum := 0;
     for i := 1 to 10 do
     begin
          sum := sum + a[i];
     end;
end.

Υλοποίηση πινάκων

Πίνακες στην Pascal

Ειδικές μορφές πινάκων

Πρόσβαση στα στοιχεία ενός πίνακα

Μηδενισμός κατά Gauss

Σε ένα σύστημα εξισώσεων μπορούμε να πραγματοποιήσουμε τις παρακάτω πράξεις χωρίς μεταβολή της λύσης: Με τη χρήση των παραπάνω μπορούμε να επιλύσουμε συστήματα εξισώσεων με τη μέθοδο Μηδενισμού κατά Gauss (Gaussian Elimination).

Παράδειγμα

( 1  3 -4 ) (x1)   ( 8)
( 1  1 -2 ) (x2) = ( 2)
(-1 -2  5 ) (x3)   (-1)

Βιβλιογραφία

Ασκήσεις

Άσκηση ADS01

  1. Να γραφεί πρόγραμμα σε Pascal το οποίο να λύνει το παρακάτω σύστημα εξισώσεων με τη μέθοδο του μηδενισμού κατά Gauss.
    ( 1  3 -4 ) (x1)   ( 8)
    ( 1  1 -2 ) (x2) = ( 2)
    (-1 -2  5 ) (x3)   (-1)
    
    Το πρόγραμμα μπορεί να χωριστεί σε τρεις διαδικασίες:
Περισσότερες λεπτομέρειες για τις ασκήσεις

Στοίβες

Ορισμός

Υλοποίηση στη μνήμη

Υλοποίηση σε Pascal

Αφηρημένος τύπος

{ Αρχικοποιείται η στοίβα }
procedure stackInitialize;
{ Το στοιχείο i εισάγεται στην κορυφή της στοίβας }
procedure stackPush(i : integer);
{ Το στοιχείο από την κορυφή της στοίβας αφαιρείται και επιστρέφεται }
function stackPop : integer;
{ Επιστρέφεται αληθές αν η στοίβα είναι κενή }
function stackIsEmpty : boolean;

Εφαρμογές

Πολωνικός συμβολισμός

Βιβλιογραφία

Ασκήσεις

Άσκηση ADS02

  1. Να υλοποιηθεί σε Pascal ο αφηρημένος τύπος της στοίβας ακεραίων σύμφωνα με τις παρακάτω συναρτήσεις:
    { Αρχικοποιείται η στοίβα }
    procedure stackInitialize;
    { Το στοιχείο i εισάγεται στην κορυφή της στοίβας }
    procedure stackPush(i : integer);
    { Το στοιχείο από την κορυφή της στοίβας αφαιρείται και επιστρέφεται }
    function stackPop : integer;
    { Επιστρέφεται αληθές αν η στοίβα είναι κενός }
    function stackIsEmpty : bool;
  2. Με βάση τον αφηρημένο αυτό τύπο να υλοποιηθεί πρόγραμμα το οποίο να διαβάζει ακεραίους μέχρι να διαβάσει 0 και να τους τυπώνει με αντίστροφη σειρά.
Περισσότερες λεπτομέρειες για τις ασκήσεις

Ουρές και δείκτες

Ορισμός

Υλοποίηση στη μνήμη

Υλοποίηση σε Pascal

Αφηρημένος τύπος

{ Αρχικοποιείται η ουρά }
procedure queueInitialize;
{ Το στοιχείο i εισάγεται στο τέλος της ουράς }
procedure queuePut(i : integer);
{ Το στοιχείο από την αρχή της ουράς αφαιρείται και επιστρέφεται }
function queueGet : integer;
{ Επιστρέφεται αληθές αν η ουρά είναι κενή }
function queueIsEmpty : boolean;

Εφαρμογές

Δείκτες

Ορισμός

Ο δείκτης (pointer) είναι ένας τύπος δεδομένων που χρησιμοποιήται για να απεικονίσει απευθείας τη μνήμη του υπολογιστή. Στην Pascal δείκτης σε κάποιο τύπο (λ.χ. Integer) ορίζεται ως εξής:
var
	p, q : ^integer;

Αρχικοποίηση

Πριν χρησιμοποιηθεί ένας δείκτης πρέπει να δείξει σε καθορισμένο χώρο της μνήμης. Αυτό μπορεί να γίνει: Παράδειγμα:
	new(p);
	q = p

Χρήση

Μπορούμε να διαβάσουμε ή να αλλάξουμε τα στοιχεία στη θέση που δείχνει ο δείκτης χρησιμοποιώντας το όνομά του μαζί με το σύμβολο ^:
	p^ := 3;
	writeln(p^)

Βιβλιογραφία

Ασκήσεις

Άσκηση ADS03

  1. Να υλοποιηθεί σε Pascal ο αφηρημένος τύπος της ουράς ακεραίων σύμφωνα με τις παρακάτω συναρτήσεις:
    { Αρχικοποιείται η ουρά }
    procedure queueInitialize;
    { Το στοιχείο i εισάγεται στο τέλος της ουράς }
    procedure queuePut(i : integer);
    { Το στοιχείο από την αρχή της ουράς αφαιρείται και επιστρέφεται }
    function queueGet : integer;
    { Επιστρέφεται αληθές αν η ουρά είναι κενή }
    function queueIsEmpty : boolean;
  2. Με βάση τον αφηρημένο αυτό τύπο και μονοτονικά αυξανόμενη μεταβλητή να υλοποιηθεί πρόγραμμα το οποίο να υλοποιεί ουρά εξυπηρέτησης πελατών ως εξής:
    1. Όταν εισάγεται ο χαρακτήρας I (In) το πρόγραμμα τυπώνει τον αριθμό προτεραιότητας του νέου πελάτη.
    2. Όταν εισάγεται ο χαρακτήρας O (Out) το πρόγραμμα τυπώνει τον αριθμό προτεραιότητας του επόμενου πελάτη που θα εξυπηρετηθεί.
    Παράδειγμα:
    I
    1
    I
    2
    I
    3
    O
    1
    I
    4
    O
    2
    ...
    
Περισσότερες λεπτομέρειες για τις ασκήσεις

Συνδεδεμένες λίστες

Ορισμός

Υλοποίηση στη μνήμη

Υλοποίηση με πίνακα

Υλοποίηση σε Pascal

Παράδειγμα:
program list;

type
    intList = ^intListElem;

    intListElem = record
        val : integer;
        next : intList;
    end;


var
    theList, node : intList;

begin
    new(node);
    node^.val := 5;
    node^.next := nil;
    theList := node;

    new(node);
    node^.val := 12;
    node^.next := theList;
    theList := node
end.

Αφηρημένος τύπος

{ Ορισμός του τύπου της συνδεδεμένης λίστας }
type
    intList = ^intListElem;

    intListElem = record
        val : integer;
        next : intList;
    end;
{ Επιστρέφεται μια άδεια συνδεδεμένη λίστα }
function newIntList : intList;
{ Επιστρέφεται μια συνδεδεμένη λίστα με το στοιχείο i στην αρχή της }
function addIntList(l : intList; i : integer) : intList;
{ Επιστρέφεται μια συνδεδεμένη λίστα με το στοιχείο i διαγραμμένο }
function delIntList(l : intList; i : integer) : intList;
{ Επιστρέφεται ένας δείκτης στο στοιχείο της λίστας που έχει την τιμή i }
function searchIntList(l : intList; i : integer) : intList;
{ Επιστρέφεται αληθές αν η λίστα είναι κενή }
function isEmtyIntList(l : intList) : boolean;

Ειδικές μορφές λιστών

Διακρίνουμε τις παρακάτω ειδικές μορφές συνδεδεμένων λιστών:
διπλά συνδεδεμένη λίστα (doubly linked list)
Κάθε στοιχείο της λίστας έχει δείκτες στο προηγούμενο και το επόμενο.
κυκλικά συνδεδεμένη λίστα
Το τελευταίο στοιχείο της λίστας δείχνει ξανά το πρώτο. Η δομή αυτή ονομάζεται και δακτύλιος (ring).
κυκλικά διπλά συνδεδεμένη λίστα
Σύνθεση των παραπάνω.

Εφαρμογές

Βιβλιογραφία

Ασκήσεις

Άσκηση ADS04

  1. Να υλοποιηθεί σε Pascal ο αφηρημένος τύπος της συνδεδεμένης λίστας χαρακτήρων σύμφωνα με τις παρακάτω συναρτήσεις:
    { Ορισμός του τύπου της συνδεδεμένης λίστας }
    type
        charList = ...
    
    { Επιστρέφεται μια άδεια συνδεδεμένη λίστα }
    function newCharList : charList;
    { Επιστρέφεται μια συνδεδεμένη λίστα με το στοιχείο c στην αρχή της }
    function addCharList(l : charList; c : char) : charList;
    { Επιστρέφεται μια συνδεδεμένη λίστα με το πρώτο στοιχείο διαγραμμένο. Κατά την επιστροφή η μεταβλητή c περιέχει την τιμή του. }
    function delCharListHead(l : charList; var c : char) : charList;
    { Επιστρέφεται ένας δείκτης στο στοιχείο της λίστας που έχει την τιμή c }
    function searchCharList(l : charList; c : char) : charList;
    { Επιστρέφεται αληθές αν η λίστα είναι κενή }
    function isEmtyCharList(l : charList) : boolean;
  2. Με βάση τον αφηρημένο αυτό τύπο να υλοποιηθεί πρόγραμμα το οποίο να διαβάζει μια σειρά χαρακτήρων μέχρι να συναντήσει μια τελεία και στη συνέχεια να τυπώνει τους χαρακτήρες αυτούς με την αντίστροφη σειρά.
      Παράδειγμα:
      L
      I
      V
      E
      .
      E
      V
      I
      L
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Δένδρα

    Ορισμοί

    Ιδιότητες

    Υλοποίηση σε Pascal

    Παράδειγμα:
    program bintree;
    
    type
        binTree = ^binTreeElem;
    
        binTreeElem = record
            val : integer;
            left : binTree;
            right : binTree;
        end;
    
    
    var
        theTree, node : binTree;
    
    begin
        new(node);
        node^.val := 5;
        node^.left := nil;
        node^.right := nil;
        theTree := node;
    
        new(node);
        node^.val := 12;
        node^.left := nil;
        node^.right := nil;
        theTree^.right = node;
    end.
    

    Δένδρα αναζήτησης

    Διάσχιση δένδρων

    Η διάσχιση ενός δένδρου μπορεί να γίνει με τους παρακάτω τρόπους ανάλογα με τη σειρά επίσκεψης των κόμβων:
    Προδιαταγμένη διάσχιση (preorder traversal)
    1. επίσκεψη της ρίζας
    2. επίσκεψη του αριστερού υποδένδρου
    3. επίσκεψη του δεξιού υποδένδρου
    Μεταδιαταγμένη διάσχιση (postorder traversal)
    1. επίσκεψη του αριστερού υποδένδρου
    2. επίσκεψη του δεξιού υποδένδρου
    3. επίσκεψη της ρίζας
    Ενδοδιαταγμένη διάσχιση (inorder traversal)
    1. επίσκεψη του αριστερού υποδένδρου
    2. επίσκεψη της ρίζας
    3. επίσκεψη του δεξιού υποδένδρου
    Επίπεδοδιαταγμένη διάσχιση (level order traversal)
    1. επίσκεψη των κόμβων από πάνω προς τα κάτω

    Εφαρμογές

    Βιβλιογραφία

    Ασκήσεις

    Άσκηση ADS05

    1. Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο με τη χρήση διατεταγμένου δυαδικού δένδρου διαβάζει από το χρήστη μια σειρά από ονόματα μέχρι να συναντήσει τελεία και τα εκτυπώνει με αλφαβητική σειρά. Παράδειγμα:
      Pascal
      Gauss
      Newton
      Einstein
      .
      Einstein
      Gauss
      Newton
      Pascal
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Γράφοι

    Ορισμοί

    Παράσταση

    Ένας γράφος μπορεί εύκολα να παρασταθεί με δύο διαφορετικούς τρόπους:
    1. πίνακα γειτνίασης (adjacency matrix).
    2. λίστα γειτνίασης (adjacency list).
    Και οι δύο τρόποι προϋποθέτουν ένα μονοσήμαντο σύστημα αρίθμησης των κόμβων.

    Πίνακας γειτνίασης

    Σε έναν γράφο με ν κόμβους ο πίνακας ν*ν γειτνίασης περιέχει 1 στις θέσεις (κ,λ) όπου υπάρχει ακμή από τον κόμβο κ στον κόμβο λ.

    Λίστα γειτνίασης

    Κάθε κόμβος συσχετίζεται με μια συνδεδεμένη λίστα γειτνίασης η οποία περιέχει τα ονόματα των άλλων κόμβων με τους οποίους συνδέεται ο συγκεκριμένος κόμβος. Οι λίστες για όλους τους κόμβους ν μπορούν να ξεκινούν από έναν μονοδιάστατο πίνακα μήκους ν ή από μια άλλη συνδεδεμένη λίστα.

    Υλοποίηση σε Pascal

    Πίνακας γειτνίασης

    program matrixGraph;
    
    const
        n = 10;	(* Number of nodes *)
    
    var
        graph = array [1..n,1..n] of boolean;
    
    ...
    

    Λίστα γειτνίασης

    program listGraph;
    
    const
        n = 10;	(* Number of nodes *)
    
    type
        adjList = ^adjListElem;
    
        adjListElem = record
            node : integer;
            next : adjList;
        end;
    
    var
        graph = array [1..n] of adjList;
    
    ...
    

    Πρόσθετοι ορισμοί

    Προτάσεις σε συνεκτικούς μη κυκλικούς γράφους

    Οι παρακάτω προτάσεις είναι ισοδύναμες για πεπερασμένους γράφους με ν > 0 κόμβους:
    1. Ο γράφος Γ είναι συνεκτικός και μη κυκλικός.
    2. Αν διαγραφεί οποιαδήποτε ακμή ο γράφος θα πάψει να είναι συνεκτικός.
    3. Δύο διαφορετικοί κόμβοι συνδέονται από μια και μόνο μια απλή διαδρομή.
    4. Ο γράφος είναι μη κυκλικός και περιέχει ν - 1 ακμές.
    5. Ο γράφος είναι συνεκτικός και περιέχει ν - 1 ακμές.

    Ψάξιμο κατά βάθος

    Για να επισκευθούμε όλους τους κόμβους ενός γράφου με ν κόμβους χρειαζόμαστε έναν πίνακα λογικών μεταβλητών μιας διάστασης και μήκους ν ο οποίος περιέχει την τιμή "αληθές" για τους κόμβους τους οποίους έχουμε επισκευθεί. Η συστηματική επίσκεψη όλων των κόμβων γίνεται σύμφωνα με τα παρακάτω βήματα:
    1. Φυλάμε την τιμή "ψευδές" στον πίνακα επισκέψεων.
    2. Επισκεπτόμαστε όλους τους κόμβους που δεν έχουμε επισκευτεί.

    Η επίσκεψη ενός κόμβου γίνεται σύμφωνα με τα παρακάτω βήματα:
    1. Σημειώνουμε στον πίνακα ότι έχουμε επισκευθεί τον κόμβο.
    2. Επισκεπτόμαστε όλους τους συνδεδεμένους κόμβους που δεν έχουμε επισκευθεί.
    Ο παραπάνω αλγόριμος για γράφο Κ κόμβων και Α ακμών απαιτεί:

    Εφαρμογές

    Βιβλιογραφία

    Ασκήσεις

    Άσκηση ADS06

    1. Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο διαβάζει ζεύγη συνδεδεμένων κόμβων ενός γράφου ακεραίων μέχρι να συναντήσει το ζεύγος (0,0) και στη συνέχεια επισκέπτεται κατά βάθος όλους τους κόμβους και τυπώνει τον αριθμό τους στο τέλος της διαδικασίας επίσκεψης.

      Παράδειγμα:

      5 3
      5 2
      0 2
      4 0
      0 5
      1 6
      1 5
      0 0
      
      
      2
      3
      5
      0
      6
      1
      
      Αριθμήστε στην τύχη όλα τα ρούχα σας (π.χ. παπούτσια = 1, κάλτσες = 6) και εκφράστε την έννοια ότι για να φορέσετε το Α πρέπει να έχετε φορέσει το Β ως ένα ζεύγος (Α, Β) (π.χ. 1 6). Δώστε όλα τα ζεύγη που εκφράζουν τις ανάγκες σας για να ντυθείτε με λογικό τρόπο και ελέγξτε την σειρά ενδυμασίας που προτείνει το πρόγραμμα. (Η ταξινόμιση αυτή ονομάζεται τοπολογική ταξινόμιση (topological sorting)).
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Αναζήτηση

    Εισαγωγή

    Σειριακή αναζήτηση

    Αναζήτηση κατά ομάδες

    Δυαδική αναζήτηση

    Αναζήτηση παρεμβολής

    Βιβλιογραφία

    Ασκήσεις

    Άσκηση ADS07

    1. Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο με δυαδική αναζήτηση σε πίνακα που περιέχει όλα τα φωνήεντα να εκτυπώνει αν ένα γράμμα που έδωσε ο χρήστης είναι φωνήεν ή σύμφωνο.

      Παράδειγμα:

      A
      FONIEN
      G
      SYMFONO
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Ταξινόμηση

    Εισαγωγή

    Ταξινόμηση με παρεμβολή

    Ταξινόμηση με επιλογή

    Ταξινόμηση με αντιμετάθεση

    Ταξινόμηση με διαμερισμό και αντιμετάθεση

    Βιβλιογραφία

    Ασκήσεις

    Άσκηση ADS08

    1. Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο διαβάζει σειρά από ακεραίους μέχρι να συνατήσει την τιμή 0 και με ταξινόμηση διαμερισμού τους τυπώνει με αριθμητική σειρά.

      Παράδειγμα:

      4
      6
      1
      3
      0
      1
      3
      4
      6
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Κατακερματισμός

    Εισαγωγή

    Ορισμοί

    Σε ένα σύστημα κατακερματισμού μπορούμε να ορίσουμε τα παρακάτω:

    Συναρτήσεις κατακερματισμού

    Η συνάρτηση κατακερματισμού πρέπει να εκτελείται γρήγορα και να είναι κατά το δυνατό ομοιόμορφη. Οι παρακάτω είναι μερικές ενδεικτικές μέθοδοι υλοποίησης: Οι παραπάνω μέθοδοι μπορούν να χρησιμοποιηθούν και σε συνδυασμό.

    Διαχείριση συγκρούσεων

    Σε περίπτωση που σημειωθεί μια σύγκρουση υπάρχουν οι παρακάτω επιλογές:

    Βιβλιογραφία

    Ασκήσεις

    Άσκηση ADS09 (προαιρετική)

    1. Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο διαβάζει 5 ακεραίους και τους αποθηκεύει με κατακερματισμό σε πίνακα 50 θέσεων. Στην συνέχεια ζητάει κατ' εξακολούθηση από το χρήστη να δώσει έναν ακέραιο αριθμό και τυπώνει στην οθόνη αν ο αριθμός αυτός ήταν ανάμεσα στους 5 ή όχι. Το ενδεχόμενο της υπερχείλισης να μην εξεταστεί.

      Παράδειγμα:

      454
      3466
      456
      23
      199
      Give number: 123
      Not known
      Give number: 456
      Known
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Τεχνικές αρχείων

    Εισαγωγή

    Βοηθητική μνήμη

    Επεξεργασία σειριακών αρχείων

    Αρχεία τυχαίας προσπέλασης

    Βιβλιογραφία

    Θέματα εξετάσεων

    Εργαστήριο αυτοαξιολόγησης

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Μαθηματικών

    ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

    (Εργαστήριο αυτοαξιολόγησης)
    Διδάσκων: Διομήδης Σπινέλλης 15 Απριλίου 1997

    Θέμα 1ο:

    1. Για κάθε ένα από τα παρακάτω είδη πινάκων να γραφεί σε ψευδοκώδικα μια συνάρτηση η οποία δέ÷εται ως όρισμα έναν πίνακα Ν*Ν και να επιστρέφει αληθές η ψευδές ανάλογα με τον αν ο πίνακας ανήκει στο συγκεκριμένο είδος:
      • Συμμετρικός
      • Τριγωνικός
      • Τριδιαγώνιος
      • Αραιός (πλήρης κατά λιγότερο από 10%)

    Θέμα 2ο:

    1. Ορίστε σε Pascal τις διαδικασίες και συναρτήσεις πρόσβασης σε μια στοίβα συμβολοσειρών ως αφηρημένο τύπο (μην τις υλοποιήσετε!)
    2. Με δεδομένες τις παραπάνω να γραφεί πρόγραμμα το οποίο να διαβάζει μια σειρά από λέξεις από το ÷ρήστη μέ÷ρι να συναντήσει τελεία και να τις τυπώνει με ανάποδη σειρά.

    Θέμα 3ο:

    1. Ορίστε μια συνδεδεμένη λίστα ÷αρακτήρων σε Pascal.
    2. Υλοποιήστε συνάρτηση η οποία δέ÷εται ως όρισμα την παραπάνω συνδεδεμένη λίστα και επιστρέφει τον αριθμό των στοι÷είων που την απαρτίζουν.

    Θέμα 4ο:

    1. Ορίστε ένα δυαδικό δένδρο ακεραίων σε Pascal.
    2. Υλοποιήστε συνάρτηση η οποία να δέ÷εται ως όρισμα τον παραπάνω δένδρο και έναν ακέραιο και να επιστρέφει αληθές αν ο ακέραιος αυτός αποτελεί στοι÷είο του δένδρου.
    3. Υπολογίστε πόσους το πολύ κόμβους μπορεί να έ÷ει ένα δένδρο βαθμού d και ύψους h.


    Διάρκεια εξέτασης 1.5 ώρα. Καλή επιτυ÷ία!

    Εξεταστική περιόδος Ιουνίου 1997

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Μαθηματικών
    ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

    Διδάσκων: Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Ιουνίου 1997

    Θέμα 1ο:

    Να υλοποιηθεί σε Pascal ο αφηρημένος τύπος της στοίβας λογικών τιμών σύμφωνα με τις παρακάτω συναρτήσεις:

         { Αρχικοποιείται η στοίβα }
              procedure stackInitialize; 
         { Το στοιχείο i εισάγεται στην κορυφή της στοίβας }
              procedure stackPush(i :boolean); 
         { Το στοιχείο από την κορυφή της στοίβας αφαιρείται και επιστρέφεται }
              function stackPop : boolean; 
         { Επιστρέφεται αληθές αν η στοίβα είναι κενή }
              function stackIsEmpty : bool;
    

    Η στοίβα να φυλάσσεται σε πίνακα 2000 θέσεων.

    Θέμα 2ο:

    1. Ορίστε ποιο γράφο ονομάζουμε συνεκτικό και ποιο μη κυκλικό.
    2. Σχεδιάστε γραφικά ένα συνεκτικό, μη κυκλικό γράφο με 8 κόμβους και 7 ακμές.
    3. Ποιες από τις παρακάτω προτάσεις είναι αληθείς για έναν συνεκτικό μη κυκλικό γράφο με ν > 0 κόμβους:

    1. Αν διαγραφεί οποιαδήποτε ακμή ο γράφος θα πάψει να είναι συνεκτικός.
    2. Δύο διαφορετικοί κόμβοι συνδέονται από τουλάχιστον μια απλή διαδρομή.
    3. Ο γράφος περιέχει ν + 1 ακμές.
    4. Αν προστεθεί οποιαδήποτε ακμή ο γράφος θα αποκτήσει μια τουλάχιστον κυκλική διαδρομή.
    5. Ο γράφος περιέχει λιγότερες από 2ν ακμές.
    6. Αν προστεθεί οποιαδήποτε ακμή ο γράφος θα πάψει να είναι συνεκτικός.
    7. Δύο διαφορετικοί κόμβοι συνδέονται από μια και μόνο μια απλή διαδρομή.
    8. Ο γράφος περιέχει ν - 1 ακμές.
    9. Αν διαγραφεί οποιαδήποτε ακμή ο γράφος θα αποκτήσει μια τουλάχιστον κυκλική διαδρομή.

    Θέμα 3ο:

    1. Ορίστε μια διπλά συνδεδεμένη λίστα ακεραίων σε Pascal.
    2. Υλοποιήστε συνάρτηση η οποία δέχεται ως όρισμα την παραπάνω διπλά συνδεδεμένη λίστα και ένα ακέραιο αριθμό που υπάρχει στη λίστα και επιστρέφει το μέσο όρο: του αριθμού αυτού, του αριθμού που προηγείται από αυτόν στη λίστα και του αριθμού που τον ακολουθεί. Αν δεν υπάρχει προηγούμενος ή επόμενος αριθμός ο μέσος όρος να υπολογιστεί από τους υπόλοιπους αριθμούς.

    Θέμα 4ο:

    Τα ονόματα των κατόχων και τα αντίστοιχα τηλέφωνα των 5.328.690 συνδέσεων που παρέχει ο ΟΤΕ πρέπει να καταχωρηθούν σε δομή δεδομένων που να επιτρέπει την ταχύτερη δυνατή εύρεση του τηλεφώνου με βάση το όνομα. Ποια δομή δεδομένων θα χρησιμοποιήσετε; Ποια δομή δεδομένων θα χρησιμοποιήσετε αν επιπλέον απαιτείται η άμεση ταξινομημένη ανάκτηση των ονομάτων για την εκτύπωση των τηλεφωνικών καταλόγων.
    Διάρκεια εξέτασης 2 ώρες Καλή επιτυχία!

    Εξεταστική περιόδος Σεπτεμβρίου 1997

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Μαθηματικών
    ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

    Διδάσκων: Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Σεπτεμβρίου 1997

    Θέμα 1ο:

    Να υλοποιηθεί σε Pascal ο αφηρημένος τύπος της συνδεδεμένης λίστας χαρακτήρων σύμφωνα με τις παρακάτω συναρτήσεις:

         { Ορισμός του τύπου της συνδεδεμένης λίστας }
              type
                  charList = ...
         { Επιστρέφεται μια άδεια συνδεδεμένη λίστα }
              function newCharList : charList; 
         { Επιστρέφεται μια συνδεδεμένη λίστα με το στοιχείο c στην αρχή της }
              function addCharList(l : charList; c : char) : charList; 
         { Επιστρέφεται μια συνδεδεμένη λίστα με το πρώτο στοιχείο διαγραμμένο. Κατά
            την επιστροφή η μεταβλητή c περιέχει την τιμή του. }
              function delCharListHead(l : charList; var c : char) : charList; 
         { Επιστρέφεται ένας δείκτης στο στοιχείο της λίστας που έχει την τιμή c }
              function searchCharList(l : charList; c : char) : charList; 
         { Επιστρέφεται αληθές αν η λίστα είναι κενή }
              function isEmtyCharList(l : charList) : boolean;
    

    Θέμα 2ο:

    1. Τι ονομάζουμε βαθμό και τι ύψος ενός δένδρου;
    2. Πότε ένα δένδρο καλείται πλήρες;
    3. Αποδείξτε τις παρακάτω προτάσεις. Στην απόδειξη μπορεί να σας φανεί χρήσιμη η μέθοδος της επαγωγής.

    1. Ένα πλήρες δένδρο βαθμού d και ύψους h θα έχει κόμβους.
    2. Ένα πλήρες δυαδικό δένδρο ύψους h θα έχει κόμβους.
    3. Ένα πλήρες δυαδικό δένδρο με n κόμβους θα έχει ύψος.

    Θέμα 3ο:

    1. Περιγράψτε με πληρότητα έναν αποδοτικό τρόπο ταξινόμησης αρχείου του οποίου τα στοιχεία δε χωράνε στην κεντρική μνήμη.
    2. Περιγράψτε περιληπτικά δομές αναζήτησης που μπορούν να χρησιμοποιηθούν για γρήγορη πρόσβαση στα στοιχεία ενός αρχείου που φυλάσσεται σε βοηθητική μνήμη.

    Θέμα 4ο:

    1. Περιγράψτε με ψευδοκώδικα τη διαδικασία της δυαδικής αναζήτησης για την εύρεση μιας εγγραφής σε ταξινομημένο πίνακα.
    2. Αν ο πίνακας έχει Ν στοιχεία δώστε τον ελάχιστο και το μέγιστο αριθμό συγκρίσεων που μπορεί να απαιτηθούν για την παραπάνω διαδικασία αναζήτησης.

    .
    Διάρκεια εξέτασης 2.5 ώρες Καλή επιτυχία!