SHARE
TWEET

Untitled

a guest Jun 26th, 2019 60 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices.ComTypes;
  4.  
  5. namespace Levenshtein
  6. {
  7.     public static class Levenshtein
  8.     {
  9.         [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
  10.         public static int Min(int d0, int d1, int d2, int bx, int ay)
  11.         {
  12.             return d0 < d1 || d2 < d1
  13.                 ? d0 > d2
  14.                     ? d2 + 1
  15.                     : d0 + 1
  16.                 : bx == ay
  17.                     ? d1
  18.                     : d1 + 1;
  19.         }
  20.         [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
  21.         public static int Evaluate(string a, string b)
  22.         {
  23.             var la = a.Length;
  24.             var lb = b.Length;
  25.  
  26.             while (la > 0 && (a[la - 1] == b[lb - 1]))
  27.             {
  28.                 --la;
  29.                 --lb;
  30.             }
  31.  
  32.             var offset = 0;
  33.  
  34.             while (offset < la && a[offset] == b[offset])
  35.             {
  36.                 ++offset;
  37.             }
  38.  
  39.             la -= offset;
  40.             lb -= offset;
  41.  
  42.             if (la == 0 || lb < 3)
  43.             {
  44.                 return lb;
  45.             }
  46.  
  47.             var dd = Int32.MaxValue;
  48.  
  49.             int x = 0;
  50.             int y = 0;
  51.             int d0 = 0;
  52.             int d1 = 0;
  53.             int d2 = 0;
  54.             int d3 = 0;
  55.             int dy = 0;
  56.             int ay = 0;
  57.             int bx0 = 0;
  58.             int bx1 = 0;
  59.             int bx2 = 0;
  60.             int bx3 = 0;
  61.  
  62.             var view = new int[la * 2];
  63.            
  64.            
  65.             for (var i = 0; i < view.Length; ++y)
  66.             {
  67.                 view[i++] = y + 1;
  68.                 view[i++] = a[offset + y];
  69.             }
  70.  
  71.             var len = view.Length - 1;
  72.  
  73.             while (x < lb - 3)
  74.             {
  75.                 bx0 = b[offset + (d0 = 0)];
  76.                 bx1 = b[offset + (d1 = x + 1)];
  77.                 bx2 = b[offset + (d2 = x + 2)];
  78.                 bx3 = b[offset + (d3 = x + 3)];
  79.                 x += 4;
  80.  
  81.                 dd = x;
  82.  
  83.                 for (y = 0; y < len; y += 2)
  84.                 {
  85.                     dy = view[y];
  86.                     ay = view[y + 1];
  87.                     d0 = Min(dy, d0, d1, bx0, ay);
  88.                     d1 = Min(d0, d1, d2, bx1, ay);
  89.                     d2 = Min(d1, d2, d3, bx2, ay);
  90.                     dd = Min(d2, d3, dd, bx3, ay);
  91.                     view[y] = dd;
  92.                     d3 = d2;
  93.                     d2 = d1;
  94.                     d1 = d0;
  95.                     d0 = dy;
  96.                 }
  97.             }
  98.             while (x < lb)
  99.             {
  100.                 bx0 = b[offset + (d0 = x)];
  101.                 dd = ++x;
  102.                 for (y = 0; y < len; y += 2)
  103.                 {
  104.                     dy = view[y];
  105.                     dd = Min(dy, d0, dd, bx0, view[y + 1]);
  106.                     view[y] = dd;
  107.                     d0 = dy;
  108.                 }
  109.             }
  110.  
  111.             return dd;
  112.         }
  113.     }
  114. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top