gpt4 book ai didi

java - 如何解决优先队列池?这是最好的选择吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:33 25 4
gpt4 key购买 nike

这是关于 how to represent priorities 的一个跟进问题
这些答案指导我将设计基于 Priority Queue ADT

我的问题是我无法弄清楚如何建模这个问题(我理解PQ 是如何工作的)。
所以使用我原来的(简单的例子)假设我有 PersonA PersonB ...PersonY (表示为类)它喜欢各种菜肴 披萨 Spaggeti 牛排
我想找到一种方法来根据 Preference 指定应该为希望的人提供哪道菜(这可能是一个额外的类(class),作为 friend 在开始问题线程的答案中也建议)。
我不确定应该如何建模。我的第一个想法是为每道菜(PizzaPQSpaggetiPQ 等)创建一个PriorityQueue,将每个队列放入all Persons 并开始从每个队列中移除顶部(作为对该菜具有最大偏好的队列)并从其他队列中移除该 Person。此过程按顺序遍历所有队列。
现在虽然在概念上它似乎是正确的(但这不是最好的方法,因为我认为由于过程本身会出现差异),但我不认为我在正确的轨道上,因为

  1. 从其他队列中移除是线性操作(我说的是 remove(Object),其中 Object 已经被送达 Pizza 并且不应该再在其他队列中)并且会花费O(N*k) 其中 k 是队列的数量(在我看来这在第一个优先级队列的使用中添加了很多地点)
  2. 在我看来,我需要一些抽象来处理“池”priority queues 我不确定是否真的有这样的数据结构,我不知道。

我想这个问题可以概括为如何分配作业或如何操作多个队列(也许?)
必须有一个标准的设计方法来解决这些问题。
非常欢迎任何输入

@Thomas 回答后更新:
问题稍微复杂一些。
除了偏好之外,可能还有其他(一个人的)属性。
例如。 PersonAPersonB 都喜欢牛排胜过其他任何菜。但是 PersonA 胆固醇很高,而 PersonB 是一名运动员。以某种方式考虑这些属性,那么 PersonB 应该得到牛排。也许 PersonA 最终可能会得到其他东西。
这就是为什么我最初想到菜品的PQs

最佳答案

这个应用程序是否可以在多线程环境中执行?如果是这样,我有一些想法可以提供帮助。

  1. 创建一个调度程序线程,其工作是获取一个 Person 对象并将其分配给一个 PQ。假设一个人应该只在 1 个 PQ 上,这有助于解决您从上述其他 PQ 中删除 Person 的问题。这会将 Person 应该放置在何处的逻辑(和 CPU 处理时间)从代码的 PQ 执行部分移开,从而使 PQ 更具凝聚力并降低其与 Person 的耦合。如果一个人可能在多个 PQ 上,或者您想将他们从一个 PQ 移动到另一个 PQ,等等,这应该在调度程序代码中执行。

  2. 如果 PQ 多于可用线程,则为 PQ 创建一个线程池,否则只需为每个 PQ 创建一个线程。这样您就不必担心如何迭代 PQ 和可能的 PQ 饥饿。处理 PQ 和 Person 对象的代码对于每个线程都是相同的。

即使您不使用多线程模型,我也会考虑让 Person 对象继承自 PQ 知道的 PQitem 对象,这样 PQ 就不必知道有关 Person 对象的任何信息,可能是这样的: (对不起,C++,但我想你明白了)

class PQitem
{
public:
virtual void execute() = 0;
virtual void getPriority() = 0;
private:
// PQ specific stuff here
};

class Person : public PQitem
{
public:
void execute() { /* logic executed when taken off the PQ */ }
void getPriority() { /* logic used to determine where to place this Person */ }
};

关于java - 如何解决优先队列池?这是最好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com