diff --git a/hw_01/pom.xml b/hw_01/pom.xml new file mode 100644 index 0000000..307b47f --- /dev/null +++ b/hw_01/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + + 1 + hw_01 + 0.0.1-SNAPSHOT + jar + + hw_01 + http://maven.apache.org + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/hw_01/src/main/java/hw_01/Bor.java b/hw_01/src/main/java/hw_01/Bor.java new file mode 100644 index 0000000..99997c9 --- /dev/null +++ b/hw_01/src/main/java/hw_01/Bor.java @@ -0,0 +1,107 @@ +package hw_01; + +public class Bor implements Trie { + final private Node bor; + private int size = 0; + + public Bor() { + bor = new Node(); + } + + public boolean add(String element) { + if (contains(element)) { + return false; + } + + Node p = bor; + + p.nwords++; + for (int i = 0; i < element.length(); i++) { + int currIdx = arrNum(element.charAt(i)); + + if (p.lifes[currIdx] == null) { + p.lifes[currIdx] = new Node(); + size++; + } + p = p.lifes[currIdx]; + p.nwords++; + } + + p.isTerminal = true; + return true; + } + + public boolean contains(String element) { + Node p = bor; + for (int i = 0; i < element.length(); i++) { + int currIdx = arrNum(element.charAt(i)); + + if (p.lifes[currIdx] == null) { + return false; + } + p = p.lifes[currIdx]; + } + + return p.isTerminal; + } + + public boolean remove(String element) { + if (!contains(element)) { + return false; + } + + Node p = bor; + p.nwords--; + for (int i = 0; i < element.length(); i++) { + int currIdx = arrNum(element.charAt(i)); + + if (p.lifes[currIdx].nwords == 1) { + size -= element.length() - i; + p.lifes[currIdx] = null; + return true; + } + p = p.lifes[currIdx]; + p.nwords--; + } + + p.isTerminal = false; + + return true; + } + + public int size() { + return size; + } + + public int howManyStartsWithPrefix(String prefix) { + Node p = bor; + for (int i = 0; i < prefix.length(); i++) { + int currIdx = arrNum(prefix.charAt(i)); + + if (p.lifes[currIdx] == null) { + return 0; + } + p = p.lifes[currIdx]; + } + + return p.nwords; + } + + private int arrNum(char a) { + if ('a' <= a && a <= 'z') { + return a - 'a'; + } + + if ('A' <= a && a <= 'Z') { + return a - 'A' + 'z' - 'a' + 1; + } + + return -1; + } + + private class Node { + public boolean isTerminal; + public int nwords; + Node[] lifes = new Node[2*('z' - 'a' + 1)]; + } +} diff --git a/hw_01/src/main/java/hw_01/Trie.java b/hw_01/src/main/java/hw_01/Trie.java new file mode 100644 index 0000000..5c043b4 --- /dev/null +++ b/hw_01/src/main/java/hw_01/Trie.java @@ -0,0 +1,32 @@ +package hw_01; + +public interface Trie { + + /** + * Expected complexity: O(|element|) + * @return true if this set did not already contain the specified + * element + */ + boolean add(String element); + + /** + * Expected complexity: O(|element|) + */ + boolean contains(String element); + + /** + * Expected complexity: O(|element|) + * @return true if this set contained the specified element + */ + boolean remove(String element); + + /** + * Expected complexity: O(1) + */ + int size(); + + /** + * Expected complexity: O(|prefix|) + */ + int howManyStartsWithPrefix(String prefix); +} diff --git a/hw_01/src/test/java/hw_01/TrieImplTest.java b/hw_01/src/test/java/hw_01/TrieImplTest.java new file mode 100644 index 0000000..51f60cf --- /dev/null +++ b/hw_01/src/test/java/hw_01/TrieImplTest.java @@ -0,0 +1,116 @@ +package hw_01; + +import junit.framework.TestCase; + +public class TrieImplTest extends TestCase { + private Bor b; + + public void setUp() { + b = new Bor(); + } + + public void testAddSizeContains() { + assertFalse(b.contains("Hello")); + assertTrue(b.add("Hello")); + assertTrue(b.contains("Hello")); + assertEquals(5, b.size()); + assertEquals(1, b.howManyStartsWithPrefix("Hell")); + } + + public void testAddContainsPrefix() { + b.add("Hello"); + assertFalse(b.contains("Hell")); + assertTrue(b.add("Hell")); + assertTrue(b.contains("Hell")); + assertEquals(5, b.size()); + assertEquals(2, b.howManyStartsWithPrefix("Hell")); + } + + public void testAddOutstandingWord() { + b.add("Hello"); + assertTrue(b.add("Head")); + assertEquals(7, b.size()); + } + + public void testRemovePrefix() { + b.add("Hello"); + b.add("Hell"); + assertFalse(b.remove("He")); + assertTrue(b.remove("Hell")); + assertEquals(5, b.size()); + assertEquals(1, b.howManyStartsWithPrefix("Hell")); + } + + public void testTemoveSuffix() { + b.add("Hello"); + b.add("Hell"); + assertTrue(b.remove("Hello")); + assertEquals(4, b.size()); + } +/* + public void testBorBigTest() { + //b = new Bor(); + //Добавление + assertFalse(b.contains("Hello")); + assertTrue(b.add("Hello")); + assertTrue(b.contains("Hello")); + assertEquals(5, b.size()); + assertFalse(b.add("Hello")); + assertEquals(5, b.size()); + assertFalse(b.contains("Hell")); + assertTrue(b.add("Hell")); + assertTrue(b.contains("Hell")); + assertEquals(5, b.size()); + assertFalse(b.add("Hell")); + assertEquals(5, b.size()); + assertFalse(b.contains("Head")); + assertTrue(b.add("Head")); + assertTrue(b.contains("Head")); + assertEquals(7, b.size()); + assertFalse(b.contains("")); + assertTrue(b.add("")); + assertTrue(b.contains("")); + assertEquals(7, b.size()); + + //Проверка префиксов + assertEquals(3, b.howManyStartsWithPrefix("H")); + assertEquals(4, b.howManyStartsWithPrefix("")); + assertEquals(1, b.howManyStartsWithPrefix("Hea")); + assertEquals(2, b.howManyStartsWithPrefix("Hell")); + assertEquals(0, b.howManyStartsWithPrefix("h")); + + //Удаление + assertFalse(b.remove("h")); + assertFalse(b.remove("H")); + assertTrue(b.remove("Hell")); + assertFalse(b.remove("Hell")); + assertFalse(b.contains("Hell")); + assertEquals(7, b.size()); + assertEquals(1, b.howManyStartsWithPrefix("Hell")); + + assertTrue(b.remove("")); + assertFalse(b.remove("")); + assertEquals(7, b.size()); + assertEquals(2, b.howManyStartsWithPrefix("")); + + assertTrue(b.remove("Hello")); + assertFalse(b.remove("Hello")); + assertEquals(4, b.size()); + + assertTrue(b.contains("Head")); + assertTrue(b.add("HeadZzZ")); + assertEquals(7, b.size()); + assertEquals(2, b.howManyStartsWithPrefix("Head")); + assertEquals(1, b.howManyStartsWithPrefix("HeadZzZ")); + assertFalse(b.remove("HeadZ")); + assertTrue(b.remove("HeadZzZ")); + assertEquals(4, b.size()); + assertEquals(1, b.howManyStartsWithPrefix("Head")); + assertEquals(1, b.howManyStartsWithPrefix("")); + assertEquals(0, b.howManyStartsWithPrefix("HeadZ")); + + assertTrue(b.remove("Head")); + assertEquals(0, b.size()); + } +*/ +}