不可变数据结构性能

2024-04-22

我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能。

根据我在 F# Sets 中读到的内容,内部使用红黑树作为其实现。如果每次我们想要向红黑树添加新内容时,我们基本上都必须重新创建它,那么它如何才能具有良好的性能呢?我在这里缺少什么?

尽管我要求 F# 的集合这样做,但我认为这与具有或使用不可变数据结构的任何其他语言一样相关。

Thanks


几乎所有不可变集合都是某种形式的平衡树。要创建新树,您必须重新分配从更改(插入、删除、“更新”)到根的路径上的节点。只要树是平衡的,这就会花费对数时间。如果您有类似 2-3-4 树(类似于红黑树)的预期出度为 3 的树,则只需使用 10 次分配即可处理一百万个元素。

在数据结构被期望是纯粹的语言中,它们确保分配速度很快。分配一个四元素节点将花费一次比较、一次增量和四次存储。在许多情况下,您可以分摊多个分配的比较成本。

如果您想更多地了解这些结构如何工作,一个很好的来源是作者:克里斯·冈崎。

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

不可变数据结构性能 的相关文章

  • 无法解析类型“Microsoft.AspNetCore.Identity.RoleManager”的服务

    我编写代码以在我的 asp net core 项目中向用户添加角色 这是我的角色控制器 public class RolesController Controller RoleManager
  • 如何为带有可选时间部分的通用日期格式定义 DateTime 解析格式?

    什么是正确的DateTime格式从通用日期格式的字符串中解析日期 G 带有可选时间部分 d 我可以有两种类型的日期 12 13 2012 6 30 00 PM 3 29 2013 如何统一解析它们 现在我正在尝试解析 G 格式 然后如果它没
  • 在应用程序窗口外检测 StylusDown

    简单的问题 希望答案不会是 你不能 我如何 在代码中 订阅 全局 手写笔按下事件 Windows 7 显然以某种方式做到了这一点 因为只要我使用手写笔 wacomm 笔和触摸 但这似乎无关紧要 就会出现小平板电脑图标 我想创建一个简单的绘图
  • Java中的String为什么是不可变的对象,但我在创建一个对象后仍然可以更改它的值? [复制]

    这个问题在这里已经有答案了 如果我可以创建一个字符串并给它一个值 这怎么可能呢 然后 我可以像这样简单地覆盖它的值 String a abc a def 我怎么可能改变的值a 我一定在这里遗漏了一些东西 我知道每当创建 String 对象时
  • Microsoft 同步框架 - 双向同步如何工作?

    我有两个客户端 A 和 B 两个客户端都有相同的同步本地数据缓存 如果客户端 A 对记录 X 进行离线编辑 然后客户端 B 也离线编辑记录 X 并与服务器同步 则当客户端 A 与服务器同步时 客户端 B 所做的更改不会反映出来 并且无论进行
  • Visual Studio 2013 未发现单元测试

    我在 Visual Studio 2013 中有一个简单的解决方案 它由一个 Web 项目 一个库项目和一个单元测试项目组成 当我打开解决方案并尝试运行单元测试时 Visual Studio 不会发现它们 要运行测试 我尝试转到菜单并选择
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • Socket.*Async 方法是线程化的吗?

    我目前正在尝试找出最小化 TCP 主服务器中使用的线程数量的最佳方法 以便最大限度地提高性能 由于我最近阅读了大量 C 5 0 的新异步功能 异步并不一定意味着多线程 这可能意味着将有限状态对象分成较小的块 然后通过交替与其他操作一起进行处
  • 在 Orchard 中设置唯一的主体类和 ID

    有没有办法在 Orchard 中为每页设置唯一的正文类和 ID 我希望能够在 编辑页面 部分控制这些 例如 主页的正文 ID 为 home 关于页面的正文 ID 为 about 等 并且 如果 about 页面下有子页面 这些页面将具有 a
  • 在程序集“SMSApp”中发现了不止一种迁移配置类型。指定要使用的名称

    我正在使用代码优先方法开发 mvc 5 应用程序 我面临一个问题 第一次当我尝试下面的命令时 它起作用并在该数据库中生成表 但是当我更改了更多类 然后尝试前两个查询时 它在这种情况下有效 但是当我尝试第三个命令时 它给了我这条消息 Firs
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 无法通过 HTTPS 调用 Web 服务

    我正在开发一个 Net 应用程序 它与 Web 服务通信以获取一些数据 Net 应用程序和 Web 服务之间的连接是通过 HTTPS 完成的 当我从 Net 应用程序调用 Web 服务时 我得到以下堆栈跟踪 System Net WebEx
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为

随机推荐

  • 如何在meteor.js中更新Mongodb集合?

    我有一个集合 当用户按下按钮时我需要更新它 我只需要将一个变量更改为另一个变量 在控制台中 这行代码有效 db users update username Jack age 13 username Jack 但是当我输入这段代码时 Temp
  • XCode 中的文件夹未显示在磁盘上

    我在 XCode 中向我的项目添加了一个文件夹 并将其命名为 Themes 它将用于存储我的 iPad 应用程序的主题 在它下面我有红色 蓝色等等 它们出现在 XCode 中 但是当我查看物理文件夹时 没有 Themes 目录 显然其下没有
  • 单选按钮在我的回收器视图中无法正常工作。视图中选择了多个单选按钮,这些按钮在焦点按钮中不可见

    我正在使用回收器视图在网格布局管理器中显示来自厨房或设备外部存储的所有图像 我使用单选按钮来显示图像是否被选择 PROBLEM 每当我从回收器视图中的可见视图中选择或取消选择单选按钮时 可见屏幕之外的一些其他视图就会被选择或取消选择 就像我
  • 使用托管标识连接到 Azure 应用程序配置时出现 403

    我正在尝试使用托管标识从网络框架应用程序连接到 Azure 应用程序配置 但遇到权限问题 我如何连接 options Connect new Uri https myconfigstore azconfig io new ManagedId
  • 在 Android 中出现可选文本菜单后,处理文本视图外部的触摸

    我已经通过在android中实现了可选择的文本 android textIsSelectable true 我现在需要做的是 当触摸文本 菜单 光标以外的任何地方时 使菜单消失 我该如何实现这一目标 首先 您可以点击此链接隐藏软件键盘 在单
  • 通过 ID 获取 ViewChildren 模板

    在我的组件中 我使用 ViewChildren 获取其标记模板的列表 ViewChildren TemplateRef private templates QueryList
  • 如何将长数字从csv导入excel而不在VBA中转换为科学记数法

    我用下面的代码打开了分号分隔的txt文件 保存到 Excel 后 无论该列的文本格式如何 长帐号都会显示为科学记数法 我在这里做错了什么 Application ScreenUpdating False Workbooks OpenText
  • “弱引用对象不再存在”是什么意思?

    我正在运行 Python 代码 收到以下错误消息 Exception exceptions ReferenceError weakly referenced object no longer exists in
  • 有人可以解释一下这段代码吗?排列代码[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在做一
  • 当 span 的高度和宽度为 0 且仅 padding-left 设置为 20px 时,padding 仍然存在

    这是我的设置 margin 0 padding 0 box sizing border box span padding left 25px background red span span 我有设置为的跨度标签box sizing bor
  • iframe 中元素的 CKEditor 内联编辑器

    在应用程序中 我在 iframe 中有内容可编辑元素 并且希望将内联 CKEditor 应用于这些元素 它可以工作 除非我滚动 iframe 时 CKEditor 工具栏不会随之滚动 是否有特殊标志或某种方法可以让工具栏随 iframe 内
  • MediaElement 冻结视频

    我应用一些LinearGradientBrush动画到MediaElement在这段视频冻结之后 我尝试通过重置它Player1 OpacityMask null 但没有喜悦 顺便说一句 如果我制作动画Opacity of the Medi
  • Django:仅记录我项目的应用程序

    默认情况下 我可以在 settings py 中启用日志记录LOGGING通过创建记录器进行配置 这将捕获所有日志 但是 如果我只想查看项目应用程序的日志记录而不是 Django 内部的日志记录 该怎么办 我可以想象在我的每个 Django
  • SVG:一个过滤器中的多种效果

    我正在尝试在单个 SVG 过滤器中实现多个阴影 但我相信我的问题比这更通用 如何将多种效果添加到单个 SVG 滤镜中 就我而言 这就是我具体想做的事情 我有一个当前包含单个路径元素的 SVG 文档 并且我已对该路径元素应用了单个阴影效果 我
  • 如何使用 JavaScript 检测 Internet Explorer (IE) 和 Microsoft Edge?

    我环顾四周 了解到有很多方法可以检测 Internet Explorer 我的问题是这样的 我的 HTML 文档上有一个区域 单击该区域时 会调用与任何类型的 Internet Explorer 都不兼容的 JavaScript 函数 我想
  • 将node.js neDB数据获取到变量中

    我能够在nodejs 中的neDB 数据库中插入和检索数据 但我无法将数据传递到检索 数据的函数之外 我已经阅读了 neDB 文档 并且搜索并尝试了回调和返回的不同组合 请参阅下面的代码 但没有找到解决方案 我是 javascript 新手
  • Eclipse 模拟器中的屏幕尺寸

    我正在看一个简单的例子 我正在使用 Eclipse 当我单击 运行 工具栏图标时 会显示我的应用程序启动屏幕 正如我所希望的那样 但整个 droid 模拟器太大 太大 我搜索了一下 发现应该去Window Android SDK and S
  • 使用复选按钮禁用小部件?

    我如何使用复选按钮禁用条目 我得到了这个 但它不起作用 python 2 7 1 usr bin env python2 7 coding utf 8 from Tkinter import root Tk class Principal
  • 使用 GsmCellLocation 的 getPsc() 始终返回 -1

    我成功得到了GsmCellLocation以及相关的 cid 和 lac 信息 但服务小区的 PSC 主扰码 总是以初始化值 1 返回 有人能得到服务小区的真实 PSC 值吗 telephonyManager TelephonyManage
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里