From 4f6c33f935dfbbedbc693a76ac65130a1cd7ab8f Mon Sep 17 00:00:00 2001 From: helga_sh Date: Mon, 6 Jul 2020 17:39:18 +0300 Subject: [PATCH 1/2] Top k elements in an array --- .../BruteForceTopKElementsFinder.java | 26 ++++++++++ .../MaxHeapTopKElementsFinder.java | 26 ++++++++++ .../topnelements/TopKElementsFinder.java | 7 +++ .../TreeSetTopKElementsFinder.java | 17 +++++++ .../TopKElementsFinderUnitTest.java | 50 +++++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java create mode 100644 algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java new file mode 100644 index 0000000000..d2a3acce16 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.topnelements; + +import java.util.ArrayList; +import java.util.List; + +public class BruteForceTopKElementsFinder implements TopKElementsFinder { + + public List findTopK(List input, int k) { + List array = new ArrayList<>(input); + List topKList = new ArrayList<>(); + + for (int i = 0; i < k; i++) { + int maxIndex = 0; + + for (int j = 1; j < array.size(); j++) { + if (array.get(j) > array.get(maxIndex)) { + maxIndex = j; + } + } + + topKList.add(array.remove(maxIndex)); + } + + return topKList; + } +} diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java new file mode 100644 index 0000000000..e39eb7ccb2 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.topnelements; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.PriorityQueue; + +public class MaxHeapTopKElementsFinder implements TopKElementsFinder { + + public List findTopK(List input, int k) { + PriorityQueue maxHeap = new PriorityQueue<>(); + + input.forEach(number -> { + maxHeap.add(number); + + if (maxHeap.size() > k) { + maxHeap.poll(); + } + }); + + List topKList = new ArrayList<>(maxHeap); + Collections.reverse(topKList); + + return topKList; + } +} diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java new file mode 100644 index 0000000000..d1bd48efa5 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java @@ -0,0 +1,7 @@ +package com.baeldung.algorithms.topnelements; + +import java.util.List; + +public interface TopKElementsFinder> { + List findTopK(List input, int k); +} diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java new file mode 100644 index 0000000000..c1fc8914d0 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java @@ -0,0 +1,17 @@ +package com.baeldung.algorithms.topnelements; + +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class TreeSetTopKElementsFinder implements TopKElementsFinder { + + public List findTopK(List input, int k) { + Set sortedSet = new TreeSet<>(Comparator.reverseOrder()); + sortedSet.addAll(input); + + return sortedSet.stream().limit(k).collect(Collectors.toList()); + } +} diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java new file mode 100644 index 0000000000..5c02cefe23 --- /dev/null +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.algorithms.topkelements; + +import com.baeldung.algorithms.topnelements.BruteForceTopKElementsFinder; +import com.baeldung.algorithms.topnelements.MaxHeapTopKElementsFinder; +import com.baeldung.algorithms.topnelements.TopKElementsFinder; +import com.baeldung.algorithms.topnelements.TreeSetTopKElementsFinder; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class TopKElementsFinderUnitTest { + private final TopKElementsFinder bruteForceFinder = new BruteForceTopKElementsFinder(); + private final TopKElementsFinder maxHeapFinder = new MaxHeapTopKElementsFinder(); + private final TopKElementsFinder treeSetFinder = new TreeSetTopKElementsFinder(); + + private final int k = 4; + private final List distinctIntegers = Arrays.asList(1, 2, 3, 9, 7, 6, 12); + private final List distinctIntegersTopK = Arrays.asList(9, 7, 6, 12); + private final List nonDistinctIntegers = Arrays.asList(1, 2, 3, 3, 9, 9, 7, 6, 12); + private final List nonDistinctIntegersTopK = Arrays.asList(9, 9, 7, 12); + + + @Test + public void givenArrayDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { + assertThat(bruteForceFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); + } + + @Test + public void givenArrayDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { + assertThat(maxHeapFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); + } + + @Test + public void givenArrayDistinctIntegers_whenTreeSetFindTopK_thenReturnKLargest() { + assertThat(treeSetFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); + } + + @Test + public void givenArrayNonDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { + assertThat(bruteForceFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK); + } + + @Test + public void givenArrayNonDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { + assertThat(maxHeapFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK); + } +} From 53ffdd9f3d3e5008455ac1d9634610c2b94b494e Mon Sep 17 00:00:00 2001 From: helga_sh Date: Mon, 6 Jul 2020 17:49:10 +0300 Subject: [PATCH 2/2] Rename folder --- .../BruteForceTopKElementsFinder.java | 2 +- .../MaxHeapTopKElementsFinder.java | 2 +- .../{topnelements => topkelements}/TopKElementsFinder.java | 2 +- .../TreeSetTopKElementsFinder.java | 2 +- .../algorithms/topkelements/TopKElementsFinderUnitTest.java | 4 ---- 5 files changed, 4 insertions(+), 8 deletions(-) rename algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/{topnelements => topkelements}/BruteForceTopKElementsFinder.java (93%) rename algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/{topnelements => topkelements}/MaxHeapTopKElementsFinder.java (93%) rename algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/{topnelements => topkelements}/TopKElementsFinder.java (74%) rename algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/{topnelements => topkelements}/TreeSetTopKElementsFinder.java (91%) diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java similarity index 93% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java index d2a3acce16..c0962c7079 100644 --- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/BruteForceTopKElementsFinder.java +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.topnelements; +package com.baeldung.algorithms.topkelements; import java.util.ArrayList; import java.util.List; diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java similarity index 93% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java index e39eb7ccb2..16ae7f1254 100644 --- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/MaxHeapTopKElementsFinder.java +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.topnelements; +package com.baeldung.algorithms.topkelements; import java.util.ArrayList; import java.util.Collections; diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java similarity index 74% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java index d1bd48efa5..a9c7881408 100644 --- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TopKElementsFinder.java +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.topnelements; +package com.baeldung.algorithms.topkelements; import java.util.List; diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java similarity index 91% rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java index c1fc8914d0..0b898df21d 100644 --- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topnelements/TreeSetTopKElementsFinder.java +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.topnelements; +package com.baeldung.algorithms.topkelements; import java.util.Comparator; import java.util.List; diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java index 5c02cefe23..41fa5e067e 100644 --- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java @@ -1,9 +1,5 @@ package com.baeldung.algorithms.topkelements; -import com.baeldung.algorithms.topnelements.BruteForceTopKElementsFinder; -import com.baeldung.algorithms.topnelements.MaxHeapTopKElementsFinder; -import com.baeldung.algorithms.topnelements.TopKElementsFinder; -import com.baeldung.algorithms.topnelements.TreeSetTopKElementsFinder; import org.junit.Test; import java.util.Arrays;