reading

This project is maintained by claytonjwong

Learn to read ideas instead of just words

Reading Strategies:

The left brain and right brain have different personalities and see the world in different ways. But it is the partnership of this odd couple which allows us to make careful analyses and leaps of intuition.

What is speed reading?

Real reading is something that occurs AFTER you recognize the words. It is what happens when you realize what the writer is saying / thinking when writing the words. You haven’t read anything until you’ve comprehended it.

There is no clock in your mind. Reading speed is very flexible and relative to your thinking speed. If you can comprehend faster, you will be thinking faster, but what you read will always seem to be taking place at “normal” speed in your mind.

Strategy

Goals

Practice

Practice: Focus on How You are Reading

Speed Reading is Speed Comprehending

Why Learn to Speed Read?

3 Mind Tricks

1. Read meaningful group of words at a time

The point is, it has always been possible to read words together as long as the word-groups formed meaningful ideas; reading phrases is just a further extension of this process of thinking and communicating in larger, more complex conceptual ideas.

2. Concentrate on Whole Ideas instead of Words

3. Conceptualize the Meaning of these Ideas

Two Types of Information

Example: “he is running faster than ever”

When conceptualizing while reading, episodic information is faster and easier to imagine then semantic information. It is easier to think of real world things than abstract ideas. Although processing semantic information takes more effort, it is an ability which makes us unique as humans. We can understand how the past affects the present and use this information to prepare for the future.

Consciousness

The prefrontal cortex is the conscious part of the brain which constantly filters out important and irrelevant data. This is also where the brain becomes aware of text as information.

Speed reading requires conscious attention to actively extract ideas from text. The more conscious you are, the more aware you are, the more you are actually living. Attention is the “you” inside your brain. More attention means more you.

Memory

A complex web of connected information.

Concentration and Focus

Concentration is applying more mental resources to your reading, it’s thinking more about what the information means. Increased concentration is like shining a brighter light on a subject. In this way, concentrating on your reading makes the information clearer and easier to see.

Focus is tuning out internal or external distractions in order to narrow your attention to the material at hand. Focus increases your mental efficiency by minimizing the waste of resources. Increased focus is like looking at the subject though a magnifying glass, as it strengthens attention on the information being read and reduces attention to distractions.

Mindset

Your attention is a precious and finite resource. Direct it towards the end-goal of reading: comprehension.

Preparation

Patience

Variable Reading Speed

Four factors to take into account:

  1. information density
    • more complex info takes more time to comprehend
  2. information attachment
    • positive cycle: the more you know about a subject, the more interesting it becomes, the more you’ll want to know more about it
    • developing more interest in a subject also changes your reading from passive to aggressive
      • aggressively seek information as you read
      • don’t passively wait for ideas to occur to you
    • When something seems boring, it’s often not material that’s boring - it’s us!
  3. phrase attachment
    • ideas are phrases of words chained together
      • each phrase attaches to their previous and next phrases to form context and meaning
    • subconscious mental process attaches phrases to one another
  4. flow
    • start reading slowly to gain context, once context is established, faster reading can naturally occur
    • the flow of one phrase to the next in the text
    • easier to read well written, naturally flowing words and phrases * Summary:
    • reading speed varies and this is good
      • increases comprehension
      • keeps our attention

Replace Bad Habits

Final Thoughts

Uniqueness

Your personal meaning of data is created by the selection and significance of attributes you connect to the information through your previous knowledge, experience, and interests.

Syntax VS Semantics

I personally learn best by performing active recall and thought experiments while reading books. Speed reading has helped me to acquire data efficiently and effectively by focusing on the meaning of the content rather than the content itself.

I’d like to share 3 examples of what it means for me to focus on the meaning of content rather than the content itself. The first examples are recursive algorithms written in C++ code. The final example is a physical example of a Rubik’s cube.

Example 1:

Problem Statement

Given the root of a binary tree, find the maximum value V for which there exists different nodes A and B where V = |A.val - B.val| and A is an ancestor of B.

(A node A is an ancestor of B if either: any child of A is equal to B, or any child of A is an ancestor of B.)

Recursive Solution

class Solution {
public:
    int maxAncestorDiff( TreeNode* root, int ans=0 ){
        go( root, ans );
        return ans;
    }
private:
    using MinMax = pair< int,int >;
    MinMax go( TreeNode* root, int& ans ){
        MinMax same{ root->val, root->val };
        if( ! root->left && ! root->right )
            return same;
        auto[ minL, maxL ] = root->left?  go( root->left, ans )  : same;
        auto[ minR, maxR ] = root->right? go( root->right, ans ) : same;
        ans = max({ ans,
                    abs( root->val - minL ),
                    abs( root->val - minR ),
                    abs( root->val - maxL ),
                    abs( root->val - maxR ),
        });
        return{ min({ minL, minR, root->val }), max({ maxL, maxR, root->val }) };
    }
};

When I look at this C++ code, I see a post-order binary tree traversal. At each level of the recurrence, the minimum and maximum values of ancestor nodes are propogated back up the recursive stack and the answer is the maximum of all possible answers deductively found per the problem statement’s overlapping subproblems and optimal substructure.

The semantics of this code may be easier to “see” in the mind’s eye with a preorder traversal of the tree. Rather than propogate min/max values back up the recursive stack, simply track the min/max during the traversal. When the base case is reached, then calculate the maximum difference as the maximum minus the minimum seen in the recursive callstack thus far, and recursively return the solution as the maximum of the left/right sub-tree solutions.

class Solution {
public:
    int maxAncestorDiff(TreeNode* root) {
        return go(root, root->val, root->val);
    }
private:
    int go(TreeNode* root, int mini, int maxi) {
        if (!root)
            return maxi - mini;
        mini = min(mini, root->val);
        maxi = max(maxi, root->val);
        return max(go(root->left, mini, maxi), go(root->right, mini, maxi));
    }
};

Example 2:

Problem Statement

Alice and Bob take turns playing a game, with Alice starting first.

Initially, there is a number N on the chalkboard. On each player’s turn, that player makes a move consisting of:

Also, if a player cannot make a move, they lose the game.

Return True if and only if Alice wins the game, assuming both players play optimally.

Recursive Solutions

namespace TopDown {
    class Solution {
    public:
        bool divisorGame( int N ){
            return go( N );
        }
    private:
        using Memo = unordered_map< int, bool >;
        bool go( int N, Memo&& memo={}, int turn=0 ){
            if( memo.find( N ) != memo.end() )
                return memo[ N ];
            if( N == 1 )
                return memo[ N ] = turn == 1; // alice wins if there are no moves left and it is bob's turn
            for( int i=1; i <= N/2; ++i )
                if( N % i == 0 && go( N-i, move( memo ), turn^1 ) )
                    return memo[ N ] = true;
            return memo[ N ] = false;
        }
    };
}
namespace BottomUp {
    class Solution {
    public:
        using Collection = bitset< 1001 >;
        bool divisorGame( int N, Collection dp={} ){
            dp[ 0 ] = true;
            for( auto i{ 1 }; i <= N; ++i )
                for( auto j{ 1 }; j <= i/2; ++j )
                    if( i % j == 0 && ! dp[ i-j ] ){
                        dp[ i ] = true;
                        break;
                    }
            return dp[ N ];
        }
    };
}

Fundamentally, this is a basic algorithm. Alice wins if and only if there are no moves left and it is Bob’s turn. When I look at this C++ code, I once again see the recurrence formula based on the problem statement. The top-down solution uses recursion with memoization to solve each overlapping subproblem exactly once. The top-down solution is acquired after the base cases are reached and the answer is propagated back up the recursive stack. The bottom-up solution uses the same recurrence formula but in reverse by starting at the base case and building upon the recurrence of overlapping subproblems until the final solution is reached.

Example 3:

I learned to solve a Rubik’s cube by memorizing the “beginners method”, which is basically an algorithmic sequence of deterministic twists-and-turns combined with idempotent loop-invariants used to formulate a bottom-up solution.

Look at the instructions below and find there’s a handful of sequences which can be semantically chunked into a visual right-side of the brain. When first learning these sequences, its serial processing of the left-brain, one twist, followed by the next, and so on. Once the meaning of that sequence is comprehended and embedded as a chunk of data which can be visualized by the right-brain, then and only then does the sequence flow in effortless harmony.

About a year after I started practicing with a Rubik’s cube, I was easily able to solve the 3x3 cube in under 2 minutes using the beginner’s method. At this time I started learning the Fridrich method, which is also known by via the acronyms F2L, OLL, and PLL (ie. first two layers, orientation of the last layer, and permutations of the last layer). It was extremely beneficial to master the beginner’s method before I started learning this method, since the beginner’s method provides a basic intuitive understanding of how each piece moves and the potential adverse affects of those moves upon other pieces.

Algorithms and Speed Reading

In summary, thinking algorithmically requires a similar mental leap of faith necessary for speed reading. And the first step at acquiring these skillsets is to simply try. Try to “see” meaning with the mind’s eye. This was not a fast, immediate process. Instead I slowly acquired this skillset, a little bit at a time each day. I slowly reduced the amount of time necessary to understand the idea / concept behind the code, from weeks to days to hours to minutes to seconds. Now I can observe these “oh yeah, duh!” moments in my mind’s eye more efficiently and effectively.

“Take the first step in faith. You don’t have to see the whole staircase. Just take the first step.” – Dr. Martin Luther King Jr.

The idea of focusing knowledge transfer on understanding ideas, is simple, but not easy. Like all things in life, it takes time and practice. Simply practice to learn a little at a time each day.

Objective Measurements

I started actively trying to speed read via rapid serial visual presentation ( RSVP ). With the RSVP strategy, I was able to read ~400 wpm. Now I’m focusing on reading chunks of data at a time, and I’ve observed my reading speed has decreased significantly, however I believe my rate of reading will increase with practice conceptualizing ideas in word phrases.

100 one-minute speed reading drills

🎯 Read 600 words per minute (60 seconds)

Update 2020-07-17

So I realize I have significant room for improving reading speed and comprehension. I’m able to avoid subvocalizing as I read now, however, subvocalizing has been the only strategy I’ve used to read for the majority of my life. Anyhow, I stopped timing myself a while ago after I’ve identified a significant bottleneck in my comprehension due to limited vocabulary. And about a year ago, I started expanding my vocabulary via flash cards for GRE preparation. That was super boring, so I found an app named Elevate which has been very helpful! I’ve consistently used this app for 2-3 minutes each day, and its a more enjoyable method to learning new words.

Update 2021-05-19

I’ve been using speed reading each morning to read the news, and it has been helpful for Leetcode Contests. I have multiple Q1 solutions AC in less than one-minute. This would be impossible without speed reading (speed comprehension).

Update 2023-07-20

When I first timed my reading speed in 2019, I read around 200 wpm. Now in 2023, I can read ~400 wpm, which is super cool: I’ve doubled my reading speed in about 4 years. Reading is super enjoyable! The upshot: it takes time and effort to change my mind. For me, learning has been an upward sprial and is a self-sustaining life-long project.