The journey continues
I’ve started my journey in algorithms and data structures more or less three months ago. I am not there, where I wish I’d be, however I am satisfied with the process. My goal is to learn, what I knew before and what I know is incomparable, this keep me going.
In the beginning, I grouped the following subjects together for study
- Basic Data Structures
- Queues, Stacks
- Arrays, Linked lists
- Symbol tables; Hash table
- Sorting
- Elementary sorts (Selection, Insertion, Bubble)
- Shellsort, Heapsort, Mergesort, Quicksort
- Searching
- Binary Search Trees
- Balanced Search Trees (Red-black BST, B-Tree, AVL Tree)
- Graphs
- Undirected Graphs (Depth-first search, Breadth-first search, etc)
- Directed Graphs (Depth-first search, Topological sort, etc)
- Minimum Spanning Trees (Greedy algorithm, Edge-Weighted graph)
- Shortest Paths(Edge-Weighted digraph, Dijkstra’s algorithm, Bellman-Ford algorithm)
- Strings
- LSD string sort, MSD string sort
- 3-way string quicksort
- Tries (R-way tries, Tenary search tries)
- Substring search (Knuth-Morris-Pratt algorithm, Boyer-Moore algorithm)
- Regular Expressions
- Data compression
- Bit Manipulation
I was aiming to finish the listed subjects in 6 months. I knew it was ambitious, but still committed doing it and so far my typical week looked like this:
- 3 times in a workweek:
- Studying theory (reading, watching videos on the subject, discussing, etc) - 2 hours in the evening (after work).
- Coding in IDE - 1 hour a day, transforming theoretical knowledge into practical.
- During the weekend
- No theory - practicing learned subjects on a whiteboard.
At this moment when I am writing this, I am close to the half of the journey (I’ve recently finished Binary Search Trees). As mentioned earlier, it is not very satisfying, so I decided to review the path I went through and find ways to be more productive and boost up the speed.
I could come up with the following major factors which I’d like to change/improve.
- I’m less productive in the evenings.
- I’m jumping to the new subject too quickly.
- I’m not solving enough problems before jumping to the new subject.
- I don’t keep proper notes during the progress; as a result spaced-repetition is frustrating and time consuming.
- I worry too much when I face problem I can’t solve; sometimes this results days of frustration and procrastination.
- I am not having proper rest; results to constant tiredness.
The upcoming subjects are much harder (you can’t compare insertion sort complexity with DFS in undirected graphs), so I hope the following changes/plan will make me better on what I am doing.
Changing the schedule
I have two choices on allocating time for studies; either I study before going to work, or in the evenings after work. I’ve been doing so far the second one, in the evenings, after work. Several factors are making me less productive here, so I am going to try first choice. Unfortunately I’m not a morning guy either, so it is a big challenge. I’ve to be at work latest at 10AM, to have 3 hours buffer for learning, I need to wake up at 6AM. I am really looking forward to try this out, probably I will start to wake up 30 mins early every day and see how it works.
Spending enough and necessary time on one subject
I used to plan whole week beforehand, with deadlines. For example; I have 9 hours next week and I have to finish X subject. I am going to stop doing this, no deadlines anymore. I know the upcoming subject and won’t switch to new one until I feel comfortable with it. In addition, I will spend enough time on solving real problems. Quality over quantity.
Effective spaced repetitions
Now I make notes at the end of each subject. This gives me a chance to recall what I have learned. It is actually very effective, so I will keep doing it, however not at the end of subject, but at the end of ‘whatever I learned new’ today. In addition, I am going to switch my whiteboard sessions to train previous subject, not current one. Let’s see how this will work out.
Tackling frustration
Although I enjoy self studies, however sometimes I’m having hard time when facing a problem that I have no idea how to solve. Of course, you can always search for a solution, but this is not helpful, it’s not the best feeling when someone just ‘serves’ you a solution. There are thousands like me in the world, there are experts and novices taking the same journey; I am going to be more proactive in community, sharing and giving, also seeking for a help from others. I’m sure that the feeling of being part of something is very motivating, so this will help me to tackle frustration.
Taking rest and doing workout
Without good sleep, proper rest, body and brain become very tired quickly. It’s not even about studies, the whole life becomes dark and negative. Rest, workout, physical activity is very important. Although I have been doing workouts, but often laziness was the king here. I’ve already put strict schedule in my calender; 3 times a week 1 hour of workout (I do it at home, thanks to Fitnessblender).
I am looking forward to see how those changes will affect my life and will be happy to share it here.
P.S. Although it’s a cliché, but I’ve to say this. I’m grateful to have a wife (as my BFF) who keeps supporting me, without who this post wouldn’t be here at all.