繁体   English   中英

Java中使用Bag的原因

[英]Reasons for using a Bag in Java

我目前正在研究算法和数据结构,在阅读第 4 版算法书时,我发现了Bag数据结构以及StackQueue 在阅读了它的解释之后,我仍然不清楚为什么我更喜欢使用Bag (没有remove()方法)而不是其他数据结构,如StackQueueLinkedListSet 据我从书中了解到, Bag的实现与Stack的实现相同,只是将push()的名称替换为add()并删除pop()方法。

所以Bag的想法基本上是能够收集物品,然后遍历收集到的物品,检查包是否为空,并找出其中的物品数量。 但是在哪种情况下我最好使用Bag而不是上面提到的 Collections 之一? 为什么Bag基本上没有remove()方法? 有具体原因吗?

提前致谢。

Stack是ADT的元素集合,具有特定的删除顺序= LIFO(后进先出),允许重复,

Queue是元素集合的ADT,具有特定的删除顺序= FIFO(先进先出),允许重复,

LinkedList是列表的实现,

Set是不允许重复的元素集合的ADT,

Bag是元素集合的ADT,允许重复。

通常,任何包含元素的东西都是Collection 任何允许重复的集合都是Bag ,否则就是Set 通过索引访问元素的任何包都是List 在最后一个之后附加新元素并且具有从头部(第一索引)移除元素的方法的Bag是Queue 在最后一个之后附加新元素并且具有从尾部(最后一个索引)移除元素的方法的Bag是Stack

示例:在Java中, LinkedList是一个集合,包,列表,队列,你也可以使用它,因为它支持堆栈操作( add ~ addLast ~ pushpeekLastremoveLast ~ pop ),所以你可以调用它它也堆叠。 原因是,为什么它没有实现Stack接口,这个peek方法是由Queue实现保留的,它检索列表的头部(第一个元素)。 因此,在LinkedList的情况下,“堆栈方法”是从Deque派生的。

Bag是否包含remove(Object)可能取决于实现,例如,您可以实现自己的Bag类型,它支持此操作。 您还可以实现get(int)操作来访问指定索引上的对象。 get(int)时间复杂度取决于你的实现,例如,可以通过链表实现Bag ,因此复杂性将是平均O(n / 2),另一个是通过可调整大小的数组(array-list)直接访问元素通过索引,因此复杂度为O(1)。

Bag的主要思想是,它允许重复和迭代这个集合。 它是否支持其他有用的操作取决于实现者的设计决策。

使用哪种收集类型取决于您的需求,如果不需要重复,您将使用Set而不是Bag 此外,如果你在乎删除命令你会选择StackQueue它们基本上Bags与特定的删除顺序。 您可以将Bag视为StackQueue超类型,它通过特定操作扩展其api。

大多数情况下,您只需要收集对象并以某种方式处理它们(迭代+元素处理)。 因此,您将使用最简单的Bag实现,即单向链接列表。

Bag是一个无序的值集合,可能有重复值。 将堆栈与袋子进行比较时,第一个区别是对于堆栈,顺序很重要。

Bag 只支持additerate操作。 您不能从包中取出物品——可以从堆栈中取出元素。-。 在检查容器是否真的为空之后,客户端可以遍历它的元素; 由于定义未指定实际顺序,因此客户不得依赖它。

当您需要收集对象并将它们作为一个整体而不是单独处理时,袋子很有用。 例如,您可以收集样本,然后计算它们的统计数据,例如平均值或标准偏差——在这种情况下顺序无关紧要。

就优先级队列而言,包是一个优先级队列,其元素移除(top()-返回并提取具有最高优先级的元素。)被禁用。 优先级队列 api 有toppeekinsertremoveupdate方法。 一次可以查看一个元素,每个元素的优先级由一个均匀分布的随机数给出。 优先级也会在每次迭代中发生变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM