队列的一些简单好例子是什么?[关闭]


9

我正在教CS2Java and data structures),在教队列时要使用好的示例方面有些困难。我使用它们的两个主要应用程序是multithreaded消息传递(但是MT编程不在本课程的范围之内),并且BFS-style algorithms(并且我将在本学期的晚些时候再介绍图形)。

我也想避免人为的例子。我想到的大多数事情,如果实际上是要以单线程方式解决它们,我只会使用列表而不是队列。我倾向于仅在处理和发现被交错(例如,搜索)时或在其他特殊情况下使用队列,例如长度受限的缓冲区(例如,维护最后N个项目)。在实际的范围内,我正在尝试教我的学生好的方法,以实际的方式实际执行程序,而不仅仅是展示功能的玩具。

有什么好的,简单的算法建议或队列应用建议可以用作示例,但至少需要其他先验知识吗?


+1,但考虑到它仅包含您的问题,因此我不希望创建标签“ queue”。我会使用“数据结构”。
K.Steff

@ K.Steff,您可以同时使用它们:-)注意,任何新标签在开始时仅与单个问题相关。
彼得Török

1
当您涵盖BFS时,自然会涵盖队列。为什么不保存队列呢?您不必仅用链接列表和数组列表来覆盖队列,因为它们也具有线性表示形式。
凯文·克莱恩

@PéterTörök我意识到所有标签都开始为空,但是“队列”搜索产生313个问题,没有其他人创建了“队列”标签。无论如何,这只是国际海事组织
K.Steff

答案中反复出现的主题似乎是对真实队列的模拟。到目前为止,我的想法一直是,我更喜欢使用一些示例,在这些示例中,我将使用队列来解决编程中实际出现的问题,并且许多物理世界示例在并发环境中表现最佳。但是,考虑到这个主题的重复,很可能是我没有采取有用的思路。不断提出建议!并感谢大家的大力帮助。
Michael Ekstrand 2012年

Answers:


14

当我学习队列时,我的教授总是以商店为例。在任何给定时间都有1个或多个打开的寄存器,并且客户进入一个或多个队列,然后在该队列中移动以购买其所有物品。

实际上,我们必须实现一个简单的程序,该程序可以使Customer通过RegisterQueue,因此,如果您实际上正在寻找一个程序,则可以为学生提供此示例简单明了,而且每个学生在现实生活中都可以看到,因此它可以帮助他们更好地理解概念。


正如我所说的,这个示例非常直观,而且也经常使用;)
marktani 2012年

1
您可以通过为有特权的客户设置优先队列来增加复杂性(Aero计划)。
sixtyfootersdude 2012年

1
IMO,最简单的例子就是我们生活中遇到的例子。“线”示例很好地表示了队列,应该可以帮助您的学生学习。实际上,当我想到队列以及如何定义队列的操作时,我经常想到“行”示例以帮助我更好地可视化它。
尼古拉斯2012年

这也是简要介绍排队理论的绝佳机会:为什么为多个寄存器提供服务的单行比每个寄存器的行更好。让他们建立一个模拟并进行模拟。工程师家伙有一个很好的简单解释:engineerguy.com/videos/video-lines.htm
jpeacock 2012年

5

当我得知队列时,我的老师在警署用汽车排队向他们介绍了他们。有一排拿着汽车的队列(“等候队列”),警察总是会控制队列中的下一辆汽车,然后将其发送给他的同事进行进一步检查或让汽车通过。

超级市场中的排队通常是一个例子。

您为什么不要求学生自己举一些例子呢?


+1例如超级市场。您在我写答案时提到了它!
Mike Caputo 2012年

3

我想到的一个例子是麦当劳的汉堡加工生产线。这是几种不同的汉堡,每种汉堡可由数名不同的工人生产,并且每种都有自己的队列。从那里,过了一会儿,点了一个汉堡的收银员按照FIFO的顺序拿起了准备好的汉堡。

因此,有多个生产者和消费者,并且每个队列都是有界的。


我记得大学时代的同学们比较了快餐收银机布置与处理器设计的不同风格。一个队列由多个寄存器处理?每个注册都有自己的队列?多条工人在同一条线上-超标量处理。真有趣。

3

我考虑过以亚马逊为例,在他们庞大的系统中的某个地方,必须要排队处理一些订单。可以通过简单的入队和出队来处理。每当客户购买一本书时,系统都会在系统中将订单入队,然后,储藏室的人会将该书从队列中取出以便拿起并过帐。

然后,通过介绍主要客户(可能会跳过队列),介绍优先级队列,开始谈论优先级队列将很容易。

您正在使用什么教科书?


Carrano- Java的数据结构和抽象
Michael Ekstrand 2012年

2

队列的一个完美示例是银行针对一个帐户处理交易。通常,您会在一天结束时看到“待处理”交易的列表。完成会计后,这些交易将应用于该帐户。您甚至可以以此进入优先级队列区域。似乎大多数银行在处理夜间交易时都会优先考虑借项,以便在应用任何待处理的贷项之前,可以向您讨价还价。

交易将按照执行时间和出队时间顺序插入队列中,并通过记帐过程应用于帐户。


2

我曾经是一名电信程序员,所以想到:

客户服务热线。呼叫进入,没有足够的操作员来处理呼叫,因此将其放入队列中。下一个呼叫进入,它也被放入队列中。然后,当下一个话务员可用时,进入队列的第一个呼叫将分配给该话务员。


2

显而易见的“真实世界”示例可能是诸如结帐行之类的东西,但是由于您正在寻找一个严格扎根于计算的示例,我是否可以建议作业调度队列?

我不知道您有多少学生参加了操作系统课程,但是可以肯定的是,他们所有人都使用Task Manager在某些时候检查了他们的过程。您可以介绍一个调度队列的简化示例,并为其分配一些作业,以编写程序来生成(或接受)给定大小的“任务”,并在它们“启动”时按FIFO顺序进行处理。

这是一个非常容易理解的概念,它演示了队列按照接受内容的顺序对其内容进行操作的思想,并为他们提供了(非常基本和简化的)CPU调度介绍。只是我的两位。

您可能会在多线程中启动他们的应用程序,但是除非学生已经有编写线程程序的经验,否则我不会为他们分配可能会令人沮丧的工作。我记得我在大学二年级时学习数据结构时遇到了麻烦(尤其是在Java中,没有学过C ++,也没有学到关于指针的知识),因此,一个与计算直接相关的简单但实际的示例可能是最好的。


1

真实世界:

  • 人们在任何时候排队:在杂货店的收银员,在餐厅等着桌子的桌子上(您可以使用有时会被类推的类比器来工作),等等。当您注意到在英国,他们经常称这些队列代替行(在NA中很常见)
  • 阅读书系列”,author.publish => queue.push和student.read => queue.pop

非现实世界:

  • 在单线程环境中处理任何提交的数据,处理时间比提交的时间长(例如,在线商店的结帐操作)
  • 可以迭代的任何FIFO集合都可以使用队列,while(queue.peek)而不是使用迭代器。

1

我喜欢以游戏为例,因为它通常比文件IO或您能想到的其他任何东西都令人兴奋。

因此,当您要连续向策略游戏中的某个单位发出多个命令时(例如,让一只Zergling依次侦察基地的4个角,然后自杀进入基地的中心),排长队是一个不错的选择)

或者,也许您有一个应用程序每秒只能处理30帧,但是您可能会在帧之间获得4或5个输入。如果您有变更武器输入和射击输入,则要确保按收到时的顺序处理这些武器,否则当您想用刀时可能会手榴弹。而且,如果您想用刀子时手榴弹,那将是一段糟糕的时光。(将其放在滑雪教练模因上,然后将其扔到幻灯片中):)

处理请求的服务器是另一种好方法。

接受输入的CNC机床。机器只能运行得如此之快,因此需要排队输入。


1

我能想到的一些例子:

  • 计算器-可以同时引入前缀和后缀
  • 系鞋带的说明。在完成最后一个操作之前,无法完成下一个操作
  • 缓冲区-可能是电话缓冲区,用于存储用户输入但尚未发出提示音的号码
  • 消化

1

生产线到处都是队列。想想一行空瓶前往灌装机的情况。先进先出是一种将过程顺序应用于许多对象的自然方法。队列还用于使一个过程与另一个过程脱钩:如果贴标机有短期问题,灌装机不必立即停止。

队列在软件中的使用方式大致相同。一个进程的输出可以排队输入另一个进程。无论您是在谈论进程间通信,线程间通信,还是干脆将一个复杂的进程分解为可能全部由同一线程处理的部分,都是如此。

在操作系统中,队列通常用于按顺序处理输入。例如,文件系统可能会从存储设备读取块并将其添加到队列中。或者处理诸如按键和鼠标移动之类的中断会创建事件,这些事件会添加到事件队列中,以便您在键入时不会得到“ uqeeu”而不是“ queue”。

对于简单的学生作业,我认为接受一定数量的输入然后对其进行处理的任何任务都是可行的。例如,您可以让他们编写一个简单的后缀表达式评估器。它分为三个部分:

  • 读取输入,将其添加到输入队列,然后重复进行直到没有更多输入为止

  • 从队列中获取项目

    • 如果项目是数字,则将其推入参数堆栈
    • 如果该项目是运算符,则弹出必要的参数并求值
    • 将结果添加到输出队列
    • 重复直到堆栈为空
  • 从输出队列中读取项目,进行打印,然后重复进行直到输出队列为空


1

在讲授数据结构时,我通常使用银行队列模拟的应用程序,其中客户在队列中等待,并且有许多服务窗口。

问题是模拟该过程以便找出以下统计信息:队列中的客户等待时间(最大,最小,平均)以及队列中等待的客户数量。我使用每天每分钟到达的新客户的预定义频率以及服务窗口中客户的平均服务时间以及来自随机数生成器的值。

结果将是关于最佳服务窗数量和候车厅中最佳座椅数量的建议,以确保客户满意度。对学生来说非常有趣的应用程序。


1

任何调度算法几乎总是涉及队列。

范围从简单的先到先服务队列到缓冲单个使用者的请求。

对于复杂的作业调度队列,其中“任务”可以具有优先级,而“工人”具有不同的功能。

一个不错的用例是:“您有一台中央打印服务器,其中装有四台打印机,其中两台可以彩色,一台可以双面打印,一台可以在较大的纸张上打印。用户可以为紧急工作支付额外的费用,或者,如果他们不愿意等待更长的时间,则更少。如果交货时间太晚,您可能会受到罚款,因此您需要尽可能多的吞吐量。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.