【问题标题】:What's the best data structure to handle customers orders?处理客户订单的最佳数据结构是什么?
【发布时间】:2020-09-19 08:10:25
【问题描述】:

我正在考虑队列 (FIFO),但如果在某些时候我需要对订单进行优先级排序,例如:任何包含牛奶的订单都应该被推到队列的后面,直到牛奶可用,然后一旦牛奶在吗?我应该把这些订单恢复到以前的状态。

如果我在这里使用队列,我最终会得到至少 bigO(n log n) 的时间复杂度。

有什么建议吗?

【问题讨论】:

  • “至少 bigO(logn) 时间复杂度”是为了什么? O(log n) 时间复杂度对于某些事情是完全可以接受的。
  • 对不起,我的意思是 bigO(nlogn) ????????‍♂️

标签: data-structures linked-list queue priority-queue


【解决方案1】:

一种可能性是有两种数据结构。使用 FIFO 来保存您拥有所有成分的订单。对等待某事的订单使用不同的数据结构。一旦那个东西进来,你就可以把它放在FIFO中。添加到队列的末尾当然是 O(1)。把它按顺序放回去需要 O(n) 时间。

如果您希望将保留的订单放回队列中应该去的位置,那么您可能需要一个使用订单号(如果它们是连续的)或时间的优先级队列。

虽然从优先级队列中插入或删除需要 O(log n) 时间,但除非您每秒处理数千个订单,否则这不会成为问题。插入最坏的情况是 O(log n),但在像你这样的系统中,优先级队列通常只是一个有一些异常的 FIFO,预期的插入将接近 O(1)。

我应该澄清一下,大多数优先级队列实现(在 C++、Java、Python 和其他主流语言中)使用二进制堆作为后备存储。插入二叉堆是最坏的情况 O(log n),但分析表明它通常更接近 O(1)。见Argument for O(1) average-case complexity of heap insertion。您还可以实现配对堆或其他高级堆类型,它具有 O(1) 摊销插入。但同样,除非您每秒处理数千个订单,否则这可能是矫枉过正。

另一种选择是,当您获得这些例外订单时,只需在所有必要的项目都可用后将它们推送到队列的前面。使用double-ended queue 很容易做到这一点。这在某种程度上取决于物品通常在队列中等待多长时间,以及重新库存用完的物品需要多长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2018-07-17
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多