Levenshteinafstand in Excel – stack overflow

Dankzij smirkingman voor de mooie code paal. Hier is een geoptimaliseerde versie.

1) Gebruik Asc (Mid $ (s1, i, 1) in plaats. Numerieke vergelijking is over het algemeen sneller dan tekst.

2) Gebruik Mid $ istead van Mid omdat de later is de variant ver. en het toevoegen van $ is snaar ver.

3) Gebruik applicatie-functie voor min. (Persoonlijke voorkeur only)

4) Gebruik Long in plaats van gehele getallen omdat het is wat excelleren native gebruikt.

Voor die die dat willen: Ik denk dat het veilig om te zeggen dat de meeste mensen gebruiken levenshteinafstand om fuzzy match percentages berekenen. Hier is een manier om dat te doen, en ik heb een optimalisatie dat u de min kunt opgeven toegevoegd. match% terug te keren (standaard is 70% +. U komt binnen percentags zoals "50" of "80"of "0" de formule, ongeacht lopen).


De snelheid boost komt van het feit dat de functie zal controleren of het is zelfs mogelijk dat het binnen het percentage dat je het door het controleren van de lengte van de 2 strings. Let er enkele gebieden waar deze functie kan worden geoptimaliseerd, maar ik heb het voor de leesbaarheid gehouden dit. Ik aaneengeschakeld de afstand in het resultaat voor het bewijs van de functionaliteit, maar u kunt experimenteren met het 🙂

antwoordde 21 juni ’11 op 09:27

Mijn versie neemt

0,032 milliseconden per gesprek. Uw “geoptimaliseerd” versie kost

7,937, die ongeveer 250 keer langzamer. Het verwijderen van (nutteloze) Application.ScreenUpdating brengt uw tijd neer op 0,422, slechts 14 keer langzamer. uw (nutteloze) oproep om Worksheetfunction.min met mijn MIN code ter vervanging brengt uw tijd neer op 0,032; terug naar waar we begonnen (ASC eigenlijk is marginaal langzamer). – smirkingman 16 november ’11 om 11:36

Gebruik een byte array voor 17x snelheidswinst

antwoordde 20 juli ’12 op 17:42

Deze verandering van String te werken met Unicode strings byte. – Raul Luna 15 juli ’13 op 07:41

De prestaties van uw implementatie is consistent

24x. Goed gedaan! – Austin D 18 december ’16 op 04:17

Ik denk dat het nog sneller gekregen. Niet veel anders te doen dan te verbeteren vorige code voor snelheid en resultaat in%

antwoordde 19 september ’12 op 00:26

Waarom LCase (). Levenshtein algoritme is hoofdlettergevoelig. Dat is het punt. – CpRn 9 juni ’16 om 11:53

2017 Stack Exchange, Inc

Bron: stackoverflow.com

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

4 × 4 =