1 / 53

Set, Map & Bit-Vector

Set, Map & Bit-Vector. Discrete Mathematics and Its Applications Baojian Hua bjhua@ustc.edu.cn. Set. Set Interface. signature type set // set type type t // element type set newSet (); int setSize (set s); void setInsert (set s, t x);

noleta
Télécharger la présentation

Set, Map & Bit-Vector

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Set, Map & Bit-Vector Discrete Mathematics and Its Applications Baojian Hua bjhua@ustc.edu.cn

  2. Set

  3. Set Interface signature type set // set type type t // element type set newSet (); int setSize (set s); void setInsert (set s, t x); set setUnion (set s1, set s2); … end

  4. Interface in C #ifndef SET_H #define SET_H typedef struct setStruct *set; // type set typedef void *poly; // type t set newSet (); int setSize (set s); void setInsert (set s, poly x); set setUnion (set s1, set s2); … #endif

  5. Implementation in C // file “set.c” #include “set.h” struct setStruct { // your favorite concrete representation }; set newSet () { // real code goes here } …

  6. Sample Impl’ Using Linked List #include “linkedList.h” #include “set.h” struct setStruct { linkedList list; };

  7. s list Sample Impl’ Using Linked List // functions set newSet () { set s = (set)malloc (sizeof (*s)); s->list = newLinkedList (); return s; }

  8. Sample Impl’ Using Linked List int setSize (set s) { linkList l = s->list; return linkedListSize (l); } s list

  9. Sample Impl’ Using Linked List void setInsert (set s, poly x) { if (setExists (s, x)) return; linkedListInsert (s->list, x); return; }

  10. Sample Impl’ Using Linked List int setExists (set s, poly x) { return linkedListExists (s->list, x); }

  11. Equality Testing // How to perform equality testing on // “polymorphic” data? Many solutions: // #1: “equals” function pointer as argument. int linkedListExists (linkedList list, poly x, tyEq equals); // #2: “equals” function pointers in data. int linkedListExist (linkedList list, poly x) { foreach (node p in list) (p->data)->equals (p->data, x); } // As we can see next in C++ or Java.

  12. Client Code int main () { set s1 = newSet (); set s2 = newSet (); for (…) setInsert (s1, …); for (…) setInsert (s2, …); set s3 = setUnion (s1, s2); setOutput (s3); }

  13. Summary So Far set set set set set

  14. Set in Java

  15. Interface in Java public interface SetInter // the type “set” { int size (); // “Object” is very polymorphic… void insert (Object x); void union (SetInter s); … } // Follow this, all the stuffs are essentially // same with those in C

  16. Or Using Generic // Type “set”, with type argument “X” public interface SetInter<X> { int size (); void insert (X x); void union (SetInter<X> s); … } // We’ll discuss this strategy in following // slides

  17. Implementation in Java public class Set<X> implements SetInter<X> { // any concrete internal representation public Set () { // code goes here } public int size () { // code goes here } … }

  18. Sample Impl’ Using Linked List import ….linkedList; public class Set<X> implements SetInter<X> { private linkedList<X> list; public Set () { this.list = new LinkedList<X> (); } }

  19. Sample Impl’ Using Linked List import ….linkedList; public class Set<X> implements SetInter<X> { private linkedList<X> list; public int size () { return this.list.size (); } }

  20. Sample Impl’ Using Linked List import ….linkedList; public class Set<X> implements SetInter<X> { private linkedList<X> list; public void insert (X x) { if (exists (x)) // equality testing? return; this.list.insert (x); return; } }

  21. Client Code import ….Set; public class Main { public static void main (string[] args) { SetInter<String> s1 = new Set<String> (); SetInter<String> s2 = new Set<String> (); s1.size (); s1.union (s2); } }

  22. Bit-Vector

  23. Bit-Vector Interface interface type bitArray bitArray newBitArray (int size); void assignOne (bitArray ba, int index); bitArray and (bitArray ba1, bitArray ba2); … end

  24. Interface in C #ifndef BIT_ARRAY_H #define BIT_ARRAY_H typedef struct bitArrayStruct *bitArray; bitArray newBitArray (int size); void assignOne (bitArray ba, int index); bitArray and (bitArray ba1, bitArray ba2); … #endif

  25. a array size 0 0 1 0 1 1 0 0 size-1 Implementation in C #include “bitArray.h” // a not-so efficient one struct bitArrayStruct { int *array; int size; }; // What’s this set?

  26. Operations bitArray newBitArray (int s) { bitArray ba = malloc (sizeof (*ba)); ba->array = malloc (sizeof (*(ba->array)) * s); for (int k=0; k<s; k++) (ba->array)[k] = 0; ba->size = s; return ba; } ba array size ? ? ? ? ? ? ? 0 s-1

  27. Operations bitArray newBitArray (int s) { bitArray ba = malloc (sizeof (*ba)); ba->array = malloc (sizeof (*(ba->array)) * s); for (int k=0; k<s; k++) (ba->array)[k] = 0; ba->size = s; return ba; } ba array size 0 0 0 0 0 0 0 0 s-1

  28. Operations bitArray and (bitArray ba1, bitArray ba2) { if (ba1->size != ba2->size) error (…); bitArray ba = newBitArray (); for (…) …; return ba; }

  29. Bit-Array in Java

  30. In Java // I omit the interface for simplicity public class BitArray { private int[] array; public BitArray (int size) { this.array = new int[size]; } }

  31. Other Methods public class BitArray { private int[] array; BitArray and (BitArray ba2) { if (this.size () != ba2.size ()) throw new Error (…); BitArray ba = new BitArray (this.size()); … return ba; } }

  32. Map

  33. Map Interface signature type map type key type value map newMap (); void mapInsert (map m, key k, value v); value mapLookup (map m, key k); void mapDelete (map m, key k); … end

  34. Interface in C #ifndef MAP_H #define MAP_H typedef struct mapStruct *map; // type map typedef void *key; // type key typedef void *value // type value map newMap (); void mapInsert (map m, key k, value v); poly mapLookup (map m, key k); void mapDelete (map m, key k); … #endif

  35. Implementation in C #include “map.h” struct mapStruct { // your favorite concrete representation }; map newMap () { // real code goes here } // other functions

  36. Sample Impl’ Using Linked List #include “linkedList.h” #include “map.h” struct mapStruct { linkedList list; };

  37. m list Sample Impl’ Using Linked List map newMap () { map m = (map)malloc (sizeof (*m)); m->list = newLinkedList (); return m; }

  38. data data data next next next Sample Impl’ Using Linked List void mapInsert (map m, key k, value v) { linkedList list = m->list; linkedListInsert (list, newTuple (k, v)); return; } m k1 v1 k2 v2 k3 v3 list …

  39. Sample Impl’ Using Linked List value mapLookup (map m, key k) { linkedList list = m->list; while(…) { // walk through the list and lookup key k // return corresponding v, if found } return NULL; } m list

  40. Bit-Vector-based Set Representation

  41. Big Picture Universe set set set set

  42. Client Code int main () { // cook a universe set set universe = newSet (); // cook sets s1 and s2 set s1 = newSet (); set s2 = newSet (); setUnion (universe, s1, s2); }

  43. What does the Universe Look Like? // Universe is a set of (element, index) tuple. // For instance: Universe = {(“a”, 0), (“b”, 3), (“c”, 1”), (“d”, 2)} // Question: How to build such kind of universe // from the input set elements? // Answer: associate every set element e a unique // (and continuous) integer i (what’s the use?). // Details leave to you.

  44. Big Picture {(“a”, 0), (“b”, 3), (“c”, 1”), (“d”, 2)} 1. Build the bit-array from the universe {“a”} {“d”}

  45. Big Picture {(“a”, 0), (“b”, 3), (“c”, 1”), (“d”, 2)} 1. Build the bit-array from the universe baSet1 = [0, 0, 0, 0] baSet2 = [0, 0, 0, 0] {“a”} {“d”}

  46. Big Picture {(“a”, 0), (“b”, 3), (“c”, 1”), (“d”, 2)} 1. Build the bit-array from the universe baSet1 = [0, 0, 0, 0] baSet2 = [0, 0, 0, 0] 2. Build bit-array from set baSet1 = [1, 0, 0, 0] baSet2 = [0, 0, 1, 0] {“a”} {“d”}

  47. Big Picture {(“a”, 0), (“b”, 3), (“c”, 1”), (“d”, 2)} 1. Build the bit-array from the universe baSet1 = [0, 0, 0, 0] baSet2 = [0, 0, 0, 0] 2. Build bit-array from set baSet1 = [1, 0, 0, 0] baSet2 = [0, 0, 1, 0] {“a”} {“d”} 3. Bit-vector operations baSet3 = or (baSet1, baSet2) baSet3 = [1, 0, 1, 0] 4. Turn baSet3 to ordinary set How? Leave it to you.

  48. How to Store the Universe? // Method 1: stored in a separate set int main () { // cook a universe set set universe = newSet (); // cook two sets s1 and s2 set s1 = newSet (); set s2 = newSet (); setUnion (universe, s1, s2); // ugly }

  49. How to Store the Universe? // Method 2: shared Universe set set set set

  50. How to Make Things Shared? • Same ideas, but different mechanisms in different languages: • C: external variables • C++, Java or C#: static fields • What’s the pros and cons?

More Related