获得树形图中最高密钥的更好方法是什么?

时间:2016-02-05 04:43:07

标签: java time-complexity treemap

Way1:

TreeMap<Integer, String> map = new TreeMap<Integer, String>();
int highestKey = map.lastKey();

来自JDK的TreeMap.lastKey()的源代码:

 Entry<K,V> p = root;
        if (p != null)
            while (p.right != null)
                p = p.right;
        return p;

Way2:

TreeMap<Integer, String> map = new TreeMap<Integer, String>();
Object[] keys = map.keySet().toArray();
int highestKey = keys[keys.length - 1]

当你研究lastKey()的实现时,我们看到我们有一个while循环。我认为时间的复杂性是O(n)。

这让我认为Way2在时间复杂度方面是更好或更有效的实现方式。我的理解是否正确?哪种方式更好用。

2 个答案:

答案 0 :(得分:1)

我认为你弄错了,Way 2的JDK实现的时间复杂度为O(logn)而不是O(n),没有额外的空间复杂性。它是一棵红黑树(即平衡的)。

在提到的keyset().toArray()中,您使用object []获取所有密钥,即O(n),同时将(:xpath, '//*[@id="domcop-table_wrapper"]/div[not(contains(text(), "Display")) and not(contains(text(),"records"))]/descendant::li[@class="next"]/a/i[@class="icon-double-angle-right"]') 中的密钥存储在O(n)的额外空间复杂度中也是。

通过这些,JDK实现具有更好的时间和空间复杂性。

答案 1 :(得分:0)

如果您使用binary max-heap,那么&#34;最大的&#34; element将始终是树的根节点,您可以在O(1)时间内获取它。

我不认为它有Java实现,所以你必须自己编写代码。

或者,为TreeMap提供一个自定义比较器以翻转元素的顺序,因此您想要的数据位于根目录,再次进行O(1)查找&#34;最大的&#34;元件。