Humans more easily remember or learn items when they are studied a few times over a long period of time (spaced presentation), rather than studied repeatedly in a short period of time.
— Hermann Ebbinghaus, German Psychologist having introduced the Forgetting Curve
Forgetting is key to learning. Forgetting is what separates what is useful and what is not. Sometimes, we want to make a piece of knowledge stick in memory despite what our memory thinks. Spaced Repetition is an effective solution to this problem and Anki is the most popular OSS tool to help you.
- What is the history of SRS algorithms.
- How Anki SRS algorithm is implemented.
- How Anki SRS algorithm differs from other known implementations.
- How Anki SRS algorithm can be improved.
The Anki source code is published under AGPL v3. The code presented in this article has been slightly adapted for learning and readability purposes.
I assume that you have used Anki before. All code examples use the Python language, mainly because Anki was implemented only in Python until recently, and also because it’s a great language for novice programmers. You don’t need to have a solid understanding of the language to follow the article as the code uses basic Python syntax.
SRS Primer
The role of any Spaced Repetition System (SRS) algorithm is to determine what the user should review now, or say differently when must happen the next review for every remembered item. The goal of any implementation is to counteract the effect of the forgetting curve:
As soon as we learn or review a piece of knowledge, the decay begins. SRS algorithms need to determine the optimal interval between two reviews to ensure we haven’t completely forgotten it (memory retention = 0%) while trying to limit as much as possible the number of reviews. In practice, most algorithms use 10% for the forgetting index (= 90% of items are remembered correctly) so that we don’t have too many items to review again while keeping the number of reviews close to optimal.
The details of the different algorithms differ greatly between systems. We will start by reviewing the most popular ones in history before introducing Anki’s solution.
The Leitner System (1970-)
If Hermann Ebbinghaus is credited for the initial research behind SRS, the Leiter System is often quoted as the first algorithm. This system uses a physical box as depicted by the following illustration:
Here is a small Python program implementing the logic behind the original Leitner system:
The original Leitner system cannot really be considered a spaced repetition system. There is no concept of an (optimum) interval. The system simply prioritizes which items to review based on the available physical space in each partition.
An alternative method using three boxes where incorrect answers are only moved back to the previous box is often privileged:
Here is a program implementing this new logic:
The modern Leitner system assigns intervals to the different boxes. Variants exist with more boxes but for this system to be considered a spaced repetition system, we would need a lot more boxes to have longer and longer intervals between reviews.
SM-0 (1985)
Algorithms are precise instructions to carry out. As we have seen with the Leitner system, algorithms don’t have to be executed on computers at all. We can manually perform what a computer does, except we will need a lot more time. The first version of the SuperMemo Algorithm was also thought to be executed manually.
The SM-0 algorithm (aka the paper-and-pencil SuperMemo method) was published in 1985 and relies on paper books filled with tables.
Although the algorithm was designed to be executed manually, we can still capture the logic using code:
- 1
- The grade of the answer does not influence the next interval. Difficult items are reviewed again the same day but the next intervals are fixed and determined with a factor 1.7 when creating the page.
The SM-0 algorithm can be challenging in practice for different reasons:
- All items on a given page are reviewed at the same time. For hard-to-remember items (items that require more than 3 reviews on a given day to be recalled), SM-0 recommends duplicating them on a new page in your book. These items will be reviewed more frequently, and some will maybe be duplicated again if still too hard to remember.
- The intervals are determined using an estimation of the average case (x1.7) but the ideal intervals depend on the complexity and your familiarity with the subject. You probably need shorter intervals for science subjects like Mathematics for example.
- Last but not least, executing the algorithm manually works, but is far from being a smooth learning experience…
Enter the computer.
SM-2 (1987)
Unlike physical systems where cards are grouped in the same box/partition/page and are reviewed collectively, digital systems consider each item separately. For example, the SuperMemo algorithm called SM-2 assigns a specific level of difficulty to every card and determines the appropriate intervals between repetitions using this specific value (called the E-Factor).
Now, the same logic but implemented as code:
- 1
- The E-Factor never goes down lower than 1.3. SuperMemo found out that items having lower E-Factors were repeated annoyingly often when the root cause was usually their formulation and not the review process. We will see how Anki manages such cards later. These items must often be reformulated to conform to the minimum information principle.
- 2
- The E-Factor is always initialized to the same difficulty value. It will decrease for bad grades and increase for good grades.
- 3
- Unlike SM-0, the grades (= item difficulty) influence the factor used to determine the next interval.
- 4
- Like SM-0, difficult items are reviewed again the same day.
The SM-2 algorithm, while relatively basic, remains popular even today as you will discover in the rest of this article.
Anki Algorithm
From Wikipedia:
“The SM-2 algorithm, created for SuperMemo in the late 1980s, forms the basis of the spaced repetition methods employed in the program. Anki’s implementation of the algorithm has been modified to allow priorities on cards and to show flashcards in order of their urgency.
— Wikipedia
Anki source code includes different versions of its SRS algorithm (called Scheduler). All got inspiration from SM-2. The V2 is in use since 2018 even if the V3 is looming. For this article, we can ignore the details between these versions. Check the source code on GitHub if you are interested in the differences between the V1, V2, or V3.
We will analyze the V2.1 scheduler as it is the version I’m familiar with. We will use the version 2.10.0 of Anki Desktop to ignore recent refactorings (the rewrite of backend code in Rust, the introduction of Protocol Buffer messages, the factorization of common code among scheduler versions using inheritance, etc.). This will help us keep the code easy to grasp.
Here is a recall of Anki terminology:
As outlined by the schema, we will focus on the core abstractions (Collection, Note, Card) that affects how the SRS algorithm works. In addition, cards in Anki are scheduled differently according to their state:
Here is an overview of the Anki algorithm:
The use of separate new/review queues tries to remediate a common complaint with the standard SM-2 algorithm is that repeated failings of a card cause the card to get stuck in “low interval hell” (also known as “ease hell”). In Anki, the initial acquisition process does not influence the ease factor.
Part 1: Settings
Unlike previous systems, Anki is highly configurable. Not all settings affect the SRS algorithm. Here are the default setting values used by Anki that will be used:
- 1
If there is no more card to review now but the next card in learning is in less than
collapseTime
seconds, show it now.collapseTime
: Tells Anki how to behave when there is nothing left to study in the current deck but cards in learning. + Setting:Preferences
>Basic
>Learn ahead limit
* 60 (default:20
minutes)
- 2
The settings differ based on the queue where a card belongs. For example, when learning (
new
) cards, the delay is increased by graduating steps whereas the delay is multiplied by a given factor for review (rev
) cards. The meaning of individual settings will become clearer when we will detail the logic.new.delays
: The list of successive delays between the learning steps of the new cards. The first delay will be used when you press theAgain
button on a new card. TheGood
button will advance to the next step. Once all steps have been passed, the card will become a review card and will appear on a different day. + Setting:Preferences
>New Cards
>Learning steps
(Default:1m 10m
)new.ints
: The list of delays according to the button pressed while leaving the learning mode after pressing “Good” or “Easy.” + Setting:Preferences
>New Cards
>Graduating interval
/Easy interval
(Default:1
and4
)new.initialFactor
: The ease multiplier new cards start with. By default, theGood
button on a newly-learned card will delay the next review by 2.5x the previous delay. + Setting:Preferences
>Advanced
>Starting ease
(Default:2.50
),new.perDay
: The maximum number of new cards to introduce in a day, if new cards are available. + Setting:Preferences
>Daily Limits
>New cards/day
(Default:20
)rev.perDay
: The maximum number of review cards to show in a day, if cards are ready for review. + Setting:Preferences
>Daily Limits
>Maximum reviews/day
(Default:50
)rev.ease4
: An extra multiplier that is applied to a review card’s interval when you rate itEasy
. + Setting:Preferences
>Advanced
>Easy bonus
(Default:1.30
)rev.maxIvl
: The maximum number of days a review card will wait. When reviews have reached the limit,Hard
,Good
andEasy
will all give the same delay. + Setting:Preferences
>Advanced
>Maximum interval
(Default:36500
)rev.hardFactor
: The multiplier applied to a review interval when answeringHard
. + Setting:Preferences
>Advanced
>Hard interval
(Default:1.20
)
- 3
When you forget a review card, it is said to have “lapsed”, and the card must be relearnt. The default behavior for lapsed reviews is to reset the interval (
minInt
) to 1 (i.e. make it due tomorrow) and put it in the learning queue for a refresher (delays
) in 10 minutes.lapse.delays
: The list of successive delays between the learning steps of lapsed cards. By default, pressing theAgain
button on a review card will show it again 10 minutes later. + Setting:Preferences
>Lapses
>Relearning steps
(Default:10m
)lapse.minInt
: The minimum interval given to a review card after answeringAgain
. + Setting:Preferences
>Lapses
>Minimum interval
(Default:1
)lapse.mult
: The multiplier applied to a review interval when answeringAgain
. + Setting:Preferences
>Advanced
>New interval
(Default:0
)lapse.leechFails
: The number of timesAgain
needs to be pressed on a review card before it is marked as a leech. + Setting:Preferences
>Lapses
> Leech threshold (Default:8
)
Part 2: Model
Let’s begin with the model. Anki stores cards in an SQLite database. In this tutorial, we will mimic the same model but we will store the cards directly in memory inside the collection object. We will also ignore decks completely as they mostly allow reviewing different cards using different settings or at different times but don’t profoundly change how Anki works.
- 1
- The
Scheduler
implementation will be the main topic of the remaining of this section. - 2
- The identifiers are initialized using a helper function
intId()
which uses the current time and ensures two successive calls return different values. Here is the definition:
The Scheduler
is the largest class that will be covered. A scheduler in Anki is an object supporting two methods:
getCard()
: Returns the next card to reviewanswerCard(card, ease)
: Updates the card after an answer (ease
:0
for “Again”,1
for “Hard”,2
for “Good”, and3
for “Easy”)
- 1
The attribute
today
represents the number of days since the collection creation. It is used when searching for review cards where the attributedue
represents the number of days relative to it. The value is initialized like this:- 2
The attribute
dayCutoff
represents the timestamp of the beginning of the next day. Anki allows customizing at which hour a day ends. Here, we simply use midnight:- 3
The attribute
_lrnCutoff
is related to the settingcollapseTime
(also called the learn ahead limit). The method_updateLrnCutoff()
is used to initialize it and update it:
Part 3: Queues Management
The method reset()
present in the last line of the Scheduler
’s constructor initializes the queues managed by Anki:
- 1
- By default, the queues are empty. Anki defers their filling until a card is retrieved.
- 2
- The method
_updateNewCardRatio()
determines the frequency for new cards (only when new cards are spread among other cards). For example, if there are 50 review cards and 10 new cards, the ratio will be 5 so that a new card is returned after every 5 review cards. The attributereps
present inScheduler
keeps the current number of reviewed cards for the current study session and will be useful when using the ratio_newCardModulus
to determine if the next card must be a new card or a review card. - 3
- Anki searches for all cards in the queue
0
(=new
) and sorts them by their due date before returning the first N cards based on the current daily limit. - 4
- Anki searches for all cards in the queue
1
(=lrn
) that are due and sorts them by timestamp as the id is initialized from the creation timestamp - 5
- Anki searches for all cards in the queue
2
(=rev
) that are due and sorts them by the due date before returning the first N shuffled cards based on the current daily limit.
The logic to initialize the queues is ready but will be executed in the next step when retrieving a card to study.
Part 4: Card Retrieving
The main method is the method getCard()
.
This method delegates to _getCard()
and simply increases the counter of studied cards except when the study session is completed.
- 1
By default, Anki shows cards in a well-defined order:
- New cards when
newSpread == NEW_CARDS_FIRST
- Learning cards that are due
- New cards when
newSpread == NEW_CARDS_DISTRIBUTE
(default) - Review cards
- New cards when
newSpread == NEW_CARDS_LAST
- New cards when
- 2
The methods
_fillXXX()
returnTrue
when a queue is not empty, in which case, we simply have to pop an element from it.
The queues are now initialized when retrieving the first card in each of them. This works great for the current session but when a new day begins, Anki must reinitialize the queues because other cards may have reached their due date.
- 1
- The method
_updateCutoff()
is called every time the queues are reset (= once a day). When this happens, it means a new day began and therefore the day limit must be refreshed too. - 2
- The method
_checkDay()
is called every time we retrieve a new card to study. This way, if we have passed the current day, the queue will be reset before returning the next card.
Part 5: Card Updating
Now that we have a method to empty the list of cards to study, we will turn our attention to the core part of the SRS algorithm. Every time we study a card, the card must be rescheduled. In short, we need to update the attribute due
(= the next review date) of the card but the logic varies according to its current state (ex: the current queue, ease factor, and interval).
We will detail each case separately.
Part 5.1: Answering New Cards
- 1
- Anki simply updates the attribute
queue
to move a card to a different queue. When the destination queue will be reset (ex: for tomorrow’s session), the card will be automatically inserted into it. - 2
- The attribute
type
is similar to the attributequeue
(they share the same values0
,1
, and2
). In practice, the attributesqueue
andtype
may differ for example after a lapse. When pressing “Again,” on a review card, the card will be moved back to the learning back (queue = 1
) but the type will be unchanged (type = 2
) to remember the card was previously a review card. This will be useful when graduating the card back to the review queue after relearning. - 3
- The attribute
left
is particular. The numeric format keeps two pieces of information: how many times the card will be reviewed today, and how many steps before graduation. The methods_startingLeft
and_leftToday
implement this logic. You can safely ignore the details.
So, when answering a new card, the card is automatically promoted to the learning queue.
Part 5.2: Answering Learning Cards
- 1
- The settings differ according to if the card comes from the review or new queue. For example, the steps are different after a lapse than when learning a new card for the first time.
We will detail what happens depending on which button was pressed when answering the card.
After pressing “Again”…
The card is moved back to the first step:
- 1
- We restore the attribute
left
as if the card were new. - 2
- We process lapses differently. By default, we reset the attribute
ivl
to1
(next review in one day). - 3
- The card due date is determined by adding the next step to the current date. The card remains in the learning queue (
1
). - 4
- The method
_delayForGrade()
is a helper method to get the next step interval. The method extracts the number of remaining steps from the attributeleft
(Ex:1002
=> 2 remaining steps) and uses the settingdelay
to find the matching delay (Ex:1m 10m 1d
=> next study in10m
).
After pressing “Hard”…
The current card step is repeated. This means the attribute left
is unchanged. We still have the same number of remaining steps before graduation. The difference is that the card will be rescheduled in a delay slightly longer than the previous one. We average the last and next delays (Ex: 1m 10m 20m
and we are at the step 2 => repeat in 15m
).
- 1
- We reuse the method
_rescheduleLrnCard()
introduced just before to update the card’s due date.
After pressing “Good”…
The decision depends on if there are remaining steps or not:
Case 1: If we have finished the last step, the card is graduated to the learning queue:
- 1
- When a lapse is graduated, we add the previous interval to the current date to determine the due date.
- 2
- When a new card is graduated, we initialize the two key attributes relative to the SRS algorithm: the ease factor and the interval. These fields will be necessary to determine the next due date for review cards.
- 3
- When graduating a new card, the initial interval will be different if we are completed all steps (“Good”) or if we have pressed (“Easy”) to immediately graduate the card (1 vs 4 days by default).
Case 2: If there are remaining steps:
- 1
- The attribute
left
is updated to decrement the number of remaining steps and to recalculate the number of studies until the next day.
After pressing “Easy”…
The card is graduated to the review queue similarly to when we complete every step. The only exception is that the initial interval will be larger as explained in the previous point.
Part 5.3: Answering Review Cards
After pressing “Again”…
- 1
- The number of lapses for this card is increased.
- 2
- The ease factor is reduced by 0.2 (but no lower than 1.3 as recommended by SM-2).
- 3
- If the number of lapses reaches the value of the setting
leechFails
, the card is marked as a leech. A tag is added to the note and the card is moved to the queue-1
(= suspended). The card will therefore be ignored when filling the different queue as no method_fillXXX()
considers cards in the queue-1
.
After pressing “Hard,” “Good,” “Easy”…
The card will be rescheduled in an “ideal” number of days. In practice, most cards reside in the learning queue, and the “Again” button is pressed rarely. This means the core logic of the Anki SRS algorithm is determined by the following methods.
- 1
- The attribute
ivl
determines the next due date (we add it to the current date to determine the value of the attributedue
). - 2
- The ease factor is changed by removing 0.15 for “Hard” cards or by adding 0.15 for “Easy” cards. The ease factor is left unchanged for “Good” cards. Only their intervals will be changed to increase the period between studies.
- 3
The method
_nextRevIvl()
determine the next interval:- “Hard”: the current interval is multiplied by the value of the hard interval (1.2 by default).
- ”Good”: the current interval is multiplied by the current ease (+ a bonus if the card was late).
- ”Easy”: the current interval is multiplied by the current ease times the easy bonus (1.3 by default) (+ a bonus if the card was late).
We are done 🎉. The complete code is available in the companion GitHub repository. A more complete annotated version is also available in the same repository including two additional features described next.
Bonus: Day Boundaries
Anki treats small steps and steps that cross a day boundary differently. With small steps, the cards are shown as soon as the delay has passed, in preference to other due cards in review. This is done so that you can answer the card as closely to the calculated delay as possible. In contrast, if the interval crosses a day boundary, it is automatically converted to days.
In the implementation, the code splits the learning queue into two distinct queues: sub-day learning and day learning.
- 1
The previous queue is split into two queues:
_lrnQueue
(queue == 1
) = sub-day learning queue_lrnDayQueue
(queue == 3
) = day learning queue
- 2
- Learning cards are rescheduled in the sub-day queue
1
when the next review is planned before the end of the day review session. The due date is the number of seconds until the next review. Otherwise, the card is rescheduled in the day learning queue3
and the delay is the number of days until the next review. - 3
- Sub-day learning cards are prioritized first to be sure to review them as close as their delay in seconds. Day learning cards are reviewed last since their delay in days tolerates more flexibility (reviewing them the next day is not as bad as for sub-day learning cards).
Bonus: Fuzzing
When you select an ease button on a review card, Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day.
Here is the code:
- 1
The function
_fuzzedIvl()
is only called for intervals greater than one day. For sub-day learning cards introduced in the previous point, fuzzing is also applied up to 5 minutes:- 2
- The fuzz factor is reduced but the fuzzing increases as intervals become larger.
A Better Anki SRS Algorithm?
The SM-2 algorithm, on which Anki is based, was released in 1987 in SuperMemo 1.0. It was revised several times since:
Each version iterates over deficiencies of the previous one. You can find a short summary of the main changes or a (very) long summary of the history of SuperMemo. The short version is probably too terse to understand the improvements, and the long version is probably too detailed to understand everything. (It took me more than 5 hours to read it but it was worth the reading!)
SuperMemo 2 was great. Its simple algorithm has survived in various mutations to this day in popular apps such as Anki or Mnemosyne. However, the algorithm was dumb in the sense that there was no way of modifying the function of optimum intervals. The findings of 1985 were set in stone. Memory complexity and stability increase were expressed by the same single number: E-factor. It is a bit like using a single lever in a bike to change gears and the direction of driving.
— Piotr Wozniak, Original author of SuperMemo
From a high-level perspective, the main motivation for every version is to determine better optimal intervals (= the ideal periods between reviews of a single card) so that the forgetting index is close to 10% (= recall of 90% is acceptable).
From a low-level perspective, several approaches were experimented by SuperMemo. The first major version (SM-2) introduced the ease factor to capture the difficulty of an item (the lower the ease factor = the more difficult = the shorter the interval). The ease factor was multiplied by the previous interval to determine the next interval.
The successive iterations become more and more elaborate by adding new dimensions, in particular, what is called by SuperMemo the two-component model: stability and retrievability (in complement to difficulty represented by the E-Factor). Stability tells you how long a piece of knowledge can last in memory. Retrievability tells you how easy it is to recall a piece of knowledge. These notions may appear similar but they aren’t. “If you take two memories right after a review, one with a short optimum interval, and the other with a long optimum interval, the memory status of the two must differ,” declares Piotr Wozniak, “Both can be recalled perfectly (maximum retrievability) and they also need to differ in how long they can last in memory (different stability).”
What follows is an example of the optimum factors (OF) matrix used in SM-4/SM-5. The matrix ignores the retrievability dimension, which was introduced in SM-6.
A two-dimensional matrix is easier to represent but the logic is similar with more dimensions. Initially, the matrix was defined based on prior measurements in SuperMemo. After each answer, the grade tells SuperMemo how well the interval “performed.” If the grade is low, the interval was too long. If the grade is high, the interval was too short. The entry in the matrix is updated in consequence and matrix smoothing is applied (= if a value increases, a smaller increase can be beneficial to neighbors too).
The two-component model of long-term memory still represents the foundation of SuperMemo since its introduction in SM-4 in 1989. Piotr Wozniak was pessimistic about a better, faster, and more effective algorithm as soon as 1994. The versions of the algorithm that appeared after that didn’t introduce a breakthrough improvement like SuperMemo did when it abandoned the SM-2 algorithm in 1989, the same algorithm that keeps popping up in new applications.
Many applications relying on SRS appeared in popular app stores more or less recently: Quizlet, Memrise, Duolingo, LingoDeer, Brainscape, Lingvist, Chegg, RemNote, Mochi, Memcode, …
-
Mochi’s algorithm is very simple. The card interval is doubled after each correct answer, and cut in half otherwise.
-
Memrise’s algorithm is similar to Mochi’s. The card interval increases using the following steps: 4 hours, 12 hours, 24 hours, 6 days, 12 days, 48 days, 96 days, and 6 months. Any wrong answer moves back the card to the first interval.
-
Quizlet’s algorithm has known several iterations. The first implementation simply repeats all the questions you got wrong. The second implementation is similar to Anki where the card interval increases by approximately 2.2 and wrong answers reset the interval to one day. The next implementation relies on machine learning and uses the millions of answers to determine the recall probability, which is the chance you answer correctly. This allows, for example, to reduce the interval for words with irregular spellings when learning a foreign language.
-
Duolingo’s algorithm is similar to Quizlet. Duolingo has millions of students who generate billions of statistics about language learning every day. Like Quizlet, Duolingo uses machine learning to predict how likely you are to remember any given word at any time. This is represented by the strength meter (still strong, pretty good, time to practice, overdue) below every lesson.
-
RemNote’s algorithm is customizable like Anki and most settings will look familiar to Anki users, especially after following this tutorial.
-
Memcode’s algorithm also uses SM-2.
In my opinion, Anki is not perfect but there is no need to focus too much on optimizing it:
- Adding more dimensions? What if you review inadvertently a card, for example when explaining the idea to a coworker. No algorithm can exploit this and postpone the next review. No algorithm will ever be perfect.
- Using machine learning? Applying the lessons from other learners is great for common datasets. For example, if most French users have trouble learning a particular English word, chances are future French users will need shorter intervals too. But what about custom-edited cards about subjects such as science, management, and parenting. What about your interest in any of these subjects. We remember more easily what passionates us. Machine learning excels when there are patterns but learning is profoundly a personal, unique experience.
Therefore, I think we should focus more on optimizing our practices rather than the tools. Here are two key practices:
-
Devote time to understand. Learning is a 3-steps process: encoding, storage, and retrieval. Anki helps to store information for a longer period by reviewing it (“use it or lose it”). But Anki is dependent on how good the encoding happened. You cannot learn something you haven’t understood first. Therefore, you must devote (a lot of) time writing your own flashcards. A poor encoding process will make the best SRS algorithm useless.
-
Devote time to learn. Trying Anki is easy. Sticking to it is hard. Many users quickly abandon Anki probably because its benefits can only be visible after several years of making it a habit. And everyone knows changing habits is hard, otherwise Atomic Habits would not be the #1 best-selling book on Amazon last year. A lack of motivation will make the best SRS algorithm useless.
One last important thing,
Learning is one of the most enjoyable things in the world.
— Piotr Wozniak
- A Spaced Repetition System (SRS) counteracts the effect of the forgetting curve. Memory decay is inevitable but can be influenced.
- SRS systems can be implemented with or without a computer. The Leitner system remains popular.
- SRS systems often target a retention close to 90% (= 10% of cards are wrongly answered).
- SuperMemo introduced the first SRS algorithm running on a computer (SM-2).
- SM-2 continues to be used by most applications including Anki, despite having been abandoned in SuperMemo three decades ago.
- Anki makes the SM-2 highly configurable and uses different queues to manage cards differently based on if they are new, in learning, or simply in review.
- Most algorithms use the item difficulty (known as the ease factor) to determine optimal intervals. SuperMemo goes well beyond and also uses memory stability and memory retrievability.
- Recent SRS applications rely on machine learning to exploit the specificities of the learning materials (ex: English words with irregular syntax) and to use the information collected from their massive dataset of users to tune their algorithm. SuperMemo never chose this approach.
- The perfect SRS algorithm will never exist. No algorithm can determine if you are passionate about a subject, or if you review by chance the content of a card at work during a discussion with a coworker (in which case an “ideal” algorithm must postpone the next review).
- Creating great flashcards and making reviewing them a habit have probably a far bigger impact than any improvement in the SRS algorithm you use.
Additional Links
- The Anki Website explains succinctly the main differences between its algorithm and SM-2.
- Anki Database Structure: The most up-to-date guide to the Anki internal database schema, which was more than useful during the writing of this article.
- The Ease Factor Problem: Interesting insight about the impact of changing the ease factor after a lapse.
- A great video to introduce most of the notions covered in the Anki section.
- Last but not least, the true history of spaced repetition: An extensive coverage of the subject by Piotr Wozniak. A reference.