在 Java 中使用 Bag 的原因

2024-02-17

我目前正在学习算法和数据结构,当我阅读《算法之书》第四版时,我发现了Bag数据结构与Stack and Queue。 阅读了它的解释后,我仍然不清楚为什么我更喜欢使用Bag(其中没有remove()方法)优于其他数据结构,例如Stack, Queue, LinkedList or a Set? 据我从书中可以理解,实施Bag,与 a 相同Stack,只需替换名称push() to add()并删除pop() method.

所以一个想法是Bag基本上具有收集物品的能力,然后迭代收集的物品,检查袋子是否为空并找到其中物品的数量。 但在什么情况下我最好使用Bag超过上述集合之一?以及为什么一个Bag没有remove()基本上方法?有什么具体原因吗?

提前致谢。


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

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

LinkedList是清单的实施,

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

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

一般来说,任何包含元素的东西都是Collection。 任何允许重复的集合都是Bag,否则就是Set。 任何通过索引访问元素的包都是List。 在最后一个元素之后追加新元素并具有从头部(第一个索引)删除元素的方法的 Bag 是Queue。 在最后一个元素之后追加新元素并具有从尾部(最后一个索引)删除元素的方法的 Bag 是Stack.

示例:在 Java 中,链表 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html是一个集合、包、列表、队列,您也可以像堆栈一样使用它,因为它支持堆栈操作(add~addLast~push, peekLast, removeLast~pop),所以你也可以称它为堆栈。原因,为什么它没有实施Stack https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html接口是peek方法被保留Queue https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html检索列表头部(第一个元素)的实现。因此,如果链表 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html,“堆栈方法”源自Deque https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html.

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

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

使用哪一种集合类型取决于您的需要,如果不需要重复,您可以使用Set代替Bag。此外,如果您关心删除订单,您会选择Stack or Queue基本上是Bags具有特定的删除顺序。你可以想到Bag作为超类型Stack and Queue它通过特定的操作扩展了它的 api。

大多数时候,您只需要收集对象并以某种方式处理它们(迭代+元素处理)。所以你会用最简单的Bag这是一种单向链表的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中使用 Bag 的原因 的相关文章

随机推荐

  • 如何在 iOS 中创建包括 Swift 的开发框架?

    我的目标是创建一个包含 Swift 和 Objective C 的 iOS 框架 我可以在我的开发项目中使用它 这个框架的本质是框架本身正在开发中 因此 每次我使用此框架构建项目时 由于缺乏更好的术语 我将使用该框架的项目称为 使用 项目
  • 从 FTP 流式传输文件并让用户同时下载

    我正在创建一个备份系统 其中备份将自动生成 因此我将把备份存储在不同的服务器上 但是当我想下载它们时 我希望链接是一次性链接 这并不难但是 为了确保安全 我正在考虑存储这些文件 以便它们无法通过其他服务器上的 http 访问 所以我要做的是
  • iOS 推送通知声音不来

    我正在开发 Ios 推送通知 我可以在其中获取推送通知 但问题是我在收到推送通知时无法听到任何声音 我还检查了我的通知中心 在那里我已经启用了声音 下面给出了我的代码 请指导我如何解决这个问题 UIApplicationMain class
  • COM 的跨平台替代方案

    我一直着迷于基于组件的编程 无论是使用 COM 另一个系统 还是仅使用纯 C 中的范例 如果一个人通常习惯 传统 OOP 模型 那么它需要一些时间来适应 但这绝对是值得的 它使我的代码更易于维护且更易于扩展 我目前正在进行的项目正在使用范例
  • javascript window.open 从回调

    window open 从主线程调用默认打开新选项卡 但是 这里每次都会打开新窗口 Opera 16 和 Google Chrome 29
  • 我需要在 Oracle 上的外键上创建索引吗?

    我有一张桌子A和一张桌子B A有一个外键B on B的主键 B ID 由于某种原因 我知道有合理的原因 当我在键上连接这两个表时 它没有使用索引 是否需要单独创建索引A B ID或者外键的存在应该提供这一点 外键约束本身并不提供 Oracl
  • 为什么 is_copy_constructible 在 MSVC12 中为 unique_ptr 返回 true

    我本来期望这个静态断言会触发 include
  • 具体QPushButton样式

    如何自定义 QPushButton 或 QToolButton 的外观 使其看起来像elementaryos 的网页 按钮 我真正想要的是特征图像位置和侧面的文字 也许如果我幸运的话我也可以得到这样的边框 但我真的不需要标题下面的小描述 我
  • 如何让这个Javascript函数在IE浏览器中工作?

    此 JAVSCRIPT 功能的目的是防止用户输入任何字母字符 如果用户输入这些字符 光标根本不会移动并停留在同一位置 但是 如果用户输入数字 光标将移动到下一个位置 例如 在此文本字段中 我只允许用户输入数字 此方法在除 IE 8 及更早版
  • Bootstrap 3.1.0 导航栏上的全宽输入组

    我在使用 bootstrap v3 1 0 时遇到了一些问题 我需要获得适合导航栏整个宽度的搜索栏 如下所示 v3 0 3 http bootply com 109727 http bootply com 109727但感觉输入组有一些问题
  • C# 字符串创建(指定长度)

    是否有一种简洁的方法 即不是 for 循环 来创建指定长度的字符串 字符串中的内容并不重要 您可以使用the string构造函数需要一个char and an int http msdn microsoft com en us libra
  • php heredocs 语法中的条件语句?

    我想知道您是否可以在此处文档中包含条件语句 这是我的脚本 但它无法正确解析 username php代码 function doSomething username if isset SESSION u name reply a class
  • AppRegistryNotReady:惰性 format_html()?

    为什么我会收到此异常 Traceback most recent call last File path1 myapp isu myapp isu tests unit views test view isu py line 8 in
  • RxJS 节流行为;立即获取第一个值

    笨蛋示例 https plnkr co edit NZwb3ol8CbZFtSc6Q9zm p preview https plnkr co edit NZwb3ol8CbZFtSc6Q9zm p preview 我知道 RxJS 5 0
  • 我们不能在 forEach 中重新分配数组值吗? [复制]

    这个问题在这里已经有答案了 问题陈述是 我应该用 0 替换 5 以下的任何数字 用 1 替换 5 及以上的任何数字 我试图重新分配值 但它不影响 为什么 function fakeBinary n let numbersArr n spli
  • 计算字符串开头的空格数[重复]

    这个问题在这里已经有答案了 如何计算 C 中字符串开头的空格数量 example this is a string 结果是 4 不知道如何正确执行此操作 Thanks Use Enumerable TakeWhile Char IsWhit
  • 在Android中我们如何复制文件并保留其只读属性?

    在我的 Android 应用程序中 我希望能够复制只读文件并使新版本也只读 在目标文件上使用 setReadOnly 方法只会返回 false 表明失败 当然检查文件本身表明它没有设置只读属性 编辑 正如 David Give 所建议的 这
  • 如果存在类似行,如何避免创建新行?

    我需要配置 hibernate 以避免创建重复的行 尽管该行存在 但它会创建一个新行 并且由于仅设置了一个字段 因此将所有其余行设置为 NULL 可以说我有一行如下 id des index age 1 MyName 2 23 虽然我只是将
  • Python 支持零拷贝 I/O 吗?

    我有两个打开的文件对象 dest and src 文件对象dest打开进行写入 查找位置放置在文件内的某个偏移处 并且文件对象src已打开供阅读 我需要做的只是从当前位置读取src到 EOF 并将内容传输到dest尽快 如果我用 Java
  • 在 Java 中使用 Bag 的原因

    我目前正在学习算法和数据结构 当我阅读 算法之书 第四版时 我发现了Bag数据结构与Stack and Queue 阅读了它的解释后 我仍然不清楚为什么我更喜欢使用Bag 其中没有remove 方法 优于其他数据结构 例如Stack Que