我试图找出Java基本集合上的操作的复杂性(使用big-o表示法)。与此{+ 3}}中的C ++语言类似。
以下是我所拥有的,使用常识:
TreeSet
注意:基于散列的集合假定设计良好的散列函数位于 O(1)中,否则它位于 O(n)
问题: 这是对的吗?
答案 0 :(得分:2)
关于此的最佳知识来源是文档。这是我可以通过快速搜索或两个找到的。
size
,isEmpty
,get
,set
,iterator
和listIterator
操作会在固定时间内运行。add
操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。
所有操作的执行都与双向链表一样。索引到列表中的操作将从开头或结尾遍历列表,以较接近指定索引为准。
从我记得的双向链表,我会说你的“常识假设”是正确的。
该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。迭代此集合需要的时间与HashSet实例的大小(元素数量)加上后备HashMap实例的“容量”(桶数)之和成比例。
与HashSet类似,它为基本操作(添加,包含和删除)提供了恒定时间性能,假设哈希函数在桶之间正确地分散元素。由于维护链表的额外费用,性能可能略低于HashSet的性能,但有一个例外:对LinkedHashSet的迭代需要与集合大小成比例的时间,而不管其容量如何。对HashSet的迭代可能更昂贵,需要与其容量成比例的时间。
此实现为基本操作(添加,删除和包含)提供了有保证的log(n)时间成本。
此实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要与HashMap实例的“容量”(桶数)加上其大小(键值映射的数量)成比例的时间。
与HashMap一样,它为基本操作(添加,包含和删除)提供了恒定时间性能,假设哈希函数在桶之间正确地分散元素。性能可能略低于HashMap,...
此实施为
containsKey
,get
,put
和remove
操作提供了有保证的log(n)时间成本。
如果未提及某些方法,请尝试查找该特定方法。如果文档中没有提到运行时间,则可能与实现有关。