git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2] Document levenshtein.c

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Nov 20, 2008, 13:27 UTC
Message-ID
<alpine.DEB.1.00.0811201426100.30769@pacific.mpi-cbg.de>
In-Reply-To
<2008-11-20-13-00-31+trackit+sam@rfc1149.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
	On Thu, 20 Nov 2008, Samuel Tardieu wrote:
	> * Johannes Schindelin <Johannes.Schindelin@gmx.de> [2008-11-20 
	>   13:00:35 +0100]
	> 
	> | 	How about this?
	> 
	> I think it still lacks a note about what "deletion" and 
	> "insertion" means (is that a character deleted from string1 to obtain 
	> string2 or the reverse?). In most implementation, you use the same
	> cost for insertion and deletion so the function is symetrical, but
	> this implementation is more powerful.
	Second paragraph and last sentence were added.
 levenshtein.c |   37 +++++++++++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/levenshtein.c b/levenshtein.c
index db52f2c..ebef34b 100644
--- a/levenshtein.c
+++ b/levenshtein.c
@@ -1,6 +1,43 @@
 #include "cache.h"
 #include "levenshtein.h"
 
+/*
+ * This function implements the Damerau-Levenshtein algorithm to
+ * calculate a distance between strings.
+ *
+ * Basically, it says how many letters need to be swapped, substituted,
+ * deleted from, or added to string1, at least, to get string2.
+ *
+ * The idea is to build a distance matrix for the substrings of both
+ * strings.  To avoid a large space complexity, only the last three rows
+ * are kept in memory (if swaps had the same or higher cost as one deletion
+ * plus one insertion, only two rows would be needed).
+ *
+ * At any stage, "i + 1" denotes the length of the current substring of
+ * string1 that the distance is calculated for.
+ *
+ * row2 holds the current row, row1 the previous row (i.e. for the substring
+ * of string1 of length "i"), and row0 the row before that.
+ *
+ * In other words, at the start of the big loop, row2[j + 1] contains the
+ * Damerau-Levenshtein distance between the substring of string1 of length
+ * "i" and the substring of string2 of length "j + 1".
+ *
+ * All the big loop does is determine the partial minimum-cost paths.
+ *
+ * It does so by calculating the costs of the path ending in characters
+ * i (in string1) and j (in string2), respectively, given that the last
+ * operation is a substition, a swap, a deletion, or an insertion.
+ *
+ * This implementation allows the costs to be weighted:
+ *
+ * - w (as in "sWap")
+ * - s (as in "Substition")
+ * - a (for insertion, AKA "Add")
+ * - d (as in "Deletion")
+ *
+ * Note that this algorithm calculates a distance _iff_ d == a.
+ */
 int levenshtein(const char *string1, const char *string2,
 		int w, int s, int a, int d)
 {
-- 
1.6.0.2.763.g72663
Previous: Samuel TardieuNext: Jon Loeliger
Message 9 of 12 in “Fix deletion of last character in levenshtein distance”
  1. Fix deletion of last character in levenshtein distanceSamuel Tardieu, Nov 18, 2008
  2. Matthieu MoyNov 18, 2008
  3. Johannes SchindelinNov 19, 2008
  4. Samuel TardieuNov 19, 2008
  5. Johannes SchindelinNov 19, 2008
  6. Junio C HamanoNov 19, 2008
  7. Document levenshtein.cJohannes Schindelin, Nov 20, 2008
  8. Samuel TardieuNov 20, 2008
  9. Document levenshtein.cJohannes Schindelin, Nov 20, 2008
  10. Jon LoeligerNov 20, 2008
  11. Sverre RabbelierNov 20, 2008
  12. Johannes SchindelinNov 20, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.