在Java中使用Bag的原因

时间:2017-04-15 15:53:38

标签: java algorithm data-structures bag

我目前正在研究算法&数据结构,当我阅读Book of Algorithms第4版时,我发现了Bag数据结构以及StackQueue。 在阅读了它的解释之后,我仍然不清楚我更喜欢使用Bag(没有remove()方法)而不是其他数据结构,例如Stack,{ {1}},QueueLinkedList? 据我在本书中所理解,Set的实现与Bag的实现相同,只需将Stack的名称替换为push()并删除add()方法。

所以pop()的想法基本上是能够收集物品然后遍历收集的物品,检查行李是否为空并找到其中的物品数量。 但在哪种情况下我会更好地使用Bag而不是上面提到的一个集合?为什么Bag基本上没有Bag方法?是否有特定原因?

提前致谢。

1 个答案:

答案 0 :(得分:9)

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

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

LinkedList是列表的实现,

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

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

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

示例:在Java中,LinkedList是一个集合,包,列表,队列,您也可以使用它,因为它支持堆栈操作(add〜{{1} }〜addLastpushpeekLastremoveLast),因此您也可以将其称为堆栈。原因是,为什么它没有实现Stack接口,pop方法由Queue实现保留,它检索列表的头部(第一个元素)。因此,在LinkedList的情况下,"堆栈方法"来自Deque

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

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

要使用哪种收集类型取决于您的需求,如果不需要重复,您可以使用Bag代替Set。此外,如果您关心删除订单,则会选择基本为Bag且具有特定删除顺序的StackQueue。您可以将Bags视为BagStack的超类型,它通过特定操作扩展其API。

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