Skip to content

Commit

Permalink
LCS
Browse files Browse the repository at this point in the history
  • Loading branch information
Pastor committed Dec 13, 2024
1 parent 56e04ad commit 6fd133e
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
public abstract class Main {
public static void main(String[] args) {
Consumer<BinaryTree<Integer>> generator = tree -> tree.add(8).add(3).add(6).add(1).add(4).add(7).add(10).add(14).add(13);
// test("Binary", new BinarySearchTree<>(), generator);
// test("AVL", new AVL<>(), generator);
// System.out.println("Вырожденное дерево");
test("Binary", new BinarySearchTree<>(), generator);
test("AVL", new AVL<>(), generator);
System.out.println("Вырожденное дерево");
generator = tree -> tree.add(1).add(2).add(3).add(4).add(5).add(6).add(7).add(8).add(9);
// test("Binary", new BinarySearchTree<>(), generator);
test("Binary", new BinarySearchTree<>(), generator);
test("AVL", new AVL<>(), generator);
}

Expand Down
12 changes: 11 additions & 1 deletion vol7/src/main/java/ru/mifi/practice/vol7/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import ru.mifi.practice.vol7.fibonacci.FibonacciDynamicus;
import ru.mifi.practice.vol7.fibonacci.FibonacciMemorized;
import ru.mifi.practice.vol7.fibonacci.FibonacciRecursion;
import ru.mifi.practice.vol7.subsequence.LongestCommonSubsequence;

import java.util.List;

Expand All @@ -27,7 +28,8 @@ public static void main(String[] args) {
List<Backpack.Item> putting = backpack.putting(items);
System.out.println(" Backpack : " + putting);
distance("Lev.Recur", new Levenshtein.LevenshteinRecursion(), "boobs", "bomb");
distance("Lev.Dynam", new Levenshtein.LevenshteinDynamicus(), "boobs", "bomb");
distance("Lev.Dynam", new Levenshtein.VagnerFisherDynamicus(), "boobs", "bomb");
lcs("Sub.Commo", new LongestCommonSubsequence.Default(), "mouse", "house");
}

private static void fibonacci(String name, Fibonacci fibonacci) {
Expand All @@ -47,4 +49,12 @@ private static void distance(String name, Distance distance, String word1, Strin
System.out.println(prefix + "Val : " + d);
System.out.println(prefix + "Cnt : " + counter);
}

private static void lcs(String name, LongestCommonSubsequence subsequence, String word1, String word2) {
Counter counter = new Counter.Default();
String prefix = String.format("LCS.%s.", name);
int d = subsequence.longestCommonSubsequence(word1, word2, counter);
System.out.println(prefix + "Val : " + d);
System.out.println(prefix + "Cnt : " + counter);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
public interface Levenshtein extends Distance {

abstract class AbstractLevenshtein implements Levenshtein {
protected static int costOfSubstitution(char a, char b) {
protected static int cost(char a, char b) {
return a == b ? 0 : 1;
}

Expand All @@ -29,15 +29,15 @@ public int distance(String s1, String s2, Counter counter) {
}
counter.increment();
int substitution = distance(s1.substring(1), s2.substring(1), counter)
+ costOfSubstitution(s1.charAt(0), s2.charAt(0));
+ cost(s1.charAt(0), s2.charAt(0));
int insertion = distance(s1, s2.substring(1), counter) + 1;
int deletion = distance(s1.substring(1), s2, counter) + 1;

return min(substitution, insertion, deletion);
}
}

final class LevenshteinDynamicus extends AbstractLevenshtein {
final class VagnerFisherDynamicus extends AbstractLevenshtein {
@Override
public int distance(String s1, String s2, Counter counter) {
int[][] table = new int[s1.length() + 1][s2.length() + 1];
Expand All @@ -51,8 +51,7 @@ public int distance(String s1, String s2, Counter counter) {
} else if (j == 0) {
table[i][j] = i;
} else {
table[i][j] = min(table[i - 1][j - 1]
+ costOfSubstitution(s1.charAt(i - 1), s2.charAt(j - 1)),
table[i][j] = min(table[i - 1][j - 1] + cost(s1.charAt(i - 1), s2.charAt(j - 1)),
table[i - 1][j] + 1,
table[i][j - 1] + 1);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ru.mifi.practice.vol7.subsequence;

import ru.mifi.practice.vol7.Counter;

public interface LongestCommonSubsequence {
int longestCommonSubsequence(String text1, String text2, Counter counter);

final class Default implements LongestCommonSubsequence {

@Override
public int longestCommonSubsequence(String text1, String text2, Counter counter) {
int n = text1.length();
int m = text2.length();
int[][] table = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
counter.increment();
for (int j = 1; j <= m; j++) {
counter.increment();
if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
table[i][j] = table[i - 1][j - 1] + 1;
} else {
table[i][j] = Math.max(table[i][j - 1], table[i - 1][j]);
}
}
}
return table[n][m];
}
}
}

0 comments on commit 6fd133e

Please sign in to comment.