gpt4 book ai didi

c++ - 搜索并找到最短队列并在某些条件后搜索

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:06 26 4
gpt4 key购买 nike

我正在尝试实现一个任务调度程序,其中我有 n 个任务。我的任务调度器背后的想法是,在 vector 的队列循环中,任务应该排入队列循环中最短的队列,这是通过以下代码完成的。

#include <vector> 
#include <queue>
std::vector<std::queue<int> > q
int min_index = 0;
task t // implemented in the other part of the program
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
q[min_index].push(Task);

接下来我试图扩展这个范例以减少调度程序的开销时间,而不是每次都搜索最短队列,而是在某些条件之后搜索,即。 5个任务入队到最短队列后搜索最短队列。

我需要做这样的事情

#include <vector> 
#include <queue>
std::vector<std::queue<int> > q
task t // implemented in the other part of the program
while(q[min_index].size()!=q[min_index].size()+5) // check whether current min_index queue's size is increased 5 more times if not goto enqueue
{
goto enqueue;
}

int min_index = 0;

std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
enqueue:
q[min_index].push(Task);

有人可以帮助我如何正确进行吗?提前致谢

已更新我没有使用 5(一个随机数),而是想到了一个每次都可靠且近似的数字。所以我想得到队列循环的 min_value 大小和 max_value 大小的差异,并每次都将其与计数器进行比较。

// global variables 
std::vector<std::queue<int> > q;
int counter = INT_MAX; //
int min_index = 0;
int max_size = -1;

void enqueue(scheduler::task new_task) {
if ( counter > diff_size ){
// look for new min and maximum
std::size_t size = q.size();
for( i=0; i<size; i++){
if(q[min_index].size() > q[i].size())
min_index = i;
if(q[i].size() > max_size)
max_size = q[i].size();
diff_size=max_size - min_index;
}
// counter reset
counter = 0;
}

// enqueue in minimum queue
q[min_index].push(new_task)

// increase counter
counter ++;
}

最佳答案

我想我会试试这个(代码确实可以编译,而且确实有效):

#include <vector> 
#include <queue>
#include <cassert>
#include <iostream>
using namespace std;

class multi_queue{
private:
typedef std::vector<std::queue<int> > mq_type;
mq_type q;
int min_queue;
int min_queue_inc;
int max_inc;
void find_min_queue(){
max_inc=q[min_queue].size();
min_queue_inc=0;
min_queue=0;
for(int i=1;i<q.size();++i)
if(q[i].size()<q[min_queue].size())
min_queue=i;
}
public:
multi_queue(int n) {
assert(n>0);
min_queue=0;
min_queue_inc=0;
max_inc=5;
increase_queues(n);
}
void increase_queues(int n){
if(n<q.size()) return;
q.resize(n);
}
void push(int item){
if(min_queue_inc++==max_inc)
find_min_queue();
q[min_queue].push(item);
}
int queues() const {
return q.size();
}
int pop_from(int qnum){
assert(qnum>=0);
assert(qnum<q.size());
assert(can_pop_from(qnum));
int temp=q[qnum].front();
q[qnum].pop();
return temp;
}
bool can_pop_from(int qnum) const {
return q[qnum].size()>0;
}
int largest_queue() const {
int largest=0;
for(int i=1;i<q.size();++i)
if(q[i].size()>q[largest].size())
largest=i;
return q[largest].size();
}
};


int main(){
multi_queue q(10);
for(int i=0;i<100;++i){
cout<<"Current largest queue: "<<q.largest_queue()<<endl;
cout<<"Pushing: " <<i<<endl;
q.push(i);
}

for(int i=0;i<10;++i)
for(int j=0;j<100;++j)
if(q.can_pop_from(i))
cout<<q.pop_from(i)<<endl;
}

当然,您不会希望每次都显示 q.largest_queue(),因为那样会破坏重点,但我在这里这样做是为了让您能够看到一切正常。

从回答问题的角度来看,重要的方法是 push()find_min_queue()

我使用两个状态变量,min_queuemin_queue_inc 来跟踪正在发生的事情。

min_queue 总是指向最短队列。 min_queue_inc 跟踪已添加到该队列的项目数。

push() 中,我们检查当前最小队列是否有 5 个项目添加到其中;如果是这样,是时候看看是否有我们应该使用的新的最小队列,因此我们调用 find_min_queue()

find_min_queue() 重置 min_queue_inc,找到最短队列,并在 min_queue 中记下该队列。

根据您想要执行的操作,调整变量 max_inc 的行为以满足您的需要。

关于c++ - 搜索并找到最短队列并在某些条件后搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273338/

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