# Week 6 - Sets ## Team Team name: Date: Members | Role | Name | |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| | **Facilitator** keeps track of time, assigns tasks and makes sure all the group members are heard and that decisions are agreed upon. | Rimma | | **Spokesperson** communicates group’s questions and problems to the teacher and talks to other teams; presents the group’s findings. | Nafiz | | **Reflector** observes and assesses the interactions and performance among team members. Provides positive feedback and intervenes with suggestions to improve groups’ processes. | Yazan | | **Recorder** guides consensus building in the group by recording answers to questions. Collects important information and data. | Husam | ## Activities Make sure to have the activities signed off regularly to ensure progress is tracked. Download the provided project and open it in CLion. ### Activity 1: Find out: set membership - even number belongs to set of numbers but doesnt belong to the set of odd numbers - international student belongs to set of university students, but doesnt belong to set of dutch class students - macbook belongs to the set of computers but doesnt belong to the set of cimputers that run on windows - veggies belong to the set of vegetables but they might not belong to the set of specific salad recipe - student belongs to LED department but doesnt belong specifically to ACS class set ### Activity 2: Comparing floating point numbers In the case of floating-point numbers, the relational operator (==) does not produce correct output, this is due to the internal precision errors in rounding up floating-point numbers. ```c int equals_dbl(double a, double b){ if (fabs(a - b) < 0.00001) return 1; // true else return 0;//false } int main() { double a=41.0+0.5+0.2+0.2+0.1; double b=43.0-0.5-0.2-0.2-0.1; printf("%d\n", equals_dbl(a,b)); return 0; } ``` ### Activity 3: Comparing compound data types ```c int equals_prs(const person_t* obj1, const person_t* obj2){ if((obj1->name==obj2->name) &&(obj1->year_of_birth==obj2->year_of_birth)) return 1; return 0; } ``` ### Activity 4: Function prototypes ```c void add(set_t* set, double a){ set->data[set->size++]=a; } bool contains(set_t *set, double x){ for(int i=0; i<set->size; i++){ if (set->data[i]==x){ return true; } } return false; } void remove(set_t *set, double x){ for(int i=0; i<set->size; i++){ if (set->data[i]==x){ set->data[i]=0; set->size--; } } } ``` ### Activity 5: Dynamic sizing ```c void ensure_cap(set_t * set) { // version 1 if (set->size < set->capacity) return; size_t cap = (set->capacity + 1) * 3 / 2; double * ptr = realloc(set->data, cap * sizeof(double)); if (ptr != NULL) { set->data = ptr; set->capacity = cap; } } ``` ### Activity 6: Function implementations ```c void add(set_t* set, double a){ set->data[set->size++]=a; } bool contains(set_t *set, double x){ for(int i=0; i<set->size; i++){ if (set->data[i]==x){ return true; } } return false; } void remove(set_t *set, double x){ for(int i=0; i<set->size; i++){ if (set->data[i]==x){ set->data[i]=0; set->size--; } } } ``` ### Activity 7: Time complexity of remove and add | Operation | Time complexity | |-----------| --------------- | | Contains | o(n) | | Add | o(1) | | Remove | o(n) | ### Activity 8: Binary search Value to find: 46: | Binary search step | lo | hi | mid | |--------------------|-----|-----|-----| | 1 | 0 | 16 | 8 | | 2 | 8 | 16 | 11 | | 3 | 11 | 16 | 13 | Value to find: 4: | Binary search step | lo | hi | mid | |--------------------|-----|-----|-----| | 1 | 0 | 16 | 8 | | 2 | 0 | 8 | 4 | | 3 | 0 | 4 | 2 | | 4 | 0 | 2 | 1 | no 4 in a array ### Activity 9: Binary search - Time complexity | Array size | Lookups | |------------|---------| | 16 | 5 | | 32 | 6 | | 64 | 7 | | 128 | 8 | | 256 | 9 | ### Activity 10: Implementing index_of ```c int index_of(int arr[], int l, int r, int x) { if (r >= l) { int mid = l + (r - l) / 2; if (arr[mid] == x) return mid; if (arr[mid] > x) return binarySearch(arr, l, mid - 1, x); return binarySearch(arr, mid + 1, r, x); } return -1; } ``` ### Activity 11: Modifying the sorted array ```c void add(set_t* set, double a){ set->data[set->size++]=a; } void remove(set_t *set, double x){ for(int i=0; i<set->size; i++){ if (set->data[i]==x){ set->data[i]=0; set->size--; } } } bool set_contains(set_t* set, double needle){ size_t index = index_of(set, needle); if (index == set->size){ return false; } return equals_dbl(set->data[index], needle); } ``` ### Activity 12: Time complexity of the sorted set | Operation | Time complexity | |-----------| --------------- | | Add | O(log n) | | Remove | O(n) | | Contains | O(log n) | ## Looking back ### What we've learnt - how to use binary search - how to implement sorted sets ### What were the surprises differences btw time complexities of unsorted and sorted sets ### What problems we've encountered implementation of required functions was hard ### What was or still is unclear ### How did the group perform? - Our team worked very well together - Knowing each other’s strengths and weaknesses improved productivity - The team had productive discussions regarding each topic