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

Re: Linear time/space rename logic for *inexact* case

From
ACAndy C <andychup@gmail.com>
Date
Oct 22, 2007, 10:09 UTC
Message-ID
<596909b30710220309l1a28e646r9fd47f967dc32574@mail.gmail.com>
In-Reply-To
<596909b30710220240g665054d8hc40bc5d2234ba9e1@mail.gmail.com>
On 10/22/07, Andy C <andychup@gmail.com> wrote:
> So the algorithm is:

I think I can make this a lot clearer than I did, while glossing over some details and the line_threshold parameter.

1) Make a "left index" and a "right index" out of the 2 sets of files,
{ line => [list of docs] }.
2) Remove any lines that appear in more than one doc from the left
index.  Do the same for the right index.  (this corresponds to
line_threshold=1 case)
3) For all lines, if the line appears in *both* the left index and the
right index, increment the count of the (row=doc from left set,
column=doc from right set) entry in the similarity matrix by 1.  The
matrix is represented by a hash of 2-tuples => counts.

After this is done for all lines, then the matrix is sparsely filled with the count of common lines between every pair of files in the 2 sets. The vast majority of cells in the matrix are implicitly 0 and thus consume neither memory nor CPU with the hash table representation of matrix.

4) Then you can use this to compute similarity scores.

Hopefully that is more clear... though I guess it might not be obvious that it works for the problem that git has. I am fairly sure it does, but the demo should allow us to evaluate that.

Andy
Previous: Andy CNext: Jeff King
Message 2 of 5 in “Linear time/space rename logic for *inexact* case”
  1. Andy COct 22, 2007
  2. Andy COct 22, 2007
  3. Jeff KingOct 22, 2007
  4. Andy COct 22, 2007
  5. Linus TorvaldsOct 23, 2007

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.