【问题标题】:How to iterate from a given key in Java TreeMap如何从 Java TreeMap 中的给定键迭代
【发布时间】:2021-10-01 13:14:43
【问题描述】:

我有一个 TreeMap,并且想要获得一组大于给定值的 K 个最小键(条目)。

我知道我们可以使用higherKey(givenValue) 获取唯一键,但是我应该如何从那里迭代呢?

一种可能的方法是从大于给定值的最小键中获取tailMap,但如果 K 与映射大小相比较小,那就有点过头了。

O(logn + K) 时间复杂度有没有更好的方法?

【问题讨论】:

  • 使用tailMap 是正确的解决方案。请注意,构建尾图是一种廉价的操作,因为它只是原始数据的视图。把它想象成Iterator。或者换一种说法:为什么你认为构建tailMap 是多余的吗?您认为它具有哪些性能特点?
  • @JoachimSauer 我在想 tailMap 是 O(n) 但我们只需要 O(k) 如果 k

标签: java binary-search treemap


【解决方案1】:

这里的错误是认为tailMap 制作了一张新地图。它没有。它为您提供了一个轻量级对象,该对象基本上只包含一个指向原始地图的字段和轴心点,这就是它的全部内容。因此,您对 tailMap 地图所做的任何更改也会影响基础地图,对基础地图所做的任何更改也会影响您的 tailMap。

for (KeyType key : treeMap.tailMap(pivot).keySet()) {
}

上面的 IS O(logn) 复杂度为 tailMap 操作,并给你循环,这增加了 K 到地段,总计 O(logn+K) 时间复杂度,和 O(1) 空间复杂度,其中 N 是映射的大小,K 是最终位于枢轴点选定一侧的键的数量(因此,最坏的情况是 O(nlogn))。

如果你想要一个实际的复制地图,你可以这样做:

TreeMap<KeyType> tm = new TreeMap<KeyType>(original.tailMap(pivot));

请注意,如果您指定了自定义比较器,这也会复制使用的比较器。那一个在时间复杂度上确实是O(logn + K)(在空间复杂度上是O(K))。当然,如果你遍历这段代码,它仍然是.. O(logn + K)(因为在谈到大 O 表示法时,2K 只是归结为 K)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2012-12-23
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多