我试图找到在TreeMap数据结构中实现的方法values()和keySet()的时间复杂度。
任何人都可以告诉我这些方法的时间复杂程度是什么?
非常感谢。
汤姆
public class SuperStruct<K,V>
{
private Map<K,V> mInternalKeyToValueMap;//all the keys and their values
public SuperStruct(){
mInternalKeyToValueMap = new TreeMap<K,V>();
}
public Collection<V> values() {
return mInternalKeyToValueMap.values();
}
public Collection<K> keySet() {
return mInternalKeyToValueMap.keySet();
}
}
答案 0 :(得分:2)
我希望两者都是懒惰的结构,由实际地图支持的视图,因此创建它们将是O(1)。迭代整个集合将是O(n)(就像在地图上迭代一样)。
但这只是基于keySet()
和values()
方法的合同的合理假设(特别是说返回的结构必须反映底层地图和副方式的变化的部分反之亦然,我不能保证我会知道他们会这样做。
(虽然为了记录,Oracle实现正是如此,并且以任何其他方式实现它会变得相当复杂。但是,这仍然不是铸铁保证。)
答案 1 :(得分:1)
keySet
几乎肯定会使用Collections.newSetFromMap(this),因为这是一种非常有效的方法 - 因此O(1)
。
通过简单的适配器从地图的Collection<V>
创建entrySet
应该非常简单,所以我建议它与entrySet
的复杂性相同O(1)
或O(n)
,但最有可能是O(1)
。有些人在GrepCode浏览来源建议O(1)
- 它只是创建一个新对象(如果需要),它不会增加结构。