From 6e39106a240a13000280eb69530e3e9d327e9490 Mon Sep 17 00:00:00 2001 From: Miloslav Ciz Date: Fri, 31 Dec 2021 20:11:00 -0600 Subject: [PATCH] Add exercises --- exercises.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/exercises.md b/exercises.md index 13429a1..f7def3d 100644 --- a/exercises.md +++ b/exercises.md @@ -2,15 +2,18 @@ Here let be listed exercises for the readers of this wiki. You can allow yourself to as many helpers and resources as you find challenging: with each problem you should either find out you know the solution or learn something new while solving it. -1. SOMETHING EASY SHOULD BE HERE SO THAT NUBS ARENT DISCOURAGED BY FIRST QUESTION xD +1. What's the difference between [free software](free_software.md) and [open source](open_source.md)? 2. Write a program in [C](c.md) that computes the value of [pi](pi.md) without using float/double and any libraries except for `stdio.h` and `stdint.h` -- you can only use built-in integer types and those from `stdint.h`. The program must compute pi as accurately as possible (at least 2 decimals) and write the value out as base 10 decimal. +3. Say we have an algorithm that finds all pairs of equal numbers in an array of numbers of length *N* and adds all of these (unordered) pairs to a set *S*. The algorithm is: `for i := 0 to N: for j := 0 to N: if numbers[i] == numbers[j]: add(S,set(i,j))`. How can we optimize the algorithm in terms of its execution speed (i.e. make it perform fewer operations)? How did the asymptotic time complexity ("big O") class change? + ## Solutions A solution to each problem should be listed here -- keep in mind there may exist other solutions that those listed here. **solution 1**: -TODO + +Both movements share very similar rules of licensing and technically free software and open-source are largely the same. However, free software is fundamentally aiming for the creation ethical software -- that which respects its user's freedom -- while open source is a later movement that tries to adapt free software for the business and abandons the pursuit of ethics. **solution 2**: @@ -58,4 +61,20 @@ int main(void) printf("%d.%d\n",pi / DECIMALS,pi % DECIMALS); } } -``` \ No newline at end of file +``` + +**solution 3**: + +In the given algorithm we compare all numbers twice. This can be avoided by not comparing a number to previous numbers in the array (because these have already been compared). Additionally we don't have to compare the same number to itself, a number will always be equal to itself: + +``` +for i := 0 to N: + add(S,i,i) // no need to compare + +for i := 0 to N: + for j := i + 1 to N: + if numbers[i] == numbers[j]: + add(S,set(i,j)) +``` + +While the first algorithm performs N^2 comparisons, the new one only needs N - 1 + N - 2 + N - 3 + ... ~= N * N / 2 = N^2 / 2 comparisons. Even though the new version is always twice as fast, its time complexity class remains the same, that is O(N^2). \ No newline at end of file