1 / 42

Set & Bit-Vector

Set & Bit-Vector. Discrete Mathematics and Its Applications Baojian Hua bjhua@ustc.edu.cn. Set. Set Interface. signature type set type X set newSet (); int setSize (set s); void setInsert (set s, X x); set setUnion (set s1, set s2); … end.

olga-marsh
Download Presentation

Set & 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 & Bit-Vector Discrete Mathematics and Its Applications Baojian Hua bjhua@ustc.edu.cn

  2. Set

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

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

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

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

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

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

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

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

  11. Equality Testing How to do equality testing on “polymorphic” data? 1. Extra “equals” function pointer as argument. int linkedListExist (linkedList l, poly x, tyEq equals); 2. Extra “equals” function pointers in data. int linkedListExist (linkedList l, poly x) { for (…p…) (p->data)->equals (p->data, x); } // As we can see next in Java.

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

  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 the most polymorphic type void insert (Object x); SetInter union (SetInter s); … }

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

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

  18. Sample Impl’ Using Linked List import ….linkedList; public class Set<X> implements SetInter<X> { private linkedList<X> list; 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; 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; 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 BITARRAY_H #define BITARRAY_H typedef struct bitArray *bitArray; bitArray newBitArray (int size); void assignOne (bitArray ba, int index); bitArray and (bitArray ba1, bitArray ba2); … #endif

  25. Implementation in C #include “bitArray.h” struct bitArray { int *array; int size; };

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

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

  28. Bit-Array in Java

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

  30. 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; } }

  31. Re-implement Set using Bit-Vector

  32. Big Picture Universe set set set set

  33. Client Code int main () { set universe = newSet (); // insert elements into universe set s1 = newSet(); set s2 = newSet (); // insert elements into s1 and s2 setUnion (universe, s1, s2); }

  34. 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 strings? Answer: associate every set element e a unique (and continuous) integer i (i will be used as an index in the bit-vector. Details leave to you.

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

  36. 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”}

  37. 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”}

  38. 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.

  39. How to Store the Universe? // Method 1: stored in separate space int main () { set universe = newSet (); // insert elements into universe set s1 = newSet(); set s2 = newSet (); // insert elements into s1 and s2 setUnion (universe, s1, s2); // ugly }

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

  41. How to Make Things Shared? • In C: extern variables • In C++ or Java: static fields • What’s the pros and cons?

  42. Client Code int main () { set universe = newUniverse (); // insert elements into universe set s1 = newSet(); set s2 = newSet (); // insert elements into s1 and s2 setUnion (s1, s2); // hummm, no universe AT ALL! }

More Related