У меня есть это школьное задание, где мне нужно создать макс/мин-искатель из движущегося окна в O (log (n)). Присвоение дает подсказку использовать java-класс java.util.TreeMap или очереди в реализации. До сих пор мне удалось создать рабочий код, который работает в O (n), используя очереди. В соответствии с тем, что я сделал до сих пор с treeMap, но у меня проблемы с пониманием класса treeMap. Я просто не считаю нужным использовать инструменты. Теперь он удаляет самое большое значение, а не самое раннее. Я попытался также сопоставить значения с индексами, но тогда я не смог сравнить значения, чтобы найти самое большое значение.Поиск min/max движущегося окна в O (log (n))
import java.util.TreeMap._
class FastMaxMin[A <% Ordered[A]](windowSize: Int) {
val tree = new java.util.TreeMap[A,A]()
var size = 0
/**
* Every apply should insert new value to the moving window, removes the earliest
* one and returns (min, max) of the current window.
*/
def insert(value: A): (A, A) = {
if(size = windowSize){
tree.pollLastEntry()
size-=1
}
tree.put(value, value)
size+=1
(tree.firstKey(), tree.lastKey()
}
}
Если бы кто-нибудь мог даже подтолкнуть меня вперед этой штукой, я был бы доволен.
Я понимаю концепцию этого компаратора, но я не понимаю, как я его реализую (я только получаю ошибки) – Jezzie
Я почти полностью работал. Проблема заключается в том, что если вы добавляете одно и то же значение дважды, это не считается как два экземпляра :( – Jezzie
@Jezzie. Вы можете использовать «Map [A, Int]», а затем как многострочный. –