In the last post I described how I sometimes describe a problem with a matrix, and then look at the matrix transpose to see if it gives me new ideas. Another technique I use is to look for a factoring.
In algebra, factoring transforms a polynomial like 5x² + 8x - 21 into (x + 3)·(5x - 7). To solve 5x² + 8x - 21 = 0, we can first factor into (x + 3)·(5x - 7) = 0. Then we say that x + 3 = 0 or 5x - 7 = 0. Factoring turns a problem into several easier problems.
x | 3 | |
---|---|---|
5x | 5x² | 15x |
-7 | -7x | -21 |
Let's look at an example: I have six classes, File
, EncryptedFile
, GzipFile
, EncryptedGzipFile
, BzipFile
, EncryptedBzipFile
. I can factor these into a matrix:
Uncompressed | Gzip | Bzip | |
---|---|---|---|
Unencrypted | File | Gzip(File) | Bzip(File) |
Encrypted | Encrypt(File) | Encrypt(Gzip(File)) | Encrypt(Bzip(File)) |
Using the Decorator pattern (or mixins), I've turned six different types of files into four components: plain, gzip, bzip, encrypt. This doesn't seem like much savings, but if I add more variations, the savings will add up. Factoring turns O(M*N) components into O(M+N) components.
Another example comes up when people ask me things like “how do you write linear interpolation in C#?” There are a lot of potential tutorials I could write:
C++ | Python | Java | C# | Javascript | Rust | Idris | … | |
---|---|---|---|---|---|---|---|---|
Interpolation | ||||||||
Neighbors | ||||||||
Pathfinding | ||||||||
Distances | ||||||||
River maps | ||||||||
Isometric | ||||||||
Voronoi | ||||||||
Transforms | ||||||||
… |
If there are M topics and N languages, I could write M*N tutorials. However, that's a lot of work. Instead, I write a tutorial about interpolation, someone else writes a tutorial about C#, and then the reader combines knowledge of C# with knowledge about interpolation to write the C# version of interpolation.
Like transpose, factoring only helps sometimes, but when it applies, it can be quite useful.
Post a Comment