From 3b0ce383ebf5856cfd5881b5adc3200e72328daf Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 12:38:11 +0530 Subject: [PATCH 01/13] #4382 Bug Fix --- .../misc/MedianOfRunningArray.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 84dff89eaa8b..4de377d89ad7 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -8,13 +8,13 @@ */ public class MedianOfRunningArray { - private PriorityQueue p1; - private PriorityQueue p2; + private PriorityQueue maxHeap; + private PriorityQueue minHeap; // Constructor public MedianOfRunningArray() { - this.p1 = new PriorityQueue<>(Collections.reverseOrder()); // Max Heap - this.p2 = new PriorityQueue<>(); // Min Heap + this.maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // Max Heap + this.minHeap = new PriorityQueue<>(); // Min Heap } /* @@ -22,20 +22,27 @@ public MedianOfRunningArray() { and upper half to min heap */ public void insert(Integer e) { - p2.add(e); - if (p2.size() - p1.size() > 1) { - p1.add(p2.remove()); + if (!minHeap.isEmpty() && e < minHeap.peek()) { + maxHeap.offer(e); + if (maxHeap.size() > minHeap.size() + 1) { + minHeap.offer(maxHeap.poll()); + } + } else { + minHeap.offer(e); + if (minHeap.size() > maxHeap.size() + 1) { + maxHeap.offer(minHeap.poll()); + } } } /* Returns median at any given point */ - public Integer median() { - if (p1.size() == p2.size()) { - return (p1.peek() + p2.peek()) / 2; + public Double median() { + if (maxHeap.size() == minHeap.size()) { + return (maxHeap.peek() + minHeap.peek()) / 2.0; } - return p1.size() > p2.size() ? p1.peek() : p2.peek(); + return maxHeap.size() > minHeap.size() ? maxHeap.peek()*1.0 : minHeap.peek()*1.0; } public static void main(String[] args) { @@ -44,8 +51,8 @@ public static void main(String[] args) { */ MedianOfRunningArray p = new MedianOfRunningArray(); - int[] arr = {10, 7, 4, 9, 2, 3, 11, 17, 14}; - for (int i = 0; i < 9; i++) { + int[] arr = {30,20,10}; + for (int i = 0; i < arr.length; i++) { p.insert(arr[i]); System.out.print(p.median() + " "); } From 6ed1189b07a815bd3564316fc58823b8825b4019 Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 12:46:46 +0530 Subject: [PATCH 02/13] #4382 Bug Fix --- .../java/com/thealgorithms/misc/MedianOfRunningArray.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 4de377d89ad7..328427a9e761 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -42,7 +42,7 @@ public Double median() { if (maxHeap.size() == minHeap.size()) { return (maxHeap.peek() + minHeap.peek()) / 2.0; } - return maxHeap.size() > minHeap.size() ? maxHeap.peek()*1.0 : minHeap.peek()*1.0; + return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; } public static void main(String[] args) { @@ -51,7 +51,7 @@ public static void main(String[] args) { */ MedianOfRunningArray p = new MedianOfRunningArray(); - int[] arr = {30,20,10}; + int[] arr = {30, 20, 10}; for (int i = 0; i < arr.length; i++) { p.insert(arr[i]); System.out.print(p.median() + " "); From eaa05331259ee2375b2e85d20a96e0fcc06a4026 Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:24:59 +0530 Subject: [PATCH 03/13] Made Requested Changes --- .../misc/MedianOfRunningArray.java | 18 +-- .../misc/MedianOfRunningArrayTest.java | 113 ++++++++++++++++++ 2 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 328427a9e761..0aed9c8ca52b 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -39,22 +39,14 @@ public void insert(Integer e) { Returns median at any given point */ public Double median() { - if (maxHeap.size() == minHeap.size()) { + if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { return (maxHeap.peek() + minHeap.peek()) / 2.0; } + else if(maxHeap.size() == minHeap.size()){ + throw new IllegalArgumentException("Enter at least 1 element, Median of empty list is not defined!"); + } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; } - public static void main(String[] args) { - /* - Testing the median function - */ - - MedianOfRunningArray p = new MedianOfRunningArray(); - int[] arr = {30, 20, 10}; - for (int i = 0; i < arr.length; i++) { - p.insert(arr[i]); - System.out.print(p.median() + " "); - } - } + } diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java new file mode 100644 index 000000000000..f26c282ceac9 --- /dev/null +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -0,0 +1,113 @@ +package com.thealgorithms.misc; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.apache.commons.lang3.tuple.Pair; +import org.junit.jupiter.api.Test; + +/** + * Test case for Two sum Problem. + * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) + */ + +public class MedianOfRunningArrayTest { + private static final String EXCEPTION_MESSAGE = "Enter at least 1 element, Median of empty list is not defined!"; + + @Test + public void testWhenInvalidInoutProvidedShouldThrowException() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () - > stream.median()); + assertEquals(exception.getMessage(), EXCEPTION_MESSAGE); + } + + @Test + public void testWithNegativeValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(-1); + assertEquals(-1, stream.median()); + stream.insert(-2); + assertEquals(-1.5, stream.median()); + stream.insert(-3); + assertEquals(-2, stream.median()); + } + + @Test + public void testWithSingleValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(-1); + assertEquals(-1, stream.median()); + } + + @Test + public void testWithRandomValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(10); + assertEquals(10.0, stream.median()); + + stream.insert(5); + assertEquals(7.5, stream.median()); + + stream.insert(20); + assertEquals(10.0, stream.median()); + + stream.insert(15); + assertEquals(12.5, stream.median()); + + stream.insert(25); + assertEquals(15.0, stream.median()); + + stream.insert(30); + assertEquals(17.5, stream.median()); + + stream.insert(35); + assertEquals(20.0, stream.median()); + + stream.insert(1); + assertEquals(17.5, stream.median()); + } + + @Test + public void testWithNegativeAndPositiveValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(-1); + assertEquals(-1, stream.median()); + stream.insert(2); + assertEquals(0.5, stream.median()); + stream.insert(-3); + assertEquals(-1, stream.median()); + } + + @Test + public void testWithDuplicateValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(-1); + assertEquals(-1, stream.median()); + stream.insert(-1); + assertEquals(-1, stream.median()); + stream.insert(-1); + assertEquals(-1, stream.median()); + } + + @Test + public void testWithLargeValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(1000000); + assertEquals(1000000, stream.median()); + stream.insert(12000); + assertEquals(506000, stream.median()); + stream.insert(15000000); + assertEquals(1000000, stream.median()); + stream.insert(2300000); + assertEquals(1650000.00, stream.median()); + } + + @Test + public void testWithLargeCountOfValues() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + for (int i = 1; i <= 1000; i++) + stream.insert(i); + assertEquals(500.5, stream.median()); + } +} \ No newline at end of file From 8542fa01f29e10b6559913c02497f468ce9dd3ee Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:28:30 +0530 Subject: [PATCH 04/13] Made Requested Changes --- src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java | 2 +- .../java/com/thealgorithms/misc/MedianOfRunningArrayTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 0aed9c8ca52b..5dfe00c77a5a 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -42,7 +42,7 @@ public Double median() { if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { return (maxHeap.peek() + minHeap.peek()) / 2.0; } - else if(maxHeap.size() == minHeap.size()){ + else if (maxHeap.size() == minHeap.size()){ throw new IllegalArgumentException("Enter at least 1 element, Median of empty list is not defined!"); } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java index f26c282ceac9..fdd649a344b4 100644 --- a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -106,8 +106,7 @@ public void testWithLargeValues() { @Test public void testWithLargeCountOfValues() { MedianOfRunningArray stream = new MedianOfRunningArray(); - for (int i = 1; i <= 1000; i++) - stream.insert(i); + for (int i = 1; i <= 1000; i++) stream.insert(i); assertEquals(500.5, stream.median()); } } \ No newline at end of file From cc61bfe2e3e4ab909efd5a2d1539ee3ed9f09146 Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:30:03 +0530 Subject: [PATCH 05/13] Made Requested Changes --- src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 5dfe00c77a5a..d269a55ac3fe 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -42,7 +42,7 @@ public Double median() { if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { return (maxHeap.peek() + minHeap.peek()) / 2.0; } - else if (maxHeap.size() == minHeap.size()){ + else if (maxHeap.size() == minHeap.size()) { throw new IllegalArgumentException("Enter at least 1 element, Median of empty list is not defined!"); } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; From bc135cfc033c3a064795ca23f33d6326ad979a7c Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:32:08 +0530 Subject: [PATCH 06/13] Made Requested Changes --- src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index d269a55ac3fe..146a4c5f88f1 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -41,8 +41,7 @@ public void insert(Integer e) { public Double median() { if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { return (maxHeap.peek() + minHeap.peek()) / 2.0; - } - else if (maxHeap.size() == minHeap.size()) { + } else if (maxHeap.size() == minHeap.size()) { throw new IllegalArgumentException("Enter at least 1 element, Median of empty list is not defined!"); } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; From 640c23bbe7ddc3fb7ef88a71925257d26f7e84b8 Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:34:48 +0530 Subject: [PATCH 07/13] Made Requested Changes --- .../java/com/thealgorithms/misc/MedianOfRunningArrayTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java index fdd649a344b4..15175a49e617 100644 --- a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -18,7 +18,7 @@ public class MedianOfRunningArrayTest { @Test public void testWhenInvalidInoutProvidedShouldThrowException() { MedianOfRunningArray stream = new MedianOfRunningArray(); - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () - > stream.median()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> stream.median()); assertEquals(exception.getMessage(), EXCEPTION_MESSAGE); } From 15acdbb097c6d5e5e41217d010a5308e1bdfc5e6 Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:50:08 +0530 Subject: [PATCH 08/13] Made Requested Changes --- src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 146a4c5f88f1..4973cfd89983 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -46,6 +46,4 @@ public Double median() { } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; } - - } From 92ccdd3d85327ab2b8606c63205f6fb1762cb59f Mon Sep 17 00:00:00 2001 From: Ansh Date: Wed, 20 Sep 2023 22:52:20 +0530 Subject: [PATCH 09/13] Made Requested Changes --- .../java/com/thealgorithms/misc/MedianOfRunningArrayTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java index 15175a49e617..93b951d01387 100644 --- a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -109,4 +109,4 @@ public void testWithLargeCountOfValues() { for (int i = 1; i <= 1000; i++) stream.insert(i); assertEquals(500.5, stream.median()); } -} \ No newline at end of file +} From 0b7d2a327a81ff81148709286664c3287fc5e4b9 Mon Sep 17 00:00:00 2001 From: Ansh Shah <60037118+govardhanshah456@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:19:11 +0530 Subject: [PATCH 10/13] Update src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 4973cfd89983..62c6f99bfdae 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -38,7 +38,7 @@ public void insert(Integer e) { /* Returns median at any given point */ - public Double median() { + public double median() { if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { return (maxHeap.peek() + minHeap.peek()) / 2.0; } else if (maxHeap.size() == minHeap.size()) { From 81e0d3debbe8b59461876b1f2e140684f950c44c Mon Sep 17 00:00:00 2001 From: Ansh Shah <60037118+govardhanshah456@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:19:30 +0530 Subject: [PATCH 11/13] Update src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- .../java/com/thealgorithms/misc/MedianOfRunningArray.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java index 62c6f99bfdae..61fbfa82003f 100644 --- a/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java +++ b/src/main/java/com/thealgorithms/misc/MedianOfRunningArray.java @@ -39,11 +39,13 @@ public void insert(Integer e) { Returns median at any given point */ public double median() { - if (maxHeap.size() == minHeap.size() && maxHeap.size() > 0) { - return (maxHeap.peek() + minHeap.peek()) / 2.0; - } else if (maxHeap.size() == minHeap.size()) { + if (maxHeap.isEmpty() && minHeap.isEmpty()) { throw new IllegalArgumentException("Enter at least 1 element, Median of empty list is not defined!"); } + + if (maxHeap.size() == minHeap.size()) { + return (maxHeap.peek() + minHeap.peek()) / 2.0; + } return maxHeap.size() > minHeap.size() ? maxHeap.peek() * 1.0 : minHeap.peek() * 1.0; } } From 6c4c057ada225c3eea3396218c19aefd547b2a85 Mon Sep 17 00:00:00 2001 From: Ansh Shah <60037118+govardhanshah456@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:19:43 +0530 Subject: [PATCH 12/13] Update src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- .../misc/MedianOfRunningArrayTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java index 93b951d01387..d15826f2303f 100644 --- a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -90,6 +90,19 @@ public void testWithDuplicateValues() { assertEquals(-1, stream.median()); } + @Test + public void testWithDuplicateValuesB() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(10); + stream.insert(20); + stream.insert(10); + stream.insert(10); + stream.insert(20); + stream.insert(0); + stream.insert(50); + assertEquals(10, stream.median()); + } + @Test public void testWithLargeValues() { MedianOfRunningArray stream = new MedianOfRunningArray(); From 300b1eb423aea12a0696d738de32be14ab9c4369 Mon Sep 17 00:00:00 2001 From: Ansh Shah <60037118+govardhanshah456@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:19:57 +0530 Subject: [PATCH 13/13] Update src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- .../misc/MedianOfRunningArrayTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java index d15826f2303f..96cdc77e92a2 100644 --- a/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java +++ b/src/test/java/com/thealgorithms/misc/MedianOfRunningArrayTest.java @@ -122,4 +122,40 @@ public void testWithLargeCountOfValues() { for (int i = 1; i <= 1000; i++) stream.insert(i); assertEquals(500.5, stream.median()); } + + @Test + public void testWithThreeValuesInDescendingOrder() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(30); + stream.insert(20); + stream.insert(10); + assertEquals(20.0, stream.median()); + } + + @Test + public void testWithThreeValuesInOrder() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(10); + stream.insert(20); + stream.insert(30); + assertEquals(20.0, stream.median()); + } + + @Test + public void testWithThreeValuesNotInOrderA() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(30); + stream.insert(10); + stream.insert(20); + assertEquals(20.0, stream.median()); + } + + @Test + public void testWithThreeValuesNotInOrderB() { + MedianOfRunningArray stream = new MedianOfRunningArray(); + stream.insert(20); + stream.insert(10); + stream.insert(30); + assertEquals(20.0, stream.median()); + } }