【问题标题】:Design a highly optimized datastructure to perform three operations insert, delete and getRandom设计一个高度优化的数据结构来执行三个操作insert、delete和getRandom
【发布时间】:2012-06-27 09:01:45
【问题描述】:

我刚刚接受了一次软件面试。其中一个问题是以高度优化的方式设计具有三种方法 insert、delete 和 getRandom 的任何数据结构。面试官让我想出一种数据结构的组合来设计一个新的。无论如何都可以设计插入,但对于随机和删除,我需要获取特定元素的位置。他给了我一个提示,让我思考一下排序所需时间最短的数据结构。

欢迎任何回答或讨论....

【问题讨论】:

  • getRandom应该返回一个随机元素还是随机访问?
  • typedef std::deque<sometype> datastructure_t; 插入、随机访问、删除,全部覆盖。您可能不需要比 O(1) 更快的速度。
  • 应该返回一个随机元素..
  • @Damon:双端队列具有“中间元素的线性时间插入和删除”(sgi.com/tech/stl/Deque.html)。因此,如果需要从数据结构中删除任意元素,它将是 O(n)。

标签: optimization data-structures


【解决方案1】:

t 成为您要存储在数据结构中的元素的类型。 有一个可扩展数组elements,其中包含不按特定顺序排列的所有元素。有一个哈希表 indicest 类型的元素映射到它们在 elements 中的位置。

  • 插入e 表示
    • elements末尾添加e(即push_back),得到它的位置i
    • 将映射(e,i) 插入`indices
  • 删除e 表示
    • elements 中找到ei 位置,感谢indices
    • elements 的最后一个元素f 覆盖e
    • 更新indices:删除映射(f,indices.size())并插入(f,i)
  • 随机绘制一个元素(将其留在数据结构中,即peek,而不是pop)只是在[0,elements.size()[ 中绘制一个整数i 并返回elements[i]

假设哈希表非常适合 t 类型的元素,所有三个操作都是 O(1)。

注意数据结构中有 0 个或 1 个元素的情况。

【讨论】:

    【解决方案2】:

    一棵树可能在这里工作得很好。命令 log(n) 插入和删除,并选择 random 也可以是 log(n):从根节点开始,在每个连接处随机选择一个子节点(由每个子节点的叶子节点总数加权),直到达到叶。

    【讨论】:

    • 我认为你的意思是平衡 BST 否则删除将需要 O(n) 时间。
    【解决方案3】:

    排序耗时最少的数据结构是有序数组。

    get_random() 是二分查找,所以 O(log n)。

    insert() 和 delete() 涉及添加/删除有问题的元素,然后重新使用,即 O(n log n),例如太可怕了。

    我认为他的暗示很糟糕。你的面试可能很糟糕。

    【讨论】:

    • 我将“排序所需时间最短的数据结构”理解为“用于 O(n log n) 排序算法的数据结构”。在这种情况下,正如@AlexWilson 所建议的那样,二叉树确实允许在 O(log n) 中执行所有三个操作。
    【解决方案4】:

    我觉得你可以使用一些平衡版本的树,比如红黑树。这将给出 O(log n) 的插入和删除时间。 为了获取随机元素,您可能可以有一个额外的哈希表来跟踪树结构中的元素。

    【讨论】:

      【解决方案5】:

      【讨论】:

        猜你喜欢
        • 2013-10-25
        • 2012-11-02
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2012-08-27
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多