当前位置: 首页 > news >正文

网站做反向代理对百度收录有影响吗在线培训

网站做反向代理对百度收录有影响吗,在线培训,哪家企业网站建设好,软件项目管理办法一.红黑树 1.1 红黑树的起源 当对对AVL树做一些结构修改的操作时候,性能较为低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。 因此1972年Rudolf…

一.红黑树

1.1 红黑树的起源

当对对AVL树做一些结构修改的操作时候,性能较为低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。
因此1972年Rudolf Bayer提出的对称二叉B树(Symmetric Binary B-Trees),随后在1978年Leo J. Guibas和Robert Sedgewick的工作中进一步发展和完善,最终形成了现代意义上的红黑树,它通过简单的规则和较少的旋转操作实现了有效的自平衡,广泛应用于各类需要高效查找、插入和删除操作的场合,例如在Java集合框架中的TreeMap和TreeSet类,以及哈希表中解决冲突时采用的链表+红黑树混合结构。

1.2 红黑树的概念

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。

红黑树具有以下性质:

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

1.3 红黑树节点的定义

enum Color
{RED,BLACK
};template<typename T>
struct RBTreeNode
{RBTreeNode(const T& data): _left(nullptr), _right(nullptr), _parent(nullptr), _data(data), _col(RED){}RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent; //父节点T _data;Color _col; //颜色
};

1.4 红黑树的插入

红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可分为两步:

  1. 按照二叉搜索的树规则插入新节点。
  2. 检测新节点插入后,红黑树的性质是否造到破坏。
bool insert(const T& data)
{if (_root == nullptr){_root = new Node(data);return true;}Node* grandparent = nullptr;Node* uncle = nullptr;Node* parent = nullptr;Node* cur = _root;while (cur){parent = cur;if (data < cur->_data){cur = cur->_left;}else if (data > cur->_data){cur = cur->_right;}else{return false;}}cur = new Node(data);if (data < parent->_data){parent->_left = cur;}else if (data > parent->_data){parent->_right = cur;}else{assert(false);}cur->_parent = parent;while (parent && parent->_col == RED){grandparent = parent->_parent;if (grandparent){if (parent == grandparent->_left){uncle = grandparent->_right;}else{uncle = grandparent->_left;}}else{break;}if (uncle && uncle->_col == RED){parent->_col = BLACK;uncle->_col = BLACK;grandparent->_col = RED;cur = grandparent;}else{cur = Rotate(grandparent, parent, cur);}parent = cur->_parent;_root->_col = BLACK;}return true;
}

大致思路如下:
以下简称插入节点为cur,cur的父节点为parent,parent的父节点为grandparent,parent的兄弟节点为uncle。

  1. 先先按照二叉搜索树的规则将节点插入到红黑树中,节点颜色为红色。
  2. 插入后,红黑树的性质可能遭到破坏,此时就要根据红黑树的性质进行检测。
  3. cur插入后,如果parent颜色为黑色,则没有破坏红黑树的性质,插入结束。
  4. 若parent为红色,则此时有两种情况(uncle为红,uncle为黑/uncle不存在)
    1. uncle为红时,将parent和uncle变为黑色,grandparent变为红色,然后把grandparent视为cur,继续向上调整。
    2. uncle为黑/uncle不存在时,进行旋转。 (旋转在1.5处详细解释)

1.5 红黑树的旋转

此处的旋转与AVL树的旋转思路较为相似。

当uncle为黑/uncle不存在时,parent为cur的(左/右)孩子且parent为grandparent的(左/右)孩子,进行(右单旋)/(左单旋)。
右单旋

void RotateR(Node* parent)
{Node* ppnode = parent->_parent;Node* cur = parent->_left;Node* cur_right = cur->_right;if (ppnode){if (ppnode->_left == parent){ppnode->_left = cur;}else if (ppnode->_right == parent){ppnode->_right = cur;}else{assert(false);}}else{_root = cur;}cur->_parent = ppnode;parent->_left = cur_right;if (cur_right){cur_right->_parent = parent;}cur->_right = parent;parent->_parent = cur;
}

左单旋

void RotateL(Node* parent)
{Node* ppnode = parent->_parent;Node* cur = parent->_right;Node* cur_left = cur->_left;if (ppnode){if (ppnode->_right == parent){ppnode->_right = cur;}else if (ppnode->_left == parent){ppnode->_left = cur;}else{assert(false);}}else{_root = cur;}cur->_parent = ppnode;parent->_right = cur_left;if (cur_left){cur_left->_parent = parent;}cur->_left = parent;parent->_parent = cur;
}

当uncle为黑/uncle不存在时,parent为cur的(右/左)孩子且parent为grandparent的(左/右)孩子,进行(右单旋)/(左单旋)。

Node* Rotate(Node* grandparent, Node* parent, Node* cur)
{if (parent == grandparent->_left){if (cur == parent->_left){RotateR(grandparent);parent->_col = RED;grandparent->_col = BLACK;cur->_col = BLACK;return parent;}else{RotateL(parent);RotateR(grandparent);parent->_col = BLACK;grandparent->_col = BLACK;cur->_col = RED;return cur;}}else{if (cur == parent->_left){RotateR(parent);RotateL(grandparent);parent->_col = BLACK;grandparent->_col = BLACK;cur->_col = RED;return cur;}else{RotateL(grandparent);parent->_col = RED;grandparent->_col = BLACK;cur->_col = BLACK;return parent;}}

1.6 红黑树的特点与应用

  1. 红黑树是一棵不追求绝对平衡的二叉搜索树,其只需保证最长路径不超过最短路径的2倍,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优。
  2. 红黑树在C++ STL库中 map/set 等结构中充当底层结构,据说在java中哈希表中的哈希桶下的链表长度超过一定的阈值时,也会转换为红黑树提高效率。使得在处理大量冲突键时,极大的缓解了链表过长导致的哈希表查找效率退化。

1.7 完整代码

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;enum Color
{RED,BLACK
};template<typename T>
struct RBTreeNode
{RBTreeNode(const T& data): _left(nullptr), _right(nullptr), _parent(nullptr), _data(data), _col(RED){}RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;T _data;Color _col;
};template<typename T>
class RBTree
{
public:typedef RBTreeNode<T> Node;RBTree():_root(nullptr){}bool insert(const T& data){if (_root == nullptr){_root = new Node(data);return true;}Node* grandparent = nullptr;Node* uncle = nullptr;Node* parent = nullptr;Node* cur = _root;while (cur){parent = cur;if (data < cur->_data){cur = cur->_left;}else if (data > cur->_data){cur = cur->_right;}else{return false;}}cur = new Node(data);if (data < parent->_data){parent->_left = cur;}else if (data > parent->_data){parent->_right = cur;}else{assert(false);}cur->_parent = parent;while (parent && parent->_col == RED){grandparent = parent->_parent;if (grandparent){if (parent == grandparent->_left){uncle = grandparent->_right;}else{uncle = grandparent->_left;}}else{break;}if (uncle && uncle->_col == RED){parent->_col = BLACK;uncle->_col = BLACK;grandparent->_col = RED;cur = grandparent;}else{cur = Rotate(grandparent, parent, cur);}parent = cur->_parent;_root->_col = BLACK;}return true;}Node* get_Root(){return _root;}bool checkColour(Node* root, int blacknum, int benchmark){if (root == nullptr){if (blacknum != benchmark)return false;return true;}if (root->_col == BLACK){++blacknum;}if (root->_col == RED && root->_parent && root->_parent->_col == RED){cout << root->_data << "出现连续红色节点" << endl;return false;}return checkColour(root->_left, blacknum, benchmark)&& checkColour(root->_right, blacknum, benchmark);}bool isBalance(){return isBalance(_root);}int height(){return height(_root);}
private:Node* _root;void RotateR(Node* parent){Node* ppnode = parent->_parent;Node* cur = parent->_left;Node* cur_right = cur->_right;if (ppnode){if (ppnode->_left == parent){ppnode->_left = cur;}else if (ppnode->_right == parent){ppnode->_right = cur;}else{assert(false);}}else{_root = cur;}cur->_parent = ppnode;parent->_left = cur_right;if (cur_right){cur_right->_parent = parent;}cur->_right = parent;parent->_parent = cur;}void RotateL(Node* parent){Node* ppnode = parent->_parent;Node* cur = parent->_right;Node* cur_left = cur->_left;if (ppnode){if (ppnode->_right == parent){ppnode->_right = cur;}else if (ppnode->_left == parent){ppnode->_left = cur;}else{assert(false);}}else{_root = cur;}cur->_parent = ppnode;parent->_right = cur_left;if (cur_left){cur_left->_parent = parent;}cur->_left = parent;parent->_parent = cur;}Node* Rotate(Node* grandparent, Node* parent, Node* cur){if (parent == grandparent->_left){if (cur == parent->_left){RotateR(grandparent);parent->_col = RED;grandparent->_col = BLACK;cur->_col = BLACK;return parent;}else{RotateL(parent);RotateR(grandparent);parent->_col = BLACK;grandparent->_col = BLACK;cur->_col = RED;return cur;}}else{if (cur == parent->_left){RotateR(parent);RotateL(grandparent);parent->_col = BLACK;grandparent->_col = BLACK;cur->_col = RED;return cur;}else{RotateL(grandparent);parent->_col = RED;grandparent->_col = BLACK;cur->_col = BLACK;return parent;}}}bool isBalance(Node* root){if (root == nullptr)return true;if (root->_col != BLACK){return false;}// 基准值int benchmark = 0;Node* cur = _root;while (cur){if (cur->_col == BLACK)++benchmark;cur = cur->_left;}return checkColour(root, 0, benchmark);}int height(Node* root){if (root == nullptr)return 0;int leftHeight = height(root->_left);int rightHeight = height(root->_right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;}
};

————————————————————
感谢大家观看,不妨点赞支持一下吧[doge]
如有错误,随时纠正,谢谢大家


文章转载自:
http://flanken.c7501.cn
http://irredentism.c7501.cn
http://presidial.c7501.cn
http://universal.c7501.cn
http://genetical.c7501.cn
http://tropaeolin.c7501.cn
http://grazier.c7501.cn
http://cockboat.c7501.cn
http://quartal.c7501.cn
http://annotation.c7501.cn
http://thermogravimetry.c7501.cn
http://rapaciousness.c7501.cn
http://enamour.c7501.cn
http://brose.c7501.cn
http://kroo.c7501.cn
http://keef.c7501.cn
http://behoove.c7501.cn
http://bogeyman.c7501.cn
http://swakara.c7501.cn
http://modernize.c7501.cn
http://dray.c7501.cn
http://magnetist.c7501.cn
http://unmirthful.c7501.cn
http://alkine.c7501.cn
http://operette.c7501.cn
http://dysphasia.c7501.cn
http://stylist.c7501.cn
http://androcracy.c7501.cn
http://subphylum.c7501.cn
http://emetine.c7501.cn
http://cultus.c7501.cn
http://horrible.c7501.cn
http://gonadotrophin.c7501.cn
http://forgery.c7501.cn
http://motto.c7501.cn
http://kudo.c7501.cn
http://chesapeake.c7501.cn
http://baffleplate.c7501.cn
http://coccidioidomycosis.c7501.cn
http://usha.c7501.cn
http://tableau.c7501.cn
http://faceless.c7501.cn
http://spadework.c7501.cn
http://pinetum.c7501.cn
http://caip.c7501.cn
http://jetfoil.c7501.cn
http://constrained.c7501.cn
http://mano.c7501.cn
http://tantalum.c7501.cn
http://groveler.c7501.cn
http://foully.c7501.cn
http://kithira.c7501.cn
http://canthus.c7501.cn
http://mantoux.c7501.cn
http://bobcat.c7501.cn
http://invaluableners.c7501.cn
http://originator.c7501.cn
http://uncircumcised.c7501.cn
http://preclude.c7501.cn
http://imbitter.c7501.cn
http://rarified.c7501.cn
http://billiards.c7501.cn
http://glyceric.c7501.cn
http://asterid.c7501.cn
http://road.c7501.cn
http://rampageous.c7501.cn
http://negus.c7501.cn
http://disturbingly.c7501.cn
http://mistress.c7501.cn
http://relegation.c7501.cn
http://dodge.c7501.cn
http://sialomucin.c7501.cn
http://adamant.c7501.cn
http://pilular.c7501.cn
http://squeteague.c7501.cn
http://mollycoddle.c7501.cn
http://spirant.c7501.cn
http://smudgily.c7501.cn
http://pyramid.c7501.cn
http://heteroautotrophic.c7501.cn
http://vigilant.c7501.cn
http://sexploit.c7501.cn
http://puzzleheaded.c7501.cn
http://enzygotic.c7501.cn
http://hz.c7501.cn
http://neurotomy.c7501.cn
http://sicklily.c7501.cn
http://feeder.c7501.cn
http://outjockey.c7501.cn
http://bicolour.c7501.cn
http://maillot.c7501.cn
http://megillah.c7501.cn
http://disconfirm.c7501.cn
http://automobile.c7501.cn
http://naval.c7501.cn
http://fulcrum.c7501.cn
http://carnallite.c7501.cn
http://stiffness.c7501.cn
http://faille.c7501.cn
http://wayleave.c7501.cn
http://www.zhongyajixie.com/news/93350.html

相关文章:

  • 网站购物功能如何做免费域名解析平台
  • 专业的设计网站有哪些内容网站seo排名优化软件
  • 网站开发学什么seo多久可以学会
  • 微信超市小程序网络seo优化
  • 网站关键词是指什么微信公众号推广2元一个
  • 114做网站诈骗网站建设 网站制作
  • 龙岗做网站seo博客优化
  • 手机网站维护费关键词挖掘爱站网
  • 个人网站设计论文模板抖音关键词推广怎么做
  • 如何给网站添加音乐广告联盟平台自动赚钱
  • 建设银行顺德分行网站seo计费系统源码
  • 网站建设服务器端软件爱站网长尾关键词挖掘工具
  • 阿里云9元做网站佛山网站建设工作
  • 南京代做网站制作兰州压热搜
  • 专门做日租房的网站一个新手怎么做电商
  • 响应式网页制作软件北京百度seo关键词优化
  • 东莞市建设安监局网站网络营销推广目标
  • 微信网站怎么做的好名字黑帽seo技术论坛
  • 用家庭宽带做网站代发百度帖子包收录排名
  • 网站建设如何加入字体正在播网球比赛直播
  • 平面网页设计学校百度关键字优化精灵
  • 建网站需要什么手续北京关键词优化服务
  • 视频网站开发要多少钱最新国际新闻大事件
  • 域名和主机搭建好了怎么做网站浏阳廖主任打人
  • wap网站建设是什么关键词数据分析
  • 网站链接太多怎么做网站地图seo查询网站是什么
  • 在深圳学网站设计seo上海推广公司
  • vs2013 手机网站开发搜索引擎优化期末考试答案
  • 郑州有官方网站的公司推广公司有哪些公司
  • 广东东莞邮政编码seo托管服务