Scala 的 Vector 是如何工作的?

2023-12-21

I read 这一页 http://www.scala-lang.org/docu/files/collections-api/collections_40.html关于 Scala 集合的时间复杂度。正如它所说,Vector的复杂度是eC对于所有操作。

这让我想知道什么Vector是。我读了document http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Vector它说:

由于向量在快速随机选择和快速随机函数更新之间取得了良好的平衡,因此它们是目前 不可变索引序列的默认实现。它的支持者是 分支因子为 32 的小端位映射向量 trie。 位置很好,但不连续,这对非常有好处 大序列。

与 Scala 的其他所有内容一样,它非常模糊。实际上如何Vector work?


这里的关键字是Trie。 向量被实现为Trie数据结构。 看http://en.wikipedia.org/wiki/Trie http://en.wikipedia.org/wiki/Trie.

更准确地说,它是一个“位图向量特里树”。我刚刚在这里找到了足够简洁的结构描述(以及实现 - 显然是在 Rust 中):

https://bitbucket.org/astrieanna/bitmapped-vector-trie https://bitbucket.org/astrieanna/bitmapped-vector-trie

最相关的摘录是:

位图向量 Trie 基本上是一个 32 树。级别 1 是大小为 32 的数组,无论数据类型如何。 Level 2 是 32 个 Level 1 的数组。依此类推,直到: Level 7 是 2 个 Level 6 的数组。

UPDATE:回复赖玉轩关于复杂性的评论:

我不得不假设你在这里指的是“深度”:-D。 “eC”的图例表示“该操作实际上需要恒定的时间,但这可能取决于一些假设,例如向量的最大长度或散列键的分布。”。

如果您愿意考虑最坏的情况,并且考虑到向量的最大大小存在上限,那么我们确实可以说复杂度是恒定的。 假设我们认为最大大小为 2^32,那么这意味着无论如何,最坏的情况最多是 7 次操作。 话又说回来,我们总是可以考虑任何类型集合的最坏情况,找到一个上限,并说这是常数复杂度,但对于示例列表来说,这意味着常数为 40 亿,这不太实用。

但 Vector 恰恰相反,7 次操作超出了实际范围,这就是我们可以考虑其复杂性常数的方式在实践中.

另一种看待这个问题的方式是:我们不是在谈论 log(2,N),而是在谈论 log(32,N)。如果你尝试绘制它,你会发现它实际上是一条水平线。因此,务实地说,随着集合的增长,您将永远无法看到处理时间的大幅增加。 是的,这仍然不是真正恒定的(这就是为什么它被标记为“eC”而不仅仅是“C”),并且您将能够看到短向量周围的差异(但同样,差异非常小,因为数字运营增长缓慢)。

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

Scala 的 Vector 是如何工作的? 的相关文章

随机推荐

  • 决定倒塌这棵树的截止的算法?

    我有一个Newick http en wikipedia org wiki Newick format通过比较 4 9 bp 长 DNA 序列的假定 DNA 调控基序的位置权重矩阵 PWM 或 PSSM 的相似性 欧几里德距离 而构建的树
  • 如何在java 8中使用收集器和流自动递增哈希图的键

    我是 Java 8 的新手 Streams and Collectors类 我正在读取一个文件 其内容需要保存在LinkedHashMap
  • BigInt 相乘

    class BigInt private string data bool isNegative BigInt multiplication BigInt left BigInt right BigInt sum BigInt result
  • 如何通过 REST API 使用 IBM Watson 的 QA 服务

    我刚刚开始学习IBM Watson 服务 我需要使用 REST API 在 java 中使用 bluemix 的问答 API 但我找不到类似的服务问题和答案 请有人告诉我名称是否已更改或者我在哪里可以找到该服务的文档 我已经尝试过 SO 中
  • Ratchet PHP WAMP - React / ZeroMQ - 特定用户广播

    Note 这是not与这个问题 https stackoverflow com questions 17583903 how to get the connection object of a specific user它利用Message
  • npm - 自动更新本地库依赖项

    我已经使用了 npm 的本地包依赖功能 如下所示 npm install save file path to module 我使用更新我的库模块npm run build创建 dist 文件 然后我跑npm update在使用该库的项目中
  • Spring Boot 中 URL 必须以“jdbc”开头

    我的应用程序正在运行 但是当我遇到应用程序错误时 我尝试了好几次同样的事情发生了 我检查了数据库连接 一切正常 这些是我的日志 例外 Caused by java lang IllegalArgumentException URL must
  • 重构类以摆脱 switch case

    假设我有一个这样的类来计算使用不同交通方式旅行不同距离的成本 public class TransportationCostCalculator public double DistanceToDestination get set pub
  • VBA Excel 基于匹配列单元格查找和组合行

    我试图找出一种方法来根据 vba excel 中两个特定列中的值组合行 例如 假设我有以下表格 Column A Column J Column Z 1 A 1 A 2 B 2 B 我需要将其转换为 Column A Column J Co
  • Google 地图 v3 可拖动标记

    我是谷歌地图的新手 我正在努力学习它 marker new google maps Marker map map draggable true animation google maps Animation DROP position re
  • 使用虚拟破坏顺序

    有人可以帮助我使用虚拟函数时的破坏顺序吗 是从基类开始 然后是派生类吗 由于我没有看到虚函数如何改变任何对象的销毁顺序 我假设您指的是虚函数中基类和数据成员的销毁顺序遗产设想 子对象是建 基类被建造从最基础到最衍生 多个基类均建于声明为基类
  • 如何使用gradle构建WAR文件?

    我想构建一个 WAR 文件 然后将其部署到 Tomcat 因此 作为练习 我在 IDEA IntelliJ 中使用 Gradle 启动了一个新的 Spring Boot 项目 之后 我在中应用了该插件build gradle文件 像这样ap
  • 如何使用 flutter 实现画中画?

    有没有办法用flutter应用程序做画中画 有点像 YouTube 在您观看视频并导航到另一个应用程序时所做的事情 他们在这里谈论它 https youtu be hBPd2q2dmXY https youtu be hBPd2q2dmXY
  • 样式表未解析,因为严格模式下不允许非 CSS MIME 类型

    我的网站上出现以下错误 Error Did not parse stylesheet at http test opendialogueapproach co uk wp content plugins revslider public a
  • 将图像大小调整为 div 的 100% 高度并保持纵横比

    这是一个快速草图 http www nulaena si photob problem png 我希望实现图库 div 中的图像将是图库 div 高度的 100 并保持纵横比 AND 当您更改浏览器的大小时 图像会调整大小 这可能吗 任何帮
  • 停止 Stream 监听器消费消息

    我正在寻找一种方法来停止使用流监听器消费消息 StreamListener MBinding M INPUT public void consumeMessage Message
  • 使用 Select2 仅加载一次远程数据

    正如标题所示 我只想加载远程数据一次 我考虑过使用独立的 ajax 调用加载数据并将其设置为 本地 控件 但想知道是否有更多 内置 方法可以做到这一点 可以在这里找到解决方案 https github com ivaynberg selec
  • 使用Python的多处理模块的同步问题

    当我从 Python 的多处理模块运行以下代码时page http docs python org 2 library multiprocessing html from multiprocessing import Process Loc
  • pecl 安装 ibm_db2 失败

    我需要安装 ibm db2 扩展来使 php 与 db2 连接 所以我用了pecl 但它会产生错误 pecl install ibm db2 当我运行这个时 出现以下错误 checking in home db2inst1 sqllib l
  • Scala 的 Vector 是如何工作的?

    I read 这一页 http www scala lang org docu files collections api collections 40 html关于 Scala 集合的时间复杂度 正如它所说 Vector的复杂度是eC对于