在最小堆中找到第7个最小的元素

时间:2018-06-20 05:41:32

标签: algorithm data-structures time-complexity heap

在{n}个元素中,最小元素位于根的DISCOUNTS_BY_QUANTITY = { 10_000 => 20, 1_000 => 15, 100 => 10, 10 => 5, } Input.cart.line_items.each do |line_item| next if line_item.variant.product.gift_card? quantity, discount = DISCOUNTS_BY_QUANTITY.find do |quantity, _| line_item.quantity >= quantity end next unless discount message = "#{discount}% off when buying at least #{quantity}." line_item.change_line_price( line_item.line_price * (Decimal.new(1) - discount.to_d / 100), message: message, ) end Output.cart = Input.cart 中,可以在时间上找到第7个最小元素-

min-heap

================================================ =========================

我对选项a) Θ(nlogn) b) Θ(n) c) Θ(logn) d) Θ(1) c感到困惑。我们需要提取d还是只是像在根级别进行比较-0比较,在1级进行比较-根与LC和RC之间的3比较,等等。

4 个答案:

答案 0 :(得分:4)

我会说这个问题不明确。

如果我们必须使用堆接口,那么我们要做的就是提取至少6次并查看第7个最小值。每次除最后一次外,我们可以花费从1(最佳情况)到log n(最坏情况)的任何地方,因此它是O(log n)而不是Theta。第7个操作是Theta(1)

如果我们可以利用堆的内部结构,就像伊夫·达乌斯特(Yves Daoust)指出的那样,我们可以确定堆的前7个层中包含的最小元素数量最多为1 + 2。 + 4 + 8 + 16 + 32 + 64 = 127个元素。在存储堆的数组的前127个数字中找到一个最小值为Theta(1),因为无论多大,127仍然是一个常数并且不依赖于n

在第一种情况下,看到选项(c)并不是一个正确的答案(如果使用O()而不是Theta()),我会选择{{1} }。

答案 1 :(得分:2)

在最小堆中,元素的存储方式不像二进制搜索树(即,左侧小于根,右侧大​​于)。较小的元素可以出现在任何子节点上,因此,我们无法像在二叉搜索树中那样搜索元素。

因此,我们需要首先从堆中弹出前6个元素并将其存储在数组中,现在第7个元素位于根目录上,因此我们将其弹出并存储。现在,我们将先前弹出的所有6个元素推入堆中。

时间复杂度:-要弹出7个操作,再按6个操作,因此总共需要7 + 6 = 13个操作。并且每次操作花费登录时间。 因此,时间复杂度变为13 * logn或仅变为O(logn)

答案 2 :(得分:2)

在最坏的情况下,将在堆的前7个级别中找到第7个元素 ,其中最多包含127个元素。您可以通过对这些元素进行排序来找到它,这需要O(1)。

注意:这并不是一个有效的过程,它只是一个简单的理论论据,证明可以在恒定时间内解决问题。

一个可能更好的过程是在127个元素的堆上执行heapsort的选择阶段,这将更加糟糕,例如lg 127 + lg 126 + lg 125 + lg 124 + lg 123 + lg 122 + lg 121操作(非常总估算,但这并不重要,它是O(1))。

答案 3 :(得分:0)

答案将是O(n)。这里的每个人都假设您将在一个恒定范围内找到答案,因此O(1)将成为答案,但他们错过了最小堆可以拥有的一点重复。假设第六个最小的元素具有一百万个重复项,那么当甚至不给出重复数的情况下如何计算范围,最重要的是,最后一个元素是第七个最小的元素,您将必须搜索整个数组。因此答案是n。