我正准备参加技术访谈,并且主要面对基于情境的问题。通常情况是一个大数据集,我被要求决定使用哪种最佳数据结构。
我熟悉大多数数据结构,它们的实现和性能。但是当遇到情况并对结构起决定作用时,我陷入两难境地。
在特定情况下寻找可以帮助我在面试时间内达到最佳数据结构的步骤/算法。
答案 0 :(得分:1)
这取决于您需要哪些操作才能有效支持。
让我们从最简单的例子开始 - 你有一个很大的元素列表,你必须找到给定的元素。让我们考虑各种候选人
您可以使用排序数组使用二进制搜索在O(log N)时间内查找元素。如果您想支持插入和删除,该怎么办?在最坏的情况下,将元素插入到已排序的数组中需要O(n)时间。 (想想在开头添加一个元素。你必须将所有元素向右移动一个位置)。现在来到二叉搜索树(BST)。它们可以支持在O(log N)时间内插入,删除和搜索元素。
现在你需要支持两个操作,即查找最小值和最大值。在第一种情况下,它只是分别返回第一个和最后一个元素,因此复杂度为O(1)。假设BST是一个平衡的,如红黑树或AVL树,找到最小值和最大值需要O(log N)时间。考虑另一种情况,您需要返回第k个订单统计信息。再次,排序数组获胜。正如你所看到的那样,有一个权衡取决于你给出的问题。
让我们再举一个例子。您将获得V顶点和E边的图形,您必须在图中找到连接组件的数量。可以使用深度优先搜索(假设邻接列表表示)在O(V + E)时间内完成。考虑另一种情况,即逐渐添加边缘,并且可以在过程中的任何时间点询问连接的组件的数量。在这种情况下,可以使用具有秩和路径压缩启发式的Disjoint Set Union数据结构,并且在这种情况下速度非常快。
还有一个例子 - 您需要支持范围更新,有效地查找子阵列的总和,并且没有新元素插入到数组中。如果您有一个包含N个元素的数组并且给出了Q查询,那么有两个选择。如果范围和查询仅在" all"之后出现。更新操作是Q'在数量上。然后,您可以在O(N + Q')时间内预处理数组,并在O(1)时间内回答任何查询(存储前缀总和)。如果没有执行此类订单怎么办?您可以使用具有延迟传播的段树。它可以在O(N log N)时间内构建,并且每个查询可以在O(log N)时间内执行。所以你总共需要O((N + Q)log N)时间。再次,如果支持插入和删除以及所有这些操作会怎么样?您可以使用名为Treap的数据结构,这是一种概率数据结构,所有这些操作都可以在O(log N)时间内执行。 (使用隐式treap)。
注意: 使用Big Oh表示法时省略常量。其中一些有很大的常数隐藏在它们的复杂性中。
答案 1 :(得分:0)
从常见的数据结构开始。使用数组,哈希表,列表或树(或它们的简单组合,例如hastables或类似的数组)可以有效地解决问题吗?
如果有多个选项,只需迭代常用操作的运行时。通常,一个数据结构在为面试设置的场景中是明显的赢家。如果没有,请告诉面试官你的发现,例如: “A需要O(n ^ 2)来构建,但是然后查询可以在O(1)中处理,而B构建和查询时间都是O(n)。所以对于一次性使用,我会使用B,否则A“。在某些情况下,空间消耗可能也是相关的。
高度专业化的数据结构(例如前缀树又称“Trie”)通常是:对一个特定的特定情况高度专业化。面试官通常应该对您从现有的通用库中构建有用的东西的能力更感兴趣 - 反对了解可能没有太多真实世界用途的各种奇异数据结构。也就是说,额外的知识永远不会伤害,只是准备好讨论你所提到的利弊(面试官可能会探究你是否只是“名字掉落”)。