我刚刚接受了软件面试。其中一个问题是以高度优化的方式设计具有三种方法 insert、delete 和 getRandom 的任何数据结构。面试官让我想出一种数据结构的组合来设计一个新的。无论如何都可以设计插入,但对于随机和删除,我需要获取特定元素的位置。他给了我一个提示,让我考虑一下排序所需时间最短的数据结构。
欢迎任何回答或讨论......
我刚刚接受了软件面试。其中一个问题是以高度优化的方式设计具有三种方法 insert、delete 和 getRandom 的任何数据结构。面试官让我想出一种数据结构的组合来设计一个新的。无论如何都可以设计插入,但对于随机和删除,我需要获取特定元素的位置。他给了我一个提示,让我考虑一下排序所需时间最短的数据结构。
欢迎任何回答或讨论......
让t
成为您要存储在数据结构中的元素的类型。有一个包含所有元素的可扩展数组elements
,没有特定的顺序。有一个哈希表indices
,将类型元素映射t
到它们在elements
.
e
装置
e
在末尾添加elements
(即push_back),得到它的位置i
(e,i)
插入到 `indicese
手段
i
的位置e
elements
indices
e
元素覆盖f
elements
indices
:删除映射(f,indices.size())
并插入(f,i)
peek
,不是pop
)只是i
在其中绘制一个整数[0,elements.size()[
并返回elements[i]
.假设哈希表非常适合您的 type 元素t
,那么所有三个操作都是 O(1)。
请注意数据结构中有 0 个或 1 个元素的情况。
一棵树可能在这里工作得很好。命令 log(n) 插入和删除,并选择 random 也可以是 log(n):从根节点开始,在每个连接处随机选择一个子节点(由每个子节点的叶子节点总数加权),直到达到叶子。
排序所需时间最少的数据结构是有序数组。
get_random() 是二分查找,所以 O(log n)。
insert() 和 delete() 涉及添加/删除有问题的元素,然后重新使用,这是 O(n log n),例如可怕的。
我认为他的暗示很糟糕。你的面试可能很糟糕。
可能是堆(数据结构)
我觉得你可以使用一些平衡版本的树,比如红黑树。这将给出 O(log n) 的插入和删除时间。为了获取随机元素,您可能可以有一个额外的哈希表来跟踪树结构中的元素。