搜索并找到最短的队列,并在某些条件后搜索
search and find the shortest queue and search after some condition
我正试图实现一个任务调度程序,我有n个任务。我的任务调度器背后的想法是,在一个向量的队列循环中,任务应该进入队列循环中最短的队列,这是由下面的代码完成的。
#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_queue
和min_queue_inc
来跟踪正在发生的事情。
min_queue
总是指向最短的队列。min_queue_inc
跟踪有多少项已添加到该队列。
在push()
中,我们检查当前最小队列是否添加了5个条目;如果是这样,就应该看看是否有一个新的最小队列,因此调用find_min_queue()
。
find_min_queue()
重置min_queue_inc
,找到最短的队列,并在min_queue
中记录该队列。
根据您想要做的事情,调整变量max_inc
的行为以适应您的需要。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 有根的二进制搜索树.保留与其父级的链接
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 使用不变量来确定二分搜索中的边界条件
- 根据条件和优先级搜索容器中的项目
- 如何在Char数组中搜索Char在IF条件语句中
- C++,使用自己的条件搜索文件中的字符串
- C++ 具有多个向量条件的二叉搜索
- 具有两个搜索条件的C++关联容器
- 派生类中的搜索函数,循环条件
- 搜索并找到最短的队列,并在某些条件后搜索
- 二叉搜索条件