3.1 KiB
Exercises
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.
- What's the difference between free software and open source?
- 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,pair(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? - In computer graphics, what is the difference between ray casting, ray tracing and path tracing?
Solutions
A solution to each problem should be listed here -- keep in mind there may exist other solutions that those listed here.
solution 1:
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:
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,pair(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).
solution 3:
They are all image-order methods of 3D rendering. Ray casting casts a single ray for each screen pixel and determines the pixel color from a single hit of the ray. Ray tracing is a recursive form of ray casting -- it recursively spawns secondary rays from the first hit to more accurately determine the pixel color, allowing for effects such as shadows, reflections or refractions. Path tracing is a method also based on casting rays, but except for the primary rays the rays are cast at random (i.e. it is a Monte Carlo method) to approximately solve the rendering equation, progressively computing a more accurate version of the image (i.e. the image contains significant noise at the beginning which lowers with more iterations performed) -- this allows computing global illumination, i.e. a very realistic lighting that the two previous methods can't achieve.