这是最近一次采访问题。请设计一个具有插入,删除,随机的数据结构o(1)时间复杂度,数据结构可以是数组等基本数据结构,可以是基本数据结构的修改,也可以是基本数据的组合结构。
答案 0 :(得分:5)
将数组与元素的哈希映射组合到数组索引。
插入可以通过附加到数组并添加到哈希映射来完成。
删除可以通过先查找并删除哈希映射中的数组索引,然后将最后一个元素与数组中的元素交换,适当更新前一个元素的索引,并将数组大小减小一(删除最后一个元素。)
可以通过从数组中返回随机索引来完成随机。
所有操作都需要O(1)。
嗯,实际上,它是从预期的哈希冲突(预期的哈希冲突)O(1)分摊(从调整数组大小),但足够接近。
答案 1 :(得分:2)
基数树可以工作。见http://en.wikipedia.org/wiki/Radix_tree。插入和删除是O(k),其中k是键的最大长度。如果所有键的长度相同(例如,所有指针),则k是常量,因此运行时间为O(1)。
为了实现get random,维护每个子树中叶子总数的记录(O(k))。树中的叶子总数记录在根部。要随机选择一个,生成一个随机整数来表示要选择的元素的索引。递归地向下扫描树,始终跟随包含所选元素的分支。您总是知道要选择哪个分支,因为您知道每个子树可以到达多少个叶子。树的高度不超过k,所以当k是常数时,这是O(k)或O(1)。