在O(log(n))中查找移动窗口的最小值/最大值

时间:2016-10-21 11:32:05

标签: scala treemap

我有这个学校作业,我必须从O(log(n))中的移动窗口创建最大/最小查找器。赋值提供了在实现中使用java类java.util.TreeMap或队列的提示。到目前为止,我只能使用队列创建在O(n)中起作用的工作代码。 Under是我到目前为止用treeMap做的事情,但是我在理解treeMap类时遇到了问题。我似乎没有找到正确的工具使用。现在它消除了最早的价值而不是最早的价值。我试图将值与索引配对,但我无法比较这些值以找到最大值。

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()
   }
}

如果有人甚至可以用这个东西推动我前进,我会很高兴。

1 个答案:

答案 0 :(得分:1)

您有read TreeMap文档吗?

  

基于红黑树的NavigableMap实现。地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序。

     

此实现为containsKey,get,put和remove操作提供了有保证的log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。

所以它是一个排序的数据结构。虽然它没有说,你可以假设firstKeylastKey是常数时间或O(log N),所以调用put中的四个,{{1 },firstKeylastKey给你O(log N)绑定。

为了使其工作,您需要为树映射的构造函数提供关键如何排序的提示。 Scala(您要求隐式转换参数remove)和A => Ordered[A]构造函数(不知道此参数)之间存在一些不匹配的情况,所以它是不匹配的&#34;使用其键的自然顺序&#34;,在您的情况下可能是也可能不正确。

如果您想确保正确排序密钥,则应确保TreeMap或明确A <: Comparable

由于您存储的值与键和值相同,并且您从不使用该值,因此您可以将其设为Comparator,或者确实为TreeMap[A, Unit]。您还可以将TreeSet换成适当的Scala集合,例如java.util.TreeMap。这确保了通过collection.mutable.SortedSet(所谓的类型类)的实例进行排序。它具有相同的方法Ordering[A]firstKey

提示:要在窗口滑动时删除最旧的值,维护第二个快速添加和删除第一个或最后一个元素的数据结构没有任何问题。您的问题还提到了这种数据结构。