【数据结构】队列

1.介绍


1.1 队列


与栈一样,队列(queue)也是一种基本的数据结构,也有两种的基本操作:push和pop;与栈不一样的是,操作限制在队列的两端。push是从队尾(rear)插入元素,即入列;pop是从队首删除元素,即出列。在出列过程中,要判断队列是否为空队列可以用数组进行模拟,也可以用链表作为存储。


1.2 优先级队列


有一种特殊的队列:优先级队列,根据元素的优先级删除元素。比如,优先级高的元素先被删除,这样的队列称为最大值优先级队列(max priority queue);同理,优先级低的元素先被删除,这样的队列被称为最小值优先级队列(min priority queue)。


STL中priority_queue已经实现了优先级队列。模板声明:priority_queue<Type, Container, Functional>。Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list。


若后面两个参数缺省的话,默认优先队列就是最大值优先级队列(大顶堆),队头元素最大。STL里面定义了一个仿函数 greater<>,可以用这个仿函数声明最小值优先级队列(小顶堆):priority_queue<int, vector<int>, greater<int> > q 。


2. Referrence


[1] Darren,priority_queue用法 。


3.问题


3.1 POJ 3125


题目是关于优先级调度,每个job有一个0~9的优先级,优先级高的先打印,同等优先级的在排在队列前面的先打印。


思路:用prio_count[ i ]记录优先级为i的job个数,i的初始值置为9,每一次循环后减1;若i减至priority[m],且队首元素为m,整个循环结束;否则,进入下面的步骤;通过判断队首优先级==i,若相等,则出列;若不等,则将队首元素插入队尾。


一次提交AC,幸之。


源代码:

3125Accepted128K0MSC++906B2013-08-29 15:08:43

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

#define MAX 100

int main()
{
	/*pop_count represents the count of dequeue
	  prio_count represents the count of priority 0 ~ 9*/
	int testcases,n,m,i,pop_count;      
	int priority[MAX],prio_count[10];   
	queue<int>que;
	scanf("%d",&testcases);
	while(testcases--)
	{
		scanf("%d%d",&n,&m);

		/*initialization and clear the queue*/
		pop_count=0;
		memset(prio_count,0,sizeof(prio_count));		
		while(!que.empty())
			que.pop();
		
		/*push jobs to the queue, get the count of priority 0 ~ 9*/
        for(i=0;i<n;i++)
		{
			scanf("%d",&priority[i]);
			prio_count[priority[i]]++;
			que.push(i);
		}
		
		for(i=9;i>=priority[m];i--)
		{
			while(prio_count[i])
			{
				/*indicate that your job gets its turn to print*/
				if(i==priority[m]&&que.front()==m)
				{
					pop_count++;
					break;
				}
				else
				{
					if(priority[que.front()]==i)
					{
						que.pop();
						pop_count++;
						prio_count[i]--;
					}
					else
					{
						que.push(que.front());
						que.pop();
					}
				}
			}
		}
		printf("%d\n",pop_count);
	}
	return 0;
}

3.2 POJ 1442 


题目大意:求输入的前u(i)个数中第i大的数。


思路:用最大值优先级队列que1记录前i个数,即从大到小排列;用最小值优先级队列que2记录后u(i)-i个数,即从小到大排列;则que1的队首元素即为u(i)个数中的第i大。


WA了两次,在语句if(que1.size()<i){……}犯了逻辑错误。


源代码:

1442Accepted756K157MSC++823B2013-09-17 19:48:06

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

#define MAX 30001

priority_queue<int>que1;
priority_queue<int,vector<int>,greater<int> >que2;

int main()
{
	int N,M,i,j;
	int A[MAX],u[MAX];
	
	scanf("%d%d",&M,&N);
	for(i=0;i<M;i++)
		scanf("%d",&A[i]);
	u[0]=0;
	for(i=1;i<=N;i++)
		scanf("%d",&u[i]);
	
	for(i=1;i<=N;i++)
	{
		if(u[i-1]<u[i])
		{
			for(j=u[i-1];j<u[i];j++)
			{
				if(que1.size()<i)
				{
					que2.push(A[j]);
					que1.push(que2.top());
					que2.pop();
				}
				else
				{
					if(que1.top()>A[j])
					{
						que2.push(que1.top());
						que1.pop();
						que1.push(A[j]);
					}
					else
						que2.push(A[j]);
				}
			}
		}
		else
		{
			que1.push(que2.top());
			que2.pop();
		}
		printf("%d\n",que1.top());
	}
	
	return 0;
}



传送带损坏与对象检测数据集 一、基础信息 • 数据集名称:传送带损坏与对象检测数据集 • 图片数量: 训练集:645张图片 验证集:185张图片 测试集:92张图片 总计:922张工业监控图片 • 训练集:645张图片 • 验证集:185张图片 • 测试集:92张图片 • 总计:922张工业监控图片 • 分类类别: Hole(孔洞):传送带表面的孔洞损坏。 Human(人类):工作区域中的人类,用于安全监控。 Other Objects(其他对象):非预期对象,可能引起故障。 Puncture(刺穿):传送带被刺穿的损坏。 Roller(滚筒):传送带滚筒部件。 Tear(撕裂):传送带撕裂损坏。 impact damage(冲击损坏):由于冲击导致的损坏。 patch work(修补工作):已修补的区域。 • Hole(孔洞):传送带表面的孔洞损坏。 • Human(人类):工作区域中的人类,用于安全监控。 • Other Objects(其他对象):非预期对象,可能引起故障。 • Puncture(刺穿):传送带被刺穿的损坏。 • Roller(滚筒):传送带滚筒部件。 • Tear(撕裂):传送带撕裂损坏。 • impact damage(冲击损坏):由于冲击导致的损坏。 • patch work(修补工作):已修补的区域。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图像数据来源于工业监控系统,适用于计算机视觉分析。 二、适用场景 • 工业自动化检测系统开发:用于构建自动检测传送带损坏和异物的AI模型,实现实时监控和预防性维护,减少停机时间。 • 安全监控应用:识别人类和其他对象,提升工业环境的安全性,避免事故和人员伤害。 • 学术研究与创新:支持计算机视觉在制造业、物流和自动化领域的应用研究,促进AI技术与工业实践的融合。 • 教育与培训:可用于培训AI模型或作为工业工程和自动化教育的案例数据,帮助学习者理解实际应用场景。 三、数据集优势 • 多样化的类别覆盖:包含8个关键类别,涵盖多种损坏类型和对象,确保模型能够处理各种实际工业场景,提升泛化能力。 • 精准的标注质量:采用YOLO格式,边界框标注准确,由专业标注人员完成,保证数据可靠性和模型训练效果。 • 强大的任务适配性:兼容主流深度学习框架(如YOLO、TensorFlow、PyTorch),可直接用于目标检测任务,并支持扩展至其他视觉任务需求。 • 突出的工业价值:专注于工业传送带系统的实际需求,帮助提升生产效率、降低维护成本,并增强工作场所安全,具有较高的实际应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅唱书令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值