Skip to content

Optimize bag_distance by calling bag_difference only once - #15475

Merged
josevalim merged 1 commit into
elixir-lang:mainfrom
preciz:optimization3
Jun 14, 2026
Merged

Optimize bag_distance by calling bag_difference only once #15475
josevalim merged 1 commit into
elixir-lang:mainfrom
preciz:optimization3

Conversation

@preciz

@preciz preciz commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Assisted by: Antigravity CLI : Gemini Flash 3.5

Provides around 25% speedup for short inputs.

String.bag_distance/2 only needs one bag-difference pass.

The old code computed:

diff1 = bag_difference(bag1, bag2)
diff2 = bag_difference(bag2, bag1)
max(diff1, diff2)

For each grapheme count pair {count1, count2}:

max(count1 - count2, 0) - max(count2 - count1, 0) == count1 - count2

Summing over the bags gives:

diff1 - diff2 == length1 - length2
diff2 == diff1 - length1 + length2

So max(diff1, diff2) can be derived from diff1 and the two lengths:

if length1 >= length2, do: diff1, else: diff1 - length1 + length2

This preserves the exact same numerator passed to the final distance calculation while avoiding the second bag_difference/2 traversal.

@josevalim
josevalim merged commit c958e54 into elixir-lang:main Jun 14, 2026
14 of 15 checks passed
@josevalim

Copy link
Copy Markdown
Member

💚 💙 💜 💛 ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants