跳跃列表与二叉搜索树

2023-12-10

我最近遇到了一种称为跳过列表。它似乎与二叉搜索树具有非常相似的行为。

为什么要在二叉搜索树上使用跳跃列表?


跳过列表更适合并发访问/修改。赫伯·萨特写了一篇article关于并发环境中的数据结构。它有更深入的信息。

二叉搜索树最常用的实现是红黑树。当树被修改时,并发问题就会出现,它通常需要重新平衡。重新平衡操作可能会影响树的大部分,这需要在许多树节点上使用互斥锁。将节点插入到跳跃列表中的操作更加本地化,​​只有直接链接到受影响节点的节点才需要锁定。

乔恩·哈罗普斯评论更新

我读了弗雷泽和哈里斯的最新论文无锁并发编程。如果您对无锁数据结构感兴趣,这确实是个好东西。该论文重点关注事务内存以及理论操作多字比较和交换 MCAS。这两者都是在软件中模拟的,因为尚无硬件支持它们。他们能够用软件构建 MCAS,这给我留下了深刻的印象。

我没有发现事务内存的东西特别引人注目,因为它需要垃圾收集器。还软件事务内存受到性能问题的困扰。然而,如果硬件事务内存变得普遍,我会非常兴奋。最终它仍处于研究阶段,并且在接下来的十年左右的时间内不会用于生产代码。

在第 8.2 节中,他们比较了几种并发树实现的性能。我将总结他们的发现。下载 pdf 版本是值得的,因为它在第 50、53 和 54 页上有一些信息非常丰富的图表。

  • 锁定跳过列表速度快得惊人。它们随着并发访问的数量而扩展得非常好。这就是跳跃列表的特殊之处,其他基于锁的数据结构在压力下往往会崩溃。
  • 无锁跳过列表始终比锁定跳过列表快,但也只是勉强快。
  • 事务性跳过列表始终比锁定和非锁定版本慢 2-3 倍。
  • 锁定红黑树并发访问下发出嘎嘎声。它们的性能随着每个新并发用户的增加而线性下降。在两种已知的锁定红黑树实现中,一种本质上在树重新平衡期间具有全局锁定。另一种使用奇特(且复杂)的锁升级,但仍然没有明显优于全局锁版本。
  • 无锁红黑树不存在(不再正确,请参阅更新)。
  • 事务性红黑树与事务性跳过列表相当。这是非常令人惊讶和非常有希望的。事务性内存,虽然更容易编写,但速度较慢。在非并发版本上可以像快速搜索和替换一样简单。

Update
这是关于无锁树的论文:使用 CAS 的无锁红黑树.
我没有深入研究过,但表面上看起来很可靠。

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

跳跃列表与二叉搜索树 的相关文章

  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 是否有加权水库采样的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当数据流中的点具有相关权重时 是否有一种算法可以执行水库采样 Pavlos Efraimidis 和 Paul Spirakis 的算
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait
  • 为什么 Dijkstra 算法使用减密钥?

    Dijkstra 教给我的算法如下 while pqueue is not empty distance node pqueue delete min if node has been visited continue else mark
  • 用于查找最近邻居的空间划分算法如何工作?

    为了找到最近的邻居 空间分区 http en wikipedia org wiki Nearest neighbor search Space partitioning是算法之一 它是如何工作的 假设我有一组 2D 点 x 和 y 坐标 并
  • 我如何开始玩五子棋?

    我读到Gomoku http en wikipedia org wiki Gomoku它可以使用 Minimax 和 Alpha Beta 剪枝算法来实现 所以 我阅读了这些算法 现在了解了游戏将如何解决 但是当我坐下来编写代码时 我面临着
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • 你能用 C# 编写一个同样优雅的排列函数吗?

    我非常喜欢这个 6 行解决方案 并尝试在 C 中复制它 基本上 它会排列数组的元素 def permute xs pre if len xs 0 yield pre for i x in enumerate xs for y in perm
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • Java 中查看 ArrayList 是否包含对象的最有效方法

    我有一个 Java 对象的 ArrayList 这些对象有四个字段 我用其中两个字段来将对象视为与另一个对象相等 我正在寻找最有效的方法 给定这两个字段 以查看数组是否包含该对象 问题在于这些类是基于 XSD 对象生成的 因此我无法修改类本
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 人们今天使用的可扩展语言是什么?

    维基百科说 可扩展编程是计算机科学中使用的一个术语 描述一种计算机编程风格 重点关注扩展编程语言 编译器和运行时环境的机制 例如 Tcl 允许您编写自己的控制结构 看here http wiki tcl tk 685 我有兴趣编制在实际代码
  • 如何以最低的价格优化购物车?

    我有一个我想买的物品清单 这些商品由不同的商店提供 价格也不同 商店有单独的送货费用 我正在寻找一种最佳的购物策略 以及支持它的java库 以最低的总价购买所有商品 Example 商品 1 在 Shop1 的售价为 100 美元 在 Sh
  • 文件头或一般注释

    有人对文件有结构良好的起始评论吗 我正在寻找看起来不错的东西 要么很花哨 要么很专业 我所说的一般注释是指文件顶部的注释 显示您的名称和文件的用途 像这个 hello program to print out Hello World Aut
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • CALayers 没有因 UIView 的边界变化而调整大小。为什么?

    我有一个UIView其中大约有8种不同的CALayer添加到其图层的子图层 如果我修改视图的边界 动画 然后视图本身缩小 我用backgroundColor but 子层的大小保持不变 怎么解决这个问题呢 我使用了与 Solin 相同的方法
  • 来自 2D 数组 CUDA 的 2D 纹理

    我试图将 Nx3 数组传递给内核 并像在纹理内存中一样从中读取并写入第二个数组 这是我的简化代码 其中 N 8 include
  • 替换数据框中的字符串

    我正在尝试替换大型 data frame 中的某个字符串 我刚刚找到以下解决方案但是gsub不保留原始的 data frame 布局 我怎样才能做到这一点 我的意思是我想替换一个字符串 并且不想更改 df 的布局 考虑这个例子 test l
  • 嵌入式二进制

    错误 嵌入的二进制文件未使用与父应用程序相同的证书进行签名 验证嵌入式二进制目标的代码签名设置与父应用程序的代码签名设置是否匹配 另外 为什么我的个人资料不断被 XC 通配符个人资料替换 解决了问题 我按照这个步骤解决了 转到我的构建设置并
  • 字典中值的字典 KeyError

    我在字典中有一个字典 123456789 u PhoneOwner u Bob Frequency 0 98765431 u PhoneOwner u Sarah Frequency 0 这个想法是扫描号码拨打的电话列表并与字典进行比较 每
  • 使用 Flexbox 连续显示 4 个 div

    我试图使用下面的 html 在一行中显示 4 个框 所以一排应该有 4 个盒子 我总共有 8 个盒子 有 2 行 4 列 div class parent div class child box1 A Child div div class
  • Android WebView 在 WebView 中单击打开,而不是默认浏览器

    我使用 WebView 做了一个示例应用程序 在该 Web 视图中 URL 来自 Web 服务 它工作正常 但如果我单击该 WebView 中的任何链接 它会自动转到默认 Web 浏览器 但我只想在我的应用程序网络视图中打开 这是我的代码
  • “不是空格也不是连字符”的正则表达式是什么

    我尝试了这个 但它不起作用 s 有任何想法吗 s 应该有效 所以会的 s char 类 在 char 类内部 是个 否定词出现在开头时 s 空格的缩写 字面连字符 连字符是 元字符位于 char 类中 但不是 当它出现在开头或 在最后
  • Websocket 不支持 SSL

    https www hi todd com websocket 我使用 MQTT 协议创建了一个演示 它在 HTTP 连接下运行良好 但是当我尝试将 HTTP 更改为 https 时 出现连接错误 我已在 mosquitto conf 文件
  • 是否可以选择带有 nth-child 的最后 n 个项目?

    使用标准列表 我尝试选择最后 2 个列表项 我有各种排列An B但似乎没有选择最后两个 li nth child n 2 selects from the second onwards li nth child n 2 selects ev
  • 在 Perl 中,如果强制使用 foreach 循环,如何找到字符串中匹配的位置?位置

    我必须使用 while 循环找到较大字符串中匹配字符串的所有位置 并使用 foreach 循环作为第二种方法 我已经弄清楚了 while 循环方法 但我陷入了 foreach 方法 这是 while 方法 my sequence AACAA
  • 在iOS中,如何向下拖动来关闭模态框?

    关闭模态框的常见方法是向下滑动 我们如何允许用户向下拖动模态框 如果足够远 则模态框被关闭 否则它会动画回到原始位置 例如 我们可以发现它用于 Twitter 应用程序的照片视图或 Snapchat 的 发现 模式 类似的线程指出 当用户向
  • Android 10 版本之后如何验证 IMEI 号码?

    我需要验证 IMEI 号码 他们有验证输入 IMEI 的机制吗 我们可以获得 true 或 false 的验证状态吗 您不能 第三方应用程序不能使用 IMEI 也不能使用手机的序列号和其他不可重置的设备标识符 对不可重置设备标识符的限制 从
  • 在上下文菜单中定位菜单项图像(MENUITEMINFO 的 hbmpItem)

    我正在将菜单项插入到主题文本控件的 Outlook 上下文菜单中 在这里您可以找到我之前提出的有关执行此操作的问题 我遇到的问题是 菜单项的图像在 Outlook 2010 中的位置很奇怪 在 Outlook 2007 中 它的位置不同 在
  • C++ 使用 ShellExecute 打开链接

    如果我这样写 ShellExecute NULL open www google com NULL NULL SW SHOWNORMAL 一切都很好 而且都是应该的样子 但我希望用户可以输入他想去的链接 std cout lt lt Ent
  • 找到两个数组之间的最小差异[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 给定两个排序数组 A 和 B 找到 i j 其中 A i B j 是最小值 由于数组已排
  • 添加键盘快捷键来执行 Chrome 扩展

    我创建了一个 chrome 扩展 我想使用键盘快捷键来执行它 Snippet suggested key default Ctrl Shift F 我尝试过不同的组合 例如 Ctrl Shift A Ctrl Shift D Alt X 和
  • 需要 T-SQL 查询找到所有可能的方式

    create table sample product varchar 100 Price float insert into sample values Pen 10 insert into sample values DVD 29 in
  • 滞后看不到 mutate 对前一行的影响

    我似乎偶然发现了一个mutate lag ifelse我无法解释的行为 我有以下 简化的 数据框 test lt data frame type c START END START START START START END strings
  • 跳跃列表与二叉搜索树

    我最近遇到了一种称为跳过列表 它似乎与二叉搜索树具有非常相似的行为 为什么要在二叉搜索树上使用跳跃列表 跳过列表更适合并发访问 修改 赫伯 萨特写了一篇article关于并发环境中的数据结构 它有更深入的信息 二叉搜索树最常用的实现是红黑树