Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用包的原因_Java_Algorithm_Data Structures_Bag - Fatal编程技术网

在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代表抽象数据类型