/Bloom

Primary LanguageC++

Τα φίλτρα Bloom {#mainpage}

Τελική εργασία για το μάθημα Algorithms and Data Structures του Τσαγκατάκη Ιωάννη.

Τα φίλτρα Bloom

Υπολογισμός Μεγέθους

Στο παράδειγμα βλέπουμε δύο παραδείγματα ένα άνετο φίλτρο καθώς και ένα γεμάτο φίλτρο. Το γεμάτο φίλτρο θα δώσει μόνο positive και false positive τιμές και ουσιατικά είναι άχρηστο.

auto bloom = BloomFilter{100, 5};
bloom.populate("../data/cia_words.txt");

Data fullness :0.52
Testing Linux : maybe yes
Testing Amiga : NO
Testing Windows : NO

auto bloom = BloomFilter{10, 5};
bloom.populate("../data/cia_words.txt");

Data fullness : 1
Testing Linux : maybe yes
Testing Amiga : maybe yes
Testing Windows : maybe yes

Λεπτομέριες Υλοποίησης

Δομή δεδομένων bitset.

Για την εσωτερική αναπαράσταση ενός bitset ένα std::vector μοιάζει μια κατάλληλη δομή. Αλλά το std::vector έρχεται απο την πρώτη έκδοση της STL και έχει σχεδιαστεί σαν container. Η φήμη του μεταξύ των υπολοίπων μελλών της STL είναι αρκετά κακόφημη.

Η C++ committee έχει προσθέσει το std::bitset<std::size_t N> ως μια λογικότερη αντικατάσταση του, αλλά αυτό πρέπει να είναι σταθερού μεγέθους κατά το compiling. Οπότε επιλέχθηκε η δυναμική έκδοση του απο την βιβλιοθήκη boost, to boost::dynamic_bitset<>.

Για την υλοποίηση exec

Για το read/eval/loop ιδανικά θα ήθελε κάποιος κάτι που να συνδιάζει το GNU readline ή libedit καθώς και το GNU historyFile, πουείναι βιβλιοθήκες C, όχι απο τιθς ποιό έυχρηστες. Βρέθηκαν στο github διάφορες υλοποιησεις και επιλέχθηκε η βιβλιοθήκη replxx του Marcin Konarski (https://github.com/AmokHuginnsson/replxx). Προτιμήιηκε απο άλλα σχετικά projects λόγω του μοντέρνου και έγρωμου UI, αλλά και γιατί το παράδειγμα που είχε ήταν στα μέτρα του προβλήματος.

Έχωντας μια καλή τέτοια βιβλιοθήκη η χρήση της ώστε να υλοποιήθει μικρή γλώσσα scripting για την εξερεύνηση και τον έλεγχο του προγράμματος ήταν μια εύκολη υπόθσεση. Αυτό θα μπορούσε να χρησιμοποιηθεί και για CI/TDD αλλά με δεδομένο τον περιορισμένο χρόνο παράδοσης, δεν επιλέχθηκε μια agile και μοντέρνα μεθοδολογία, αλλά το agile και τα test cases και τα refactoring εχουν αφήσει τα ίχνη τους στο ιστορικό του versioning system (git). Οι εξαιρετικές δυνατότηες του Clion (academic licence) για refactoring έχουν αφήσει τα ίχνη τους επίσης.

Για την τεκμηρίωση

O συγραφέας πρώτη φορά επιχειρεί τεκμηρίωση σε εκτυπόσιμη μορφή pdf. Σαν τέταοι απέχει απο το να είναι η καλύτερη δυνατή. Το doxygen σε συνδιασμό με το LaTeX έχουν χρησιμοποιηθεί. Προσθέτωντας ελληνικά και πειράζοντας και τα temnplates του LaTeX δεν ήταν ένα εύκολο έργο. Τελικά η λύση για σωστά ελληνικά πέρναγε με την με το χέρι μεταγλώστη του doxygen στην τελευαταία του έκδοση.