在{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比较,等等。
答案 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。