我目前正在研究算法&数据结构,当我阅读Book of Algorithms第4版时,我发现了Bag
数据结构以及Stack
和Queue
。
在阅读了它的解释之后,我仍然不清楚我更喜欢使用Bag
(没有remove()
方法)而不是其他数据结构,例如Stack
,{ {1}},Queue
或LinkedList
?
据我在本书中所理解,Set
的实现与Bag
的实现相同,只需将Stack
的名称替换为push()
并删除add()
方法。
所以pop()
的想法基本上是能够收集物品然后遍历收集的物品,检查行李是否为空并找到其中的物品数量。
但在哪种情况下我会更好地使用Bag
而不是上面提到的一个集合?为什么Bag
基本上没有Bag
方法?是否有特定原因?
提前致谢。
答案 0 :(得分:9)
Stack
是元素集合的ADT,具有特定的删除顺序= LIFO(后进先出),允许重复,
Queue
是元素集合的ADT,具有特定的删除顺序= FIFO(先进先出),允许重复,
LinkedList
是列表的实现,
Set
是不允许重复的元素集合的ADT,
Bag
是允许重复的元素集合的ADT。
通常,包含元素的任何内容都是Collection
。
任何允许重复的集合都是Bag
,否则为Set
。
通过索引访问元素的任何包都是List
。
在最后一个元素之后附加新元素并且具有从头部删除元素的方法(第一个索引)的包是Queue
。
在最后一个元素之后附加新元素并且具有从尾部移除元素的方法(最后一个索引)的包是Stack
。
示例:在Java中,LinkedList是一个集合,包,列表,队列,您也可以使用它,因为它支持堆栈操作(add
〜{{1} }〜addLast
,push
,peekLast
〜removeLast
),因此您也可以将其称为堆栈。原因是,为什么它没有实现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
且具有特定删除顺序的Stack
或Queue
。您可以将Bags
视为Bag
和Stack
的超类型,它通过特定操作扩展其API。
大多数情况下,您只需要收集对象并以某种方式处理它们(迭代+元素处理)。因此,您将使用最简单的Queue
实现,它是一个方向链接列表。