Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement