Data structures 什么';处理客户订单的最佳数据结构是什么?

Data structures 什么';处理客户订单的最佳数据结构是什么?,data-structures,linked-list,queue,priority-queue,Data Structures,Linked List,Queue,Priority Queue,我在考虑队列(FIFO),但如果在某个时候我需要对订单进行优先级排序,例如:任何包含牛奶的订单都应该被推到队列的后面,直到牛奶可用,然后一旦牛奶到了,我应该将这些订单放回其以前的状态 如果我在这里使用queue,我的时间复杂度至少会达到bigO(n logn) 有什么建议吗?一种可能是有两种数据结构。使用先进先出(FIFO)保存您拥有所有配料的订单。对正在等待的订单使用不同的数据结构。一旦那东西进来,你就可以把它放进FIFO。添加到队列末尾的当然是O(1)。将其恢复正常需要O(n)时间 如果您希

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

如果我在这里使用queue,我的时间复杂度至少会达到bigO(n logn)


有什么建议吗?

一种可能是有两种数据结构。使用先进先出(FIFO)保存您拥有所有配料的订单。对正在等待的订单使用不同的数据结构。一旦那东西进来,你就可以把它放进FIFO。添加到队列末尾的当然是O(1)。将其恢复正常需要O(n)时间

如果您希望所持有的订单放回队列中它应该放回的位置,那么您可能需要使用订单号(如果是顺序的)或时间的优先级队列

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

我应该澄清,大多数优先级队列实现(在C++、java、python和其他主流语言中)使用后备存储的二进制堆。插入二进制堆是最坏的情况O(logn),但分析表明它通常更接近O(1)。看见您还可以实现一个配对堆或其他高级堆类型,它具有O(1)分期插入。但同样,除非你每秒处理数千个订单,否则这可能是矫枉过正

另一种选择是,当您获得这些异常订单时,只要在所有必要的项目都可用后将它们推到队列的前面即可。这是一个很容易做到的。这种方法的有效性取决于物品通常排在队列中的时间,以及重新储存用完的物品所需的时间。

“至少是bigO(logn)时间复杂度”是为了什么?O(logn)时间复杂度在某些情况下是完全可以接受的。对不起,我指的是bigO(nlogn)