HashSet常量时间操作的大小操作如何?
我读到包含和大小操作是恒定时间
虽然我理解包含是否是一个恒定时间操作,但是不会将大小操作与元素数量成比例(非线性)吗?
答案 0 :(得分:2)
简短的回答 - 它是缓存的。
答案越长:
HashSet
是Set
实现,其中包含HashMap
,其中所有值都是相同的“虚拟值”。它的size()
方法只返回地图的size()
。如果您查看HashMap
的实施,您会看到它有一个size
成员。向地图添加元素(例如,使用put
或putAll
)会增加size
并从中删除元素会减少size
。这样,由于size
始终保持最新,因此可以在调用size()
时简单地返回它,从而保证恒定的时间执行。
答案 1 :(得分:2)
HashSet在内部存储它有多少元素。
不同大小的操作与元素数量成比例(非线性)吗?
如果这不是存储在用于记录保存的字段中,则size()将与支持哈希表的大小成比例,而不是元素的数量,因为您必须扫描所有条目以查看是否存在某些内容。它们往往是相同的(在2x之内),除非哈希表被分配为显着太大或者删除了很多元素。