- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Rope data structure 的标准实现中使用拉伸(stretch)树,节点将根据从字符串开头测量每个节点位置的排名统计来排序,因此通常在二叉搜索树中找到的键是无关紧要的,不是吗?
我问是因为下图中显示的键(感谢维基百科!)是字母,一旦节点数超过所选字母表的长度,这些字母可能会变得不唯一。使用整数或完全避免使用键不是更好吗?
另外,任何人都可以指出在每次操作后重新计算排名统计的逻辑的良好实现吗?
据推测,如果拆分的索引落在附加到特定节点的子字符串中,例如,在上面节点 E 上的“Hel”和“llo_”之间,您将从 E 中删除子字符串,拆分它并重新附加它作为 E 的两个 child 。对吗?
最后,经过一定次数的此类操作,我想这棵树最终可能会得到与字母一样多的叶子。跟踪它并根据需要修剪树(通过组合子字符串)的最佳方法是什么?
谢谢!
最佳答案
就其值(value)而言,您可以通过将子字符串附加到二叉搜索树的每个节点(而不仅仅是如上所示的叶节点)来使用 Splay 树实现 Rope。
每个节点的等级是它的大小加上它的左子树的大小。但是在 splay 操作期间重新计算排名时,您需要记住也要沿着 node.left.right
分支走下去。
如果每个节点都记录了对它所代表的子字符串的引用(参见实际子字符串本身),那么一切都会运行得更快。这样,当拆分操作落在现有节点内时,您只需修改节点的属性以反射(reflect)要拆分的子字符串的右侧部分,然后添加另一个节点来表示左侧部分并将其与左侧子树合并。
如上所述,每个节点记录(除了它的左、右和父属性等)它的等级、大小(以字符为单位)和它代表的第一个字符在你试图修改的字符串中的位置。这样,您就永远不会真正修改初始字符串:您只需对树的位进行操作,并在准备好时通过按顺序遍历它来重现最终字符串。
关于data-structures - 使用二叉搜索树(拉伸(stretch)树)实现 Rope 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484154/
我正在尝试使用 SpriteKit 制作一款游戏,其中主角射出“绳子”并在关卡中摇摆(想想蜘蛛侠一样)。制作绳索并将其连接到玩家和不同的 Sprite 上没有问题,但我真的不知道如何进行“射击”部分。
我正在阅读维基百科上的绳索数据结构,但我对描述有些困惑。 维基链接:http://en.wikipedia.org/wiki/Rope_(data_structure) 说明 A rope is a
我想我遇到了与 this user 相同的问题让 Jedi.el 正常工作,但解决方案会遇到更多麻烦。 我已经安装了 EPC 绳子 罗佩麦克斯 pymacs python-mode.el-6.1.3
我已经安装了这些,pip list: rope (0.10.3) ropemode (0.3) ropevim (0.7.0) 我拥有的所有 vim 插件: Plugin 'gmarik/vundle
我正在使用 Rope 和 Ropemacs 将我的 emacs 转换为 Python 的 IDE。 rope-auto-import 功能有问题。我在文档中读到我必须像这样添加我想要自动导入的模块:
Related to this question, based on a comment of user Eric Lippert. 是否有任何情况下 Rope数据结构比字符串生成器更有效?有些人认为
我想要一个具有快速连接和编辑操作的字符串表示。我已阅读论文 "Ropes: an Alternative to Strings" ,但自 1995 年以来,这方面是否有任何重大改进? 编辑:我之前考虑
我一直在研究绳索作为 Data.Text 的替代品,我非常喜欢我所看到的,以至于我现在不得不问这个问题.... 有没有什么情况下 Data.Text 会是更好的选择? 以下是导致我这样做的要点(如果我
有谁知道一个以简单的 Rope 数据结构和 QTextEdit 小部件为特色的示例项目?我正在尝试编写一个小而高效的文本编辑器并更好地理解数据结构。 最佳答案 this 中包含一个用 C++ 编写的绳
我一直在尝试使用 sprite 套件,为我的想法构建原型(prototype)。我一直在使用 SKPhysicsJointPin 将一串物理体连接在一起,以制作一根绳子(实际上更像是自行车链条,但它已
我按照http://www.enigmacurry.com/2009/01/21/autocompleteel-python-code-completion-in-emacs/#disqus_thre
文件 .vscode/.ropeproject/objectdb 在对一些 python 代码应用重构后(使用 DonJayamanne 的 pythonVSCode 扩展)被修改(创建)。 obje
当存储一堆元素并且我不需要随机访问容器时,我使用了 std::list这大部分都很好。然而,有时(尤其是当我只是将条目推回后面并且从不删除中间的某个地方时),我希望我有一些具有更好性能的结构来添加条目
我正在尝试制作 rope数据结构。它是一种二叉树,即递归数据结构。 绳索的目的是拆分和连接应该快速,这意味着您避免复制整个绳索。 因此,例如,用户应该能够说出 rope1 + rope2 并期望在~对
我正在使用 eric4 及其绳索插件来重构一些代码。我有许多方法,其签名使用 *args 和 **kwargs 语法。我想更改这些签名并删除此参数。 我已经尝试使用 Refactoring>Refac
我正在尝试在 Emacs 中使用带有自动完成功能的 Ropemacs,但我一直收到调试器错误: Debugger entered--Lisp error: (void-function rope-co
在 Cut the Rope 的关卡清除屏幕中,分数会递增到您在该关卡中获得的分数。我怎么能做这样的事情?我尝试使用 for 循环,一旦我达到该值就停止递增,但这会使我的应用程序崩溃。我想它需要在每个
我以前看过类似的问题here和 here ,但是他们已经 4 岁了,没有给出符合我要求的答案。 如果我在 Vim 中输入 Python 代码,例如: os.path.join('my', 'path'
在 Rope data structure 的标准实现中使用拉伸(stretch)树,节点将根据从字符串开头测量每个节点位置的排名统计来排序,因此通常在二叉搜索树中找到的键是无关紧要的,不是吗? 我问
Finger Tree (Data.Sequence) 之间的主要区别是什么?和一根绳子(Data.Rope)( Edward Kmett's version 或 Pierre-Etienne Meu
我是一名优秀的程序员,十分优秀!