在Java中使用包的原因
我目前正在研究算法和数据结构,在阅读《算法》第四版时,我发现了在Java中使用包的原因,java,algorithm,data-structures,bag,Java,Algorithm,Data Structures,Bag,我目前正在研究算法和数据结构,在阅读《算法》第四版时,我发现了包数据结构以及堆栈和队列。 在阅读了对它的解释之后,我仍然不清楚我更喜欢使用Bag(它没有remove()方法)而不是其他数据结构,例如Stack、Queue、LinkedList或Set? 据我从书中了解,包的实现与堆栈的实现是一样的,只需将push()的名称替换为add(),并删除pop()方法 因此,包的概念基本上是能够收集物品,然后遍历收集的物品,检查一个包是否是空的,并找到其中的物品数量。 但是在哪种情况下,我最好使用包,而
包
数据结构以及堆栈
和队列
。
在阅读了对它的解释之后,我仍然不清楚我更喜欢使用Bag
(它没有remove()
方法)而不是其他数据结构,例如Stack
、Queue
、LinkedList
或Set
?
据我从书中了解,包的实现与堆栈的实现是一样的,只需将push()的名称替换为add(),并删除pop()
方法
因此,包的概念基本上是能够收集物品,然后遍历收集的物品,检查一个包是否是空的,并找到其中的物品数量。
但是在哪种情况下,我最好使用包
,而不是上面提到的一个系列?为什么Bag
基本上没有remove()
方法?有没有具体的原因
提前感谢。堆栈
是元素集合的ADT,具有特定的删除顺序=后进先出(后进先出),允许重复
队列
是具有特定移除顺序=FIFO(先进先出)的元素集合的ADT,允许重复
LinkedList
是列表的实现
Set
是不允许重复的元素集合的ADT
Bag
是允许复制的元素集合的ADT
通常,任何包含元素的内容都是集合
。
任何允许复制的集合都是包
,否则它是集
。
任何通过索引访问元素的包都是列表
。
在最后一个元素之后附加新元素并具有从头部移除元素的方法(第一个索引)的包是队列
。
在最后一个元素之后附加新元素并有从尾部(最后一个索引)移除元素的方法的包是堆栈
示例:在Java中,是一个集合、包、列表和队列,您也可以像使用堆栈一样使用它,因为它支持堆栈操作(add
~addLast
~push
,peekLast
,removeLast
~pop
),所以您也可以调用它。它不实现接口的原因是,peek
方法由检索列表头(第一个元素)的实现保留。因此,在的情况下,“堆栈方法”源自
Bag
是否包含remove(Object)
可能取决于实现e。G您可以实现自己的Bag
类型,该类型支持此操作。您还可以实现get(int)
操作来访问指定索引上的对象。get(int)
的时间复杂度取决于您的实现。G一个可以通过链表实现Bag
,这样复杂性平均为O(n/2),另一个通过可调整大小的数组(数组列表)实现,通过索引直接访问元素,这样复杂性将为O(1)
但是Bag
的主要思想是,它允许通过这个集合进行复制和迭代。它是否支持其他有用的操作取决于实现者的设计决策
使用哪种收集类型取决于您的需要,如果不需要重复,您将使用Set
而不是Bag
。此外,如果您关心移除顺序,您将选择堆栈
或队列
,它们基本上是具有特定移除顺序的行李
。您可以将Bag
视为Stack
和Queue
的超级类型,后者通过特定操作扩展其api
大多数时候,您只需要收集对象并以某种方式处理它们(迭代+元素处理)。因此,您将使用最简单的
Bag
实现,即单向链表 感谢您提到每一个ADT的特点,但我已经知道了这些信息以及每个ADT都能做些什么,但我的问题是,Bag
什么时候比其他ADT更方便?@TalBuaron,在一个列表中思考一下,您不在乎元素处于什么位置,但您特别希望允许重复元素。@TalBuaron在不关心集合是FIFO还是FILO时使用Bag。当性能成为一个问题时,这会变得很有用,因为它可以让您选择一个具有不同BigO特征的包的实现,该实现可以是堆栈或队列。@M.Prokhorov,因此包
是唯一允许重复且无插入顺序的收集/数据结构吗?那是interseting@RoshanaPitigalaADT代表抽象数据类型