c ++有序(稳定)优先级队列

时间:2015-03-03 15:59:58

标签: c++ algorithm sorting stl priority-queue

我正在实施一个玩具调度程序,它读取进程规格的输入文件,如到达时间,总运行时间,然后根据随机的io / cpu突发调度进程。

该文件的格式为

  

到达时间,总CPU时间,CPU突发,IO Burst。

现在,当有两个进程具有相同的到达时间时,调度程序必须首先安排进程首先在文件中提到的进程。

我将文件中的条目保留在优先级队列中。

struct EventComparator{
  bool operator()(const Event* event1, const Event* event2){
    return event1->getTimestamp() >= event2->getTimestamp();
  }   
};  
priority_queue<Event*, vector<Event*>, EventComparator> eventQueue;

其中Event只是一个封装过程参数的对象。

我的问题是,优先级队列不稳定。稳定我的意思是过程的顺序颠倒过来。

假设输入文件有

  

60 200 5 20

     

60 20 10 10

     

40 100 10 40

     

0 200 40 90

如果我从优先级队列弹出,我期望Line4,第3行,第1行,然后是Line2。但我得到了Line4,Line3,Line2,Line1。

我的问题是,我该怎样做才能获得稳定的优先级队列?

1 个答案:

答案 0 :(得分:7)

  1. 您的比较器不正确。 std::priority_queue的{​​{3}}表示它应该提供严格的弱排序(即event1->getTimestamp() > event2->getTimestamp(),而不是>=)。

  2. 为了使其稳定,您只需将行号存储在Event内,并在event1->getTimestamp() == event2->getTimestamp()时进行比较。

  3. 这样的事情:

    struct EventComparator {
      bool operator()(const Event* event1, const Event* event2) {
        if (event1->getTimestamp() != event2->getTimestamp()) {
          return event1->getTimestamp() > event2->getTimestamp();
        }
        return event1->getLineNumber() > event2->getLineNumber();
      }   
    };