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

[PATCH] Document levenshtein.c

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Nov 20, 2008, 12:00 UTC
Message-ID
<alpine.DEB.1.00.0811201255120.30769@pacific.mpi-cbg.de>
In-Reply-To
<7vhc63svsl.fsf@gitster.siamese.dyndns.org>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
	On Wed, 19 Nov 2008, Junio C Hamano wrote:
	> It is a sure sign that the original implementation was too 
	> scantily described, and that the fix was not explained well in the 
	> proposed commit log message (i.e. in what corner cases the original
	> was bad in what way, and how the patch fixes it).
	How about this?
 levenshtein.c |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/levenshtein.c b/levenshtein.c
index db52f2c..298907a 100644
--- a/levenshtein.c
+++ b/levenshtein.c
@@ -1,6 +1,39 @@
 #include "cache.h"
 #include "levenshtein.h"
 
+/*
+ * This function implements the Damerau-Levenshtein algorithm to 
+ * calculate a distance between strings.
+ *
+ * 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 (likewise "j + 1" for 
+ * string2).
+ *
+ * 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, row1[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")
+ */
 int levenshtein(const char *string1, const char *string2,
 		int w, int s, int a, int d)
 {
-- 
1.6.0.2.763.g72663
Previous: Junio C HamanoNext: Samuel Tardieu
Message 7 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.