Δομές δεδομένων και μνήμη — DedSec Project
Δομές δεδομένων — περιορισμένη μνήμη λιγότερο πρόσφατης χρήσης Συγκεκριμένο πρόβλημα Μία βιβλιοθήκη γνώσης που λειτουργεί χωρίς διαδίκτυο θέλει να κρατά τα δύο τελευταία μαθήματα στη μνήμη…
Δομές δεδομένων — περιορισμένη μνήμη λιγότερο πρόσφατης χρήσης
Συγκεκριμένο πρόβλημα
Μία βιβλιοθήκη γνώσης που λειτουργεί χωρίς διαδίκτυο θέλει να κρατά τα δύο τελευταία μαθήματα στη μνήμη. Η αναζήτηση κλειδιού μέσα σε λίστα απαιτεί O(n) ελέγχους, ενώ ο πίνακας κατακερματισμού προσφέρει συνήθως O(1), αλλά δεν ενημερώνει αυτόματα τη σειρά χρήσης. Η OrderedDict υποστηρίζει αναζήτηση κλειδιού και ρητή μετακίνησή του στην πιο πρόσφατη θέση. Όρισε θετική ακέραιη χωρητικότητα και αφαίρεσε τη λιγότερο πρόσφατα χρησιμοποιημένη εγγραφή όταν ξεπεραστεί το όριο.
Εκτελέσιμο πρόγραμμα Python 3
Αποθήκευσε ως cache_lab.py και εκτέλεσε python3 cache_lab.py. Το πρόγραμμα δεν χρησιμοποιεί αρχεία και ελέγχει την εκτόπιση, τα ελλείποντα κλειδιά και τη μη επιτρεπτή χωρητικότητα.
from collections import OrderedDict
MISSING = object()
class Cache:
def __init__(self, capacity):
if type(capacity) is not int or capacity < 1:
raise ValueError('positive integer capacity required')
self.capacity = capacity
self.items = OrderedDict()
def get(self, key):
if key not in self.items:
return MISSING
self.items.move_to_end(key)
return self.items[key]
def put(self, key, value):
self.items[key] = value
self.items.move_to_end(key)
if len(self.items) > self.capacity:
return self.items.popitem(last=False)
return None
c = Cache(2)
assert c.get('a') is MISSING
assert c.put('a', None) is None
assert c.get('a') is None
c.put('b', 2)
assert c.get('a') is None
assert c.put('c', 3) == ('b', 2)
assert list(c.items) == ['a', 'c']
try:
Cache(0)
except ValueError:
pass
else:
raise AssertionError('zero capacity was accepted')
print('PASS cache: eviction, missing sentinel, recency')
Μνήμη και σημασιολογία
Οι λειτουργίες get και put έχουν αναμενόμενο κόστος O(1), ενώ η μνήμη είναι O(χωρητικότητα). Η απλή dict που διατηρεί σειρά εισαγωγής δεν αποτελεί από μόνη της μηχανισμό πρόσφατης χρήσης: η ανάγνωση δεν αλλάζει τη θέση του κλειδιού. Το μοναδικό αντικείμενο MISSING επιτρέπει να ξεχωρίζουμε ένα απόν κλειδί από ένα υπάρχον κλειδί με τιμή None. Η υλοποίηση δεν συγχρονίζει πολλαπλά νήματα που αλλάζουν ταυτόχρονα το cache.
Περιορισμένες ασκήσεις
- Βάλε χωρητικότητα ένα, πρόσθεσε τρία κλειδιά και έλεγξε την εκτόπιση. Ενημέρωσε υπάρχον κλειδί και παρατήρησε τη σειρά.
- Σύγκρινε την ισότητα δύο λιστών με την ταυτότητα των αντικειμένων τους. Εξήγησε γιατί τα κλειδιά πρέπει να είναι κατακερματίσιμα.
- Δοκίμασε λίστα ζευγών αντί OrderedDict με 10.000 κλειδιά και αιτιολόγησε την επιβάρυνση αναζήτησης.
- Έλεγξε Cache(0), Cache(True) και μη ακέραια χωρητικότητα. Η bool κληρονομεί από int, αλλά ο έλεγχος ακριβούς τύπου την απορρίπτει.
Παραδοτέα: PASS, σειρά εκτόπισης, διάκριση απουσίας από None και ρεαλιστικό όριο μνήμης για κινητή συσκευή.