- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前正在学习算法和数据结构,在阅读第 4 版算法书时,我发现了 Bag
数据结构以及 Stack
和队列
。在阅读了它的解释之后,我仍然不清楚为什么我更喜欢使用 Bag
(没有 remove()
方法)而不是其他数据结构,例如作为 Stack
、Queue
、LinkedList
还是 Set
?据我所知,Bag
的实现与 Stack
的实现相同,只是替换了 push()< 的名称
到 add()
并删除 pop()
方法。
所以 Bag
的想法基本上是能够收集元素,然后遍历收集到的元素,检查包是否为空,并找出其中元素的数量。但是在哪种情况下我最好使用 Bag
而不是上述集合之一?为什么 Bag
基本上没有 remove()
方法?有具体原因吗?
提前致谢。
最佳答案
Stack
是具有特定移除顺序的元素集合的 ADT = LIFO(后进先出),允许重复,
Queue
是具有特定移除顺序的元素集合的 ADT = FIFO(先进先出),允许重复,
LinkedList
是列表的实现,
Set
是不允许重复的元素集合的 ADT,
Bag
是允许重复的元素集合的 ADT。
一般来说,任何包含元素的东西都是Collection
。任何允许重复的集合都是Bag
,否则就是Set
。任何通过索引访问元素的包都是List
。在最后一个元素之后附加新元素并具有从头部(第一个索引)删除元素的方法的包是 Queue
。在最后一个元素之后附加新元素并具有从尾部(最后一个索引)删除元素的方法的包是 Stack
。
示例:在 Java 中,LinkedList是一个集合,包,列表,队列,你也可以使用它作为一个堆栈,因为它支持堆栈操作(add
~addLast
~push
, peekLast
, removeLast
~pop
), 所以你也可以调用它堆栈。原因,为什么它不执行 Stack接口(interface)是,peek
方法由 Queue 保留检索列表头部(第一个元素)的实现。因此在 LinkedList 的情况下,“堆栈方法”派生自 Deque .
Bag
是否包含 remove(Object)
可能取决于实现 e。 G。您可以实现自己的支持此操作的 Bag
类型。您还可以实现 get(int)
操作来访问指定索引上的对象。 get(int)
的时间复杂度取决于您的实现 e。 G。一个可以通过链表实现 Bag
,因此复杂度平均为 O(n/2),另一个可以通过可调整大小的数组(数组列表)实现,并通过索引直接访问元素,因此复杂度为 O(1)。
但是 Bag
的主要思想是,它允许在这个集合中进行重复和迭代。它是否支持其他有用的操作取决于实现者的设计决策。
使用哪一种集合类型取决于您的需要,如果不需要重复,您可以使用 Set
而不是 Bag
。此外,如果您关心移除顺序,您会选择 Stack
或 Queue
,它们基本上是具有特定移除顺序的 Bags
。您可以将 Bag
视为 Stack
和 Queue
的父类(super class)型,通过特定操作扩展其 api。
大多数时候,您只需要收集对象并以某种方式对其进行处理(迭代+元素处理)。因此,您将使用最简单的 Bag
实现,它是一个定向链表。
关于java - 在 Java 中使用 Bag 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43428114/
我是 HADOOP 和 PIG 的新手。 我有两个包: DUMP A: (1) (2) (4) DUMP B: (1,John,USA) (2,Richard,UK) (3,Ian,Ireland)
我有一个例子,我们正在尝试做一个看似简单的连接: A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d
研究该主题,可以找到作者使用“词袋”模型进行图像分类/检索的论文,而其他人则使用“特征袋”模型进行类似任务。 尽管我对所涉及的方法有基本的了解(检测和提取视觉词、构建视觉词典、使用机器学习训练分类器)
手册/文档广泛使用了“内袋”和“外袋”的语言(例如: http://pig.apache.org/docs/r0.11.1/basic.html ),但我无法清楚地确定分隔这些术语的精确定义。 例如所
这个问题已经有答案了: Type mismatch: cannot convert from Item to Item (1 个回答) 已关闭 7 年前。 我很困惑。我无法将外部类的实例变量 Node
我正在尝试使用 ORB 作为我的 detector 和 extractor 以及 BruteForce 创建一个词袋程序> 用于匹配器。 一切正常。 但我担心的是,当我尝试对我的描述符数组进行聚类时,
题目地址:https://leetcode.com/problems/bag-of-tokens/description/ 题目描述 Youhave an initial power P, an
我正在寻找一种数学变换,以将2D平面[0,1]x[0,1]上的点变换到单位球面上。 最常见的投影是通过将u和v解释为球坐标的角度来进行纬度-经度映射(将u映射为[0,2PI]和v映射为[-PI/2,
我有这个RDF A B D 1 C
我一直在看this tutorial标签部分让我感到困惑。不是标记本身的行为,而是教程中显示过程的方式。 更具体地说,#pragma omp 部分: #pragma omp parallel for
当使用 dask.bag 读取 json 文件时,如果文件中的 json 是多行,我会收到 JSONDecodeError 。 import json import dask.bag as db db
我不确定这个论坛是否适合这个问题,否则我很抱歉。 我对 Bag of Features 很陌生模型,我正在尝试实现以通过 vector 表示图像(对于 CBIR 项目)。 据我了解,给定训练集 S的
我正在尝试实现Haskell Bag(多集)。 到目前为止,我已经有了 data Bag a = EmptyBag | ListBag [(a, Integer)] deriving (Eq, Sho
我已经研究了 bag 和 idbag 之间的区别,我理解它们之间的区别,但我想了解的是,如果使用 bag 而不是 idbag ,是否会出现问题,反之亦然。有人可以用一个例子解释一下吗? 最佳答案 Ba
考虑以下 Hibernate 映射文件: ... 当我运行以下命令时: _session.EnableFil
我正在为 Fox and Geese 类型的游戏编写 AI。我的谓词之一如下所示: moveFox(+PrevState, -NextState, -PegList, +VisitedStates,
我刚刚开始学习 Haskell,但还没有掌握函数式编程。我需要创建一个多态数据类型,在运行我编写的函数之一之前我不知道其类型。该程序似乎希望我从列表中构建元组列表,例如: ['Car', 'Car',
我想像下面这样定义包 在上述情况下,hbm 文件中存在 xml 错误: 元素类型“bag”的内容必须匹配 “(元*,子选择?,缓存?,同步*,注释?,键,(元素|一对
Here ,我看到 Bag 类应该位于 java.util.Collection 中,但是当我尝试使用它时,我得到无法解析为类型 > 错误。 我应该复制+粘贴this或者是否缺少一些库? 最佳答案 这
我正在尝试使用 dask.bag 来保存给定类的对象,其中每个实例捕获文档的各种属性(标题、字数等)。 该对象有一些关联的方法,用于设置该对象的不同属性。 例如: import dask.bag as
我是一名优秀的程序员,十分优秀!