- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,这里是 splay 算法,如果你想检查的话。
这是我的 splay 函数:
template <class WA>
void SplayTree<WA>::Do_Splay(SplayNODE<WA> *temp) //temp is the node which is to be splayed
{
if (temp==root) //if temp is root then
{ return; } //Do Nothing
else if (root->left==temp || root->right==temp) //else if temp is a child of root
{
if (root->left==temp) //if temp is left child of root then
{
Zig(root); //perform ZIG
}
else if (root->right==temp) //else if temp is right child of root then
{
Zag(root); //perform ZAG
}
}
else //if temp is some node lower in tree then
{
SplayNODE<WA> *father = findfather(temp, root);
SplayNODE<WA> *grandfather = findfather(father, root);
//cout<<"\n\tf = "<<father->key<<"\tgf = "<<grandfather->key;
////--------------------------------------------------------------------//-------////
if ( grandfather->left == father) //if father itself is left child
{
if(father->left == temp) //if temp is left child of father then
{ //CASE = ZIG ZIG
cout<<"\tZig(father)---Zag(grandfather)";
Zig(grandfather);
Zig(father);
}
else if ( father->right == temp ) //if temp is right child of father then
{ //CASE = ZIG ZAG
cout<<"\tZig(father)---Zag(grandfather)";
Zig(father);
Zag(grandfather);
}
}
//--------------------------------------------------------------------//-------////
if (grandfather->right == father) //if father itself is right child
{
if(father->right == temp)
{ //CASE = ZAG ZAG
cout<<"\tZag(grandfather)---Zag(father)";
Zag(grandfather);
Zag(father);
}
else if (father->left == temp)
{ //CASE = ZAG ZIG
cout<<"\tZag(father)---Zig(grandfather)";
Zag(father);
Zig(grandfather);
}
}
////--------------------------------------------------------------------//-------////
}
}
Zig(单向左旋转)和Zag(单向右旋转)方法如下
template <class WA>
void SplayTree<WA>::Zig(SplayNODE<WA> * & k2) //k2 is temp node where imbalance is present & we have to rotate it
{
SplayNODE<WA> *k1 = k2->left; //create copy of temp's left & store it in k1
k2->left = k1->right; //make k1's right child as temp's left child
k1->right = k2; //make k1 as parent of temp node
k2 = k1; //assign k1 as new temp node (this is done because temp was passed by reference)
}
//==============================//==============================//
template <class WA>
void SplayTree<WA>::Zag(SplayNODE<WA> * & k2)
{
SplayNODE<WA> *k1 = k2->right; //create copy of temp's right child & store it in k1
k2->right = k1->left; //store k1's left child as temp's right child
k1->left = k2; //make k2 as left child of k1
k2 = k1; //assign k1 as temp node (due to reference of k2)
}
//==============================//==============================//
& 这是我该死的问题。首先,我只在搜索功能中展开。即,如果找到具有特定 key 的节点,则展开。
我的搜索功能:
template <class WA>
SplayNODE<WA>* SplayTree<WA>::search(SplayNODE<WA> *temp, WA value) /////PVT DEFINITION
{
SplayNODE<WA> *to_searched = 0; //created new node pointer in which address of required node will be saved
if (temp!=0) //if arg. given temp node is not empty, then
{
if (temp->key==value) //if temp node has user-specified value then
{
to_searched = temp; //assign address of temp to to_searched node, which will be return @ the end
Do_Splay(temp); //perform splay at node which is found
}
if (to_searched==0) //if node is still empt then
{ to_searched = search(temp->left, value); } //recursive call to search in left sub-tree of temps
if (to_searched==0) //if node is still empt then
{ to_searched = search(temp->right, value); } //recursive call to search in right sub-tree of temps
}
return to_searched; //Finally return the searched node
}
//==============================//==============================//
如果节点是根的子节点,则以下工作正常。- 之字形单- 锯齿形单但是一旦我们关闭一个节点,问题就开始了。我无法成功执行任何这些事情。之字字 - 之字形 - 之字形 - 之字形
这是示例树。 (Zig Zig 大小写)
20
/ \
10 25
/ \
5 15
当搜索到 5 时,答案应该是。
5
\
10
\
20
/ \
15 25
但是我的输出变成了:
20
/ \
15 25
无法弄清楚是什么问题。干运行这个东西 100 次但是。 :(感谢所有帮助。提前致谢
最佳答案
在算法更改和尝试...
{“X 是右-左孙子吗?”} ---是---> {右旋转 p,左旋转 g}
{“X 是左右孙子吗?”} ---是---> {左旋转关于 p,右旋转关于 g}
关于c++ - Splay Tree Zig-Zag & Zag-Zig 旋转问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14042446/
平衡树 \(\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 树,但如果可能的话,我想要一个递归实现(我喜
前言 如果我们需要观察程序运行过程中,某一个变量、某一个序列的变化情况,你可以在修改的地方打断点 debug,或者直接在需要的地方输出就行了。 但是对于一些树形结构,我们不好将其直观地呈现出来,常
展开树插入/删除可以用不同的方式完成。一种流行的方法是插入 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 信息(整数) 节点的高度 我的作业包括创建“插入”方法。 我已经尝试了一些策略,但
我是一名优秀的程序员,十分优秀!