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在时间复杂度方面是更好或更有效的实现方式。我的理解是否正确?哪种方式更好用。
答案 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;元件。