- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不明白展开是如何工作的。
我无法理解的部分是我们如何知道 a: i) zig
ii) zig-zag
或 iii) zig-zig
必须完成。
如果我理解正确的话,这与路径中的当前节点有关。
如果它是根的 child 那么它是一个 zig
否则是 (ii) 或 (iii) 取决于当前节点的父节点和当前节点是否都是左(或右)子节点。到此为止。
现在我没有得到的部分:
当我们向下移动时,不是将中间节点“移除”到左子树和右子树中的过程,以便我们有一个中间树最终将成为搜索项的根吗?
然后,如果我们从一棵树开始,我们将不断地执行 zig
而不会执行其他操作,因为我们正在删除元素并且始终位于根部。
示例:
例如,如果我正在寻找 20
,我会从根开始,然后向左走。所以当前节点有根作为父节点,我做了一个之字形。现在发生了什么??我在 26
并向左走,但 26
不也是根吗?那我应该做一个之字形吗?
但是从我在这个例子中看到的,一个锯齿形正在完成,我不明白为什么。
有什么帮助吗?
最佳答案
根是指整棵树的根,而不是你展开的子树的根。因此,在您的示例中,12 是整棵树的根。
...
如果您想要一个示例,我最近用 Java 编写了一个 SplayTree。您可以找到代码 here .
splay 树的重要之处在于它们将最近插入/查询的节点向上(最多)移动到树中的两层。您必须根据它的祖父节点和父节点位置执行之字形、之字形或之字形。
当访问一个节点x时,对x进行splay操作,将其移动到根节点。为了执行 splay 操作,我们执行一系列 splay 步骤,每个步骤都将 x 移近根。
展开步骤的三种类型是:(g = grand parent,p = parent,x = node to splay)
http://en.wikipedia.org/wiki/Splay_tree
下面是树中节点 3 的展开。
展开前的树:
└── 0
└── (right) 9
└── (left) 7
├── (left) 5
│ ├── (left) 1
│ │ └── (right) 2
│ │ └── (right) 4
│ │ └── (left) 3
│ └── (right) 6
└── (right) 8
经过(右->左)Zig-Zag 到节点 3。
└── 0
└── (right) 9
└── (left) 7
├── (left) 5
│ ├── (left) 1
│ │ └── (right) 3
│ │ ├── (left) 2
│ │ └── (right) 4
│ └── (right) 6
└── (right) 8
在另一个(左->右)Zig-Zag 到节点 3 之后。
└── 0
└── (right) 9
└── (left) 7
├── (left) 3
│ ├── (left) 1
│ │ └── (right) 2
│ └── (right) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 8
经过(左->左)Zig-Zig 到节点 3。
└── 0
└── (right) 3
├── (left) 1
│ └── (right) 2
└── (right) 7
├── (left) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 9
└── (left) 8
经过(右)Zig 到节点 3。现在是时候停止了,因为 3 位于根位置。
└── 3
├── (left) 0
│ └── (right) 1
│ └── (right) 2
└── (right) 7
├── (left) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 9
└── (left) 8t) 6
└── (right) 9
└── (left) 8
如果您尝试再次访问树中的节点 3,则不必展开它,因为它已经在根位置。
关于algorithm - 无法弄清楚 splaying 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806560/
平衡树 \(\tt{Treap}\) & \(\tt{Splay}\) 壹.单旋 \(\tt{Treap}\) 首先了解 \(\tt{BST}\) 非常好用的东西,但是数据可以把它卡成一
我是数据结构的初学者。我正在尝试为带有 splay 树的范围函数编写一些伪代码:Range(S, A, B),它将 S 更改为其键值 C 满足 A ≤ 的所有成员的集合C ≤ B。我知道伸展树(Spl
由于 splay tree 是一种不平衡二叉搜索树 ( brilliant.org/wiki/splay-tree ),它不能保证最大为 O(log(n)) 的高度。因此,我认为它不能保证 O(log
我有 2 个关于八角树的问题: 1。删除节点 我正在使用的书是这样说的:''当删除键 k 时,我们展开被删除的节点 w 的父节点。删除 8 的示例: 但是,我正在做的是:如果删除的节点不是根节点,我展
我正在研究伸展树(Splay Tree)的右旋转方法。当我尝试运行程序时,我不断收到空指针异常,但我不确定为什么。这是我的树 5 / 2 / 1 这是我得到空指
我正在尝试为伸展树(Splay Tree)编写 C++ 模板结构,但是当我尝试测试代码时,我得到了非常奇怪的结果。 这是我的模板代码: template struct splaytree {
我试图了解摊销的复杂性并在网上进行了几次搜索,但我还找不到好的资源。 那么谁能解释一下什么是摊销复杂度以及它如何在 splay 树中每个操作变为 O(lg n)? 最佳答案 对伸展树(Splay Tr
我不明白展开是如何工作的。 我无法理解的部分是我们如何知道 a: i) zig ii) zig-zag 或 iii) zig-zig 必须完成。 如果我理解正确的话,这与路径中的当前节点有关。 如果它
您会在生产环境中的哪些地方使用 splay-tree。我指的是真实生活的例子。 我正在考虑使用尝试和拉伸(stretch)树实现自动完成。对于大型数据集,从节点 x 到叶子遍历 trie 以返回结果并
我正在尝试自下而上地实现递归伸展树(Splay Tree)。我向下递归到需要展开的节点,然后找到该节点的父节点和祖父节点。然后,我可以根据情况进行之字形或之字形。问题是完成后,我将已经张开一次的节点返
我已经实现了几个 splay tree算法。 比较它们的最佳方式是什么? 添加随机节点时比较执行时间是否是一个好的开始? 我还实现了一个二叉搜索树,用于跟踪每个节点的访问量。我编写了一个 optimi
我一直在研究 Splay 树,因为我想实现一个。目前,我对红黑树、AVL 树、跳表和其他更简单的数据结构有一些“自学”经验。我想实现我的第一个 splay 树,但如果可能的话,我想要一个递归实现(我喜
展开树插入/删除可以用不同的方式完成。一种流行的方法是插入 key 并将其展开到根。但是我读过还有一种不同的方法,这个想法是 拆分 它分成两棵树,左边的树有值插入键。备用删除方法也是如此,将要删除的键
由于 splay 树用于缓存,我想知道当我想有效缓存时,Splay Tree 比 HashTable 有什么优势? 我什么时候应该更喜欢 splay 树而不是哈希表? 我想这是一个比 BST 更专业的
例如,我有一个这样的文件夹结构: src └─test ├─java └─com └─google └─test
问题是,当我单击树列表父元素时,它不会像在树面板中的 DoubleClick 上展开那样展开。任何人都可以帮助我找到我应该做什么来实现这一目标?在这张图片中,当我单击父节点时,它不会像我们看到的那样展
我知道如何捕获节点上的点击: // Define action when a node was clicked. $('#mytree').on("select_node.jstree
我正在寻找有人解释 Puppet 配置中 splay 和 splaylimit 的用法。 Puppet 站点本身的文档至少可以说是有限的。我正遭受主控上的惊群攻击,即多个代理同时向该代理敲击其目录,直
我必须使用java实现伸展树(Splay Tree)结构。给定一个名为 Node 的类,它具有: 左、右 child 信息(整数) 节点的高度 我的作业包括创建“插入”方法。 我已经尝试了一些策略,但
我一直在尝试学习一些数据结构的细节,并且我正在尝试让二叉伸展树(Splay Tree)正常工作。每次我运行以下代码并且我正在寻找的节点超过根的节点时,它都会告诉我它在那里,然后只删除从根向下的整个一侧
我是一名优秀的程序员,十分优秀!