数据结构:插入,删除,包含,获取随机元素,全部在O(1)
||
采访中给了我这个问题。您将如何回答?
设计一个数据结构,以在O(1)时间内提供以下操作:
插
去掉
包含
获得随机元素
没有找到相关结果
已邀请:
13 个回复
募磷
屠创氓读叔
粱委教
,但至关重要的是,哈希表实现通常将其保持在恒定的乘法范围内(例如,该表可以比其当前内容大1.2) x至〜10x,具体取决于性能/内存调整)。这意味着我们平均可以搜索1.2到10个桶-完全独立于容器的总大小;摊销O(1)。 我可以想象出两种简单的方法(还有很多更巧妙的方法): 从随机桶中线性搜索 考虑空/值存储桶ala \“-AC ----- B--D \”:您可以说第一个“ random”选择是公平的,即使它偏爱B,因为B不再比其他元素更容易受到偏爱的可能性,但是如果您使用相同的值进行重复的“随机”选择,那么显然反复受到偏爱B可能是不希望的(尽管,问题中甚至没有要求概率) 反复尝试随机存储桶,直到找到一个填充的桶 “仅”访问的平均存储桶容量()/大小(如上所述)-但实际上更昂贵,因为随机数生成相对昂贵,并且如果无限不可能的最坏情况行为则无限坏... 更快的折衷方法是使用从初始随机选择的存储桶中预先生成的随机偏移量列表,将其%添加到存储桶计数中 这不是一个很好的解决方案,但是与始终保持第二个索引数组的内存和性能开销相比,这可能是一个更好的总体折衷方案。
超可林
坍锭嘉韭蓝
-时间复杂度O(1)。 -空间复杂度O(N)。
爆山
刷骸码
这是一段测试该解决方案的客户端代码。
恋裂
扩展方法
来索引存储
元素的基础动态数组:
但是,据我所知,哈希表(或其字典后代)不是此问题的真正解决方案,因为Put()只能摊销O(1),而不是真正的O(1),因为它是O(N )在动态调整大小边界。 是否有解决此问题的真正方法?我能想到的就是,如果您指定的Dictionary / Hashtable初始容量超出预期的数量级,那么您将获得O(1)操作,因为您无需调整大小。
济畦刨
枫湃揩乾纲
骨乏唯瓜
莽缓逢
联课