Skip to content
This repository has been archived by the owner on Dec 28, 2022. It is now read-only.

Commit

Permalink
Improve 3rd homework
Browse files Browse the repository at this point in the history
  • Loading branch information
lamtev committed Oct 16, 2022
1 parent 768c851 commit b759305
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 62 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ $ git checkout -b part1
Решение каждой задачи - отдельный Java-класс. Можно воспользоваться классом `company.vk.polis.ads.SolveTemplate`, в котором остается реализовать лишь метод `solve`.

* informatics-msk: добавлять ничего не нужно, статус решения отображается в общих результатах.
* E-olymp: В самом PR либо в его описании, либо в комментариях к каждому классу-решению нужно добавить ссылку на submission в e-olymp, где видно, что все решение прошло все тесты.
* E-olymp: В самом PR в его описании нужно добавить ссылку на submission в e-olymp, где видно, что решение прошло все тесты.
Эти ссылки имеют вид "https://www.e-olymp.com/ru/submissions/5707028".

Все обсуждения решения происходят в рамках комментариев к PR
Expand Down Expand Up @@ -82,9 +82,9 @@ $ git checkout -b <my-branch-for-part3> 6af9b4bc15fa61806ba537dea3d63f785a774a12
* https://www.e-olymp.com/ru/problems/4074 - Найти медиану 2
* https://www.e-olymp.com/ru/problems/3738 - Простая сортирока - реализовать HeapSort

* Реализовать методы `hasNext()` и `next()` в классе `company.vk.polis.ads.MergeIterator` так, чтобы успешно выполнялись тесты в `company.vk.polis.ads.MergeIteratorTest`. Время работы должно быть O(n logk), где n - суммарное количество всех элементов в k подаваемых на вход итераторах.
* Реализовать методы `hasNext()` и `next()` в классе `company.vk.polis.ads.heap.MergeIterator` так, чтобы успешно выполнялись тесты в `company.vk.polis.ads.heap.MergeIteratorTest`. Время работы должно быть O(n logk), где n - суммарное количество всех элементов в k подаваемых на вход итераторах.

* Реализовать метод `company.vk.polis.ads.TopK#topK`, который должен возвращать список из k максимальных элементов, отсортированных по убыванию, так, чтобы выполнялись тесты в `company.vk.polis.ads.TopKTest`.
* Реализовать метод `company.vk.polis.ads.heap.TopK#topK`, который должен возвращать список из k максимальных элементов, отсортированных по убыванию, так, чтобы выполнялись тесты в `company.vk.polis.ads.heap.TopKTest`.

Локально тесты можно запустить с помощью `./gradlew test`.

Expand Down
10 changes: 9 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED
import org.gradle.api.tasks.testing.logging.TestLogEvent.PASSED
import org.gradle.api.tasks.testing.logging.TestLogEvent.SKIPPED

plugins {
id("java")
}
Expand All @@ -23,5 +27,9 @@ dependencies {

tasks.getByName<Test>("test") {
useJUnitPlatform()
this.maxHeapSize = "1g"
maxHeapSize = "384m"

testLogging {
events(PASSED, SKIPPED, FAILED)
}
}
19 changes: 0 additions & 19 deletions src/main/java/company/vk/polis/ads/TopK.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package company.vk.polis.ads;
package company.vk.polis.ads.heap;

import java.util.Iterator;
import java.util.List;

/**
* Iterator that merges k input iterators ordered ascending.
* Each value returned by #next() is greater than or equal to previous one.
* Total cost of iteration is O(n logk).
* Total cost of iteration is O(n log(k)).
*
* @param <T> type of elements
*/
Expand All @@ -28,7 +28,7 @@ public boolean hasNext() {
}

/**
* Returns next element in ascending order with O(log k) complexity
* Returns next element in ascending order with O(log(k)) complexity
*
* @return next
*/
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/company/vk/polis/ads/heap/TopK.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package company.vk.polis.ads.heap;

import java.util.Iterator;
import java.util.List;

/**
* Class that allows us to get k max elements ordered descending in source list.
*/
public final class TopK {
/**
* Top-K with O(n log(k)) complexity.
*
* @param elems input elements iterator
* @param k amount of max values to carry out
* @param <T> type of elements
* @return list with k max elements ordered descending
*/
public <T extends Comparable<T>> List<T> topK(Iterator<T> elems, int k) {
throw new UnsupportedOperationException("Implement me");
}
}
33 changes: 0 additions & 33 deletions src/test/java/company.vk.polis.ads/TopKTest.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package company.vk.polis.ads;
package company.vk.polis.ads.heap;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand All @@ -13,7 +12,6 @@

import static org.junit.jupiter.api.Assertions.*;

@Disabled("Disabled since 4th homework released")
class MergeIteratorTest {
private static List<Iterator<Integer>> iterators;

Expand Down
37 changes: 37 additions & 0 deletions src/test/java/company/vk/polis/ads/heap/TopKTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package company.vk.polis.ads.heap;

import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntComparators;
import org.junit.jupiter.api.Test;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

import static org.junit.jupiter.api.Assertions.*;

class TopKTest {
private static final int SEQUENCE_SIZE = nextInt(150_000_000, 200_000_000);
private static final int TOP_K = nextInt(7_500_000, 10_000_000);
private static final int TOP_K_MIN_VALUE_BOUND = nextInt(Integer.MAX_VALUE / 2 - 1000, Integer.MAX_VALUE / 2);

@Test
void testTopK() {
var expected = new IntArrayList(TOP_K);
var sequence = IntStream.concat(
IntStream.generate(() -> nextInt(0, TOP_K_MIN_VALUE_BOUND))
.limit(SEQUENCE_SIZE - TOP_K),
IntStream.generate(() -> {
int i = nextInt(TOP_K_MIN_VALUE_BOUND, Integer.MAX_VALUE);
expected.add(i);
return i;
}).limit(TOP_K)
).iterator();
var actual = new TopK().topK(sequence, TOP_K);
expected.sort(IntComparators.OPPOSITE_COMPARATOR);
assertEquals(expected, actual);
}

private static int nextInt(int from, int to) {
return ThreadLocalRandom.current().nextInt(to - from) + from;
}
}

0 comments on commit b759305

Please sign in to comment.