From 86e50d81fac2545f495a7eb3a79e6b15a1c4f7c2 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 12 Apr 2018 16:49:15 +0300 Subject: [PATCH 1/3] old files --- hw_01/pom.xml | 27 +++++ hw_01/src/main/java/hw_01/Bor.java | 107 ++++++++++++++++++ hw_01/src/main/java/hw_01/Trie.java | 32 ++++++ hw_01/src/test/java/hw_01/TrieImplTest.java | 116 ++++++++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 hw_01/pom.xml create mode 100644 hw_01/src/main/java/hw_01/Bor.java create mode 100644 hw_01/src/main/java/hw_01/Trie.java create mode 100644 hw_01/src/test/java/hw_01/TrieImplTest.java 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()); + } +*/ +} From a6be4d685af8b2afa2894f3ac6c59aa55f199b31 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 12 Apr 2018 18:46:53 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20seri?= =?UTF-8?q?alize/deserialize,=20=D1=82=D0=B5=D1=81=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hw_01/src/main/java/hw_01/Bor.java | 58 ++++++++++-- .../main/java/hw_01/StreamSerializable.java | 15 +++ hw_01/src/test/java/hw_01/TrieImplTest.java | 92 ++++++------------- 3 files changed, 90 insertions(+), 75 deletions(-) create mode 100644 hw_01/src/main/java/hw_01/StreamSerializable.java diff --git a/hw_01/src/main/java/hw_01/Bor.java b/hw_01/src/main/java/hw_01/Bor.java index 99997c9..d5a4a3a 100644 --- a/hw_01/src/main/java/hw_01/Bor.java +++ b/hw_01/src/main/java/hw_01/Bor.java @@ -1,8 +1,9 @@ package hw_01; -public class Bor implements Trie { +import java.io.*; + +public class Bor implements Trie, StreamSerializable { final private Node bor; - private int size = 0; public Bor() { bor = new Node(); @@ -17,11 +18,10 @@ public boolean add(String element) { p.nwords++; for (int i = 0; i < element.length(); i++) { - int currIdx = arrNum(element.charAt(i)); + int currIdx = arrayIndex(element.charAt(i)); if (p.lifes[currIdx] == null) { p.lifes[currIdx] = new Node(); - size++; } p = p.lifes[currIdx]; p.nwords++; @@ -34,7 +34,7 @@ public boolean add(String element) { public boolean contains(String element) { Node p = bor; for (int i = 0; i < element.length(); i++) { - int currIdx = arrNum(element.charAt(i)); + int currIdx = arrayIndex(element.charAt(i)); if (p.lifes[currIdx] == null) { return false; @@ -53,10 +53,9 @@ public boolean remove(String element) { Node p = bor; p.nwords--; for (int i = 0; i < element.length(); i++) { - int currIdx = arrNum(element.charAt(i)); + int currIdx = arrayIndex(element.charAt(i)); if (p.lifes[currIdx].nwords == 1) { - size -= element.length() - i; p.lifes[currIdx] = null; return true; } @@ -70,13 +69,13 @@ public boolean remove(String element) { } public int size() { - return size; + return bor.nwords; } public int howManyStartsWithPrefix(String prefix) { Node p = bor; for (int i = 0; i < prefix.length(); i++) { - int currIdx = arrNum(prefix.charAt(i)); + int currIdx = arrayIndex(prefix.charAt(i)); if (p.lifes[currIdx] == null) { return 0; @@ -87,7 +86,7 @@ public int howManyStartsWithPrefix(String prefix) { return p.nwords; } - private int arrNum(char a) { + private int arrayIndex(char a) { if ('a' <= a && a <= 'z') { return a - 'a'; } @@ -104,4 +103,43 @@ private class Node { public int nwords; Node[] lifes = new Node[2*('z' - 'a' + 1)]; } + + private void serializeNode(Node r, DataOutputStream dos) throws IOException { + dos.writeBoolean(r.isTerminal); + dos.writeInt(r.nwords); + + for(int i = 0; i < r.lifes.length; i++) { + if (r.lifes[i] == null) { + dos.writeBoolean(false); + } else { + dos.writeBoolean(true); + serializeNode(r.lifes[i], dos); + } + } + + } + + private void deserializeNode(Node r, DataInputStream dis) throws IOException { + r.isTerminal = dis.readBoolean(); + r.nwords = dis.readInt(); + + for(int i = 0; i < r.lifes.length; i++) { + boolean b = dis.readBoolean(); + if (b) { + r.lifes[i] = new Node(); + deserializeNode(r.lifes[i], dis); + } + } + } + + @Override + public void serialize(OutputStream out) throws IOException { + serializeNode(bor, new DataOutputStream(out)); + out.flush(); + } + + @Override + public void deserialize(InputStream in) throws IOException { + deserializeNode(bor, new DataInputStream(in));; + } } diff --git a/hw_01/src/main/java/hw_01/StreamSerializable.java b/hw_01/src/main/java/hw_01/StreamSerializable.java new file mode 100644 index 0000000..e9cb9df --- /dev/null +++ b/hw_01/src/main/java/hw_01/StreamSerializable.java @@ -0,0 +1,15 @@ +package hw_01; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public interface StreamSerializable { + + void serialize(OutputStream out) throws IOException; + + /** + * Replace current state with data from input stream + */ + void deserialize(InputStream in) throws IOException; +} \ No newline at end of file diff --git a/hw_01/src/test/java/hw_01/TrieImplTest.java b/hw_01/src/test/java/hw_01/TrieImplTest.java index 51f60cf..20fd175 100644 --- a/hw_01/src/test/java/hw_01/TrieImplTest.java +++ b/hw_01/src/test/java/hw_01/TrieImplTest.java @@ -1,5 +1,7 @@ package hw_01; +import java.io.*; + import junit.framework.TestCase; public class TrieImplTest extends TestCase { @@ -13,7 +15,7 @@ public void testAddSizeContains() { assertFalse(b.contains("Hello")); assertTrue(b.add("Hello")); assertTrue(b.contains("Hello")); - assertEquals(5, b.size()); + assertEquals(1, b.size()); assertEquals(1, b.howManyStartsWithPrefix("Hell")); } @@ -22,14 +24,14 @@ public void testAddContainsPrefix() { assertFalse(b.contains("Hell")); assertTrue(b.add("Hell")); assertTrue(b.contains("Hell")); - assertEquals(5, b.size()); + assertEquals(2, b.size()); assertEquals(2, b.howManyStartsWithPrefix("Hell")); } public void testAddOutstandingWord() { b.add("Hello"); assertTrue(b.add("Head")); - assertEquals(7, b.size()); + assertEquals(2, b.size()); } public void testRemovePrefix() { @@ -37,7 +39,7 @@ public void testRemovePrefix() { b.add("Hell"); assertFalse(b.remove("He")); assertTrue(b.remove("Hell")); - assertEquals(5, b.size()); + assertEquals(1, b.size()); assertEquals(1, b.howManyStartsWithPrefix("Hell")); } @@ -45,72 +47,32 @@ public void testTemoveSuffix() { b.add("Hello"); b.add("Hell"); assertTrue(b.remove("Hello")); - assertEquals(4, b.size()); + assertEquals(1, 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")); + + public void testSerialDeserial() throws IOException { + b.add("Hello"); + b.add("Head"); - //Удаление - 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")); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + b.serialize(baos); + byte[] buf1 = baos.toByteArray(); - assertTrue(b.remove("")); - assertFalse(b.remove("")); - assertEquals(7, b.size()); - assertEquals(2, b.howManyStartsWithPrefix("")); + Bor b1 = new Bor(); + b1.deserialize(new ByteArrayInputStream(buf1)); + baos = new ByteArrayOutputStream(); + b1.serialize(baos); + byte[] buf2 = baos.toByteArray(); - assertTrue(b.remove("Hello")); - assertFalse(b.remove("Hello")); - assertEquals(4, b.size()); + assertEquals(buf1.length, buf2.length); - 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")); + for(int i = 0; i < buf1.length; i++) { + assertEquals(buf1[i], buf2[i]); + } - assertTrue(b.remove("Head")); - assertEquals(0, b.size()); + assertTrue(b1.contains("Hello")); + assertTrue(b1.contains("Head")); + assertEquals(2, b1.size()); } -*/ + } From e98acf477e2c4afa5902e3e6369f2e84903dd141 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 12 Apr 2018 18:54:29 +0300 Subject: [PATCH 3/3] rename --- {hw_01 => hw_03}/pom.xml | 0 {hw_01 => hw_03}/src/main/java/hw_01/Bor.java | 0 {hw_01 => hw_03}/src/main/java/hw_01/StreamSerializable.java | 0 {hw_01 => hw_03}/src/main/java/hw_01/Trie.java | 0 {hw_01 => hw_03}/src/test/java/hw_01/TrieImplTest.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {hw_01 => hw_03}/pom.xml (100%) rename {hw_01 => hw_03}/src/main/java/hw_01/Bor.java (100%) rename {hw_01 => hw_03}/src/main/java/hw_01/StreamSerializable.java (100%) rename {hw_01 => hw_03}/src/main/java/hw_01/Trie.java (100%) rename {hw_01 => hw_03}/src/test/java/hw_01/TrieImplTest.java (100%) diff --git a/hw_01/pom.xml b/hw_03/pom.xml similarity index 100% rename from hw_01/pom.xml rename to hw_03/pom.xml diff --git a/hw_01/src/main/java/hw_01/Bor.java b/hw_03/src/main/java/hw_01/Bor.java similarity index 100% rename from hw_01/src/main/java/hw_01/Bor.java rename to hw_03/src/main/java/hw_01/Bor.java diff --git a/hw_01/src/main/java/hw_01/StreamSerializable.java b/hw_03/src/main/java/hw_01/StreamSerializable.java similarity index 100% rename from hw_01/src/main/java/hw_01/StreamSerializable.java rename to hw_03/src/main/java/hw_01/StreamSerializable.java diff --git a/hw_01/src/main/java/hw_01/Trie.java b/hw_03/src/main/java/hw_01/Trie.java similarity index 100% rename from hw_01/src/main/java/hw_01/Trie.java rename to hw_03/src/main/java/hw_01/Trie.java diff --git a/hw_01/src/test/java/hw_01/TrieImplTest.java b/hw_03/src/test/java/hw_01/TrieImplTest.java similarity index 100% rename from hw_01/src/test/java/hw_01/TrieImplTest.java rename to hw_03/src/test/java/hw_01/TrieImplTest.java