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

设计平台网站wordpress 文章阅读次数

设计平台网站,wordpress 文章阅读次数,织梦怎么制作手机网站源码,聊城做网站价格二叉搜索树#xff08;key模型与key_value模型#xff09; 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3. ⼆叉搜索树的插⼊4. ⼆叉搜索树的查找5. ⼆叉搜索树的删除6. ⼆叉搜索树的实现代码7. ⼆叉搜索树key和key/value使⽤场景7.1 key搜索场景#xff1a;7.2 key/value搜… 二叉搜索树key模型与key_value模型 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3. ⼆叉搜索树的插⼊4. ⼆叉搜索树的查找5. ⼆叉搜索树的删除6. ⼆叉搜索树的实现代码7. ⼆叉搜索树key和key/value使⽤场景7.1 key搜索场景7.2 key/value搜索场景7.3 key/value⼆叉搜索树代码实现 8、运用于实际的key_value 今天我来介绍的是二叉搜索树这一块我希望大家如果有不会的地方下来好好理解这一节课与下一节的set/map关联挺大的。 1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树它或者是⼀棵空树或者是具有以下性质的⼆叉树: –• 若它的左⼦树不为空则左⼦树上所有结点的值都⼩于等于根结点的值 –• 若它的右⼦树不为空则右⼦树上所有结点的值都⼤于等于根结点的值 –• 它的左右⼦树也分别为⼆叉搜索树 –• ⼆叉搜索树中可以⽀持插⼊相等的值也可以不⽀持插⼊相等的值具体看使⽤场景定义后续我们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树其中map/set不⽀持插⼊相等值multimap/multiset⽀持插⼊相等值.(multimap/multiset)这一块我们下一节介绍,今天我主要介绍的是不允许冗余的情况 2. ⼆叉搜索树的性能分析 最优情况下⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树)其⾼度为 O(log2 N) 最差情况下⼆叉搜索树退化为单⽀树(或者类似单⽀)其⾼度为 O( N/2) 所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为 O(N) 那么这样的效率显然是⽆法满⾜我们需求的我们后续课程需要继续讲解⼆叉搜索树的变形平衡⼆叉搜索树AVL树和红⿊树才能适⽤于我们在内存中存储和搜索数据。 另外需要说明的是⼆分查找也可以实现 O(logN) 级别的查找效率但是⼆分查找有两⼤缺陷 需要存储在⽀持下标随机访问的结构中并且有序。插⼊和删除数据效率很低因为存储在下标随机访问的结构中插⼊和删除数据⼀般需要挪动数据。 这⾥也就体现出了平衡⼆叉搜索树的价值。 3. ⼆叉搜索树的插⼊ 以上的基本知识我们学习完后就来看一下二叉树的插入。 1、树为空我们直接将第一个插入的节点作为根节点即可。 2、数不为空按⼆叉搜索树性质插⼊值⽐当前结点⼤往右⾛插⼊值⽐当前结点⼩往左⾛找到空位置插⼊新结点。 3. 如果⽀持插⼊相等的值插⼊值跟当前结点相等的值可以往右⾛也可以往左⾛找到空位置插⼊新结点。要注意的是要保持逻辑⼀致性插⼊相等的值不要⼀会往右⾛⼀会往左⾛这里我建议向左走后序我们会学习平衡的概念这棵树失衡的情况下右节点会跑到左边 这里我们可以按照之前学习二叉树时二叉树的构建一样采用递归来插入但这里有个简单的方式那就是循环我们直接比较当前节点的值与插入的值的大小如果小于就走左大于就走右等于直接就返回false这里我只写不允许冗余大家下来可以考虑有冗余的情况如果当前节点走到空了那这个位置就是我们需要插入的位置。 节点类 templateclass k//k就是我们的key struct BSTNode {k _key;BSTNodek* _left;BSTNodek* _right;BSTNode(const k x) :_key(x), _left(nullptr), _right(nullptr) {}//构造 }; //节点插入部分 bool insert(const k x) {if (_root nullptr){_root new Node(x);}//根节点为空Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}elsereturn false;}//找到该插入的位置为curcur new Node(x);//找到以后还需要判断它插入在父节点哪一边if (x parent-_key){parent-_left cur;}else{parent-_right cur;}return 0; }这里是需要引入cur当前节点的parent父亲指针的因为我们要插入节点需要将插入的节点与整棵树链接。 这一块写完不好测试对吧因为调试窗口只能看到节点插入与否那我们写一个中序遍历首先搜索二叉树永远是一个左小于根根小于右的结构中序遍历一定是一个递增的数列这一块要是不知道的建议去其他地方找视频看文字不好演示这里就不做演示了。 void _inorder(const Node* root) {if (root nullptr)return;_inorder(root-_left);cout root-_key ;_inorder(root-_right);}这就是中序的代码但是我们可以看到要调用这个函数必须要传一个节点指针二叉树的私有成员就是我们的_root指针,我们能在外部访问我们的根再传入吗 为了不破坏类的封装这里有两种方式解决 1、getroot函数提供访问根节点的指针。 2、再写一个共有的调用_inorder的函数类外部不能访问类内部是可以访问的。 void inorder() {_inorder(_root);cout endl; }这样就搞定了。 那现在我们来测试一下 这里的key模型担任的工作是不是可以有去重加排序啊。 4. ⼆叉搜索树的查找 从根开始⽐较查找xx⽐根的值⼤则往右边⾛查找x⽐根值⼩则往左边⾛查找。最多查找⾼度次⾛到到空还没找到这个值不存在。如果不⽀持插⼊相等的值找到x即可返回如果⽀持插⼊相等的值意味着有多个x存在⼀般要求查找中序的第⼀个x。如下图查找3要找到1的右孩⼦的那个3返回 写完插入写查找是不是就太简单了啊 Node* find(const k x) {Node* cur _root;while (cur){if (x cur-_key)cur cur-_left;else if (x cur-_key)cur cur-_right;elsereturn cur;}return nullptr; }这里我们就不需要parent了因为我们只是查找当前节点在不在跟父节点没有半毛钱关系对吧。 5. ⼆叉搜索树的删除 ⾸先查找元素是否在⼆叉搜索树中如果不存在则返回false。 如果查找元素存在则分以下四种情况分别处理假设要删除的结点为N 要删除结点N左右孩⼦均为空要删除的结点N左孩⼦位空右孩⼦结点不为空要删除的结点N右孩⼦位空左孩⼦结点不为空要删除的结点N左右孩⼦结点均不为空 对应以上四种情况的解决⽅案 5. 把N结点的⽗亲对应孩⼦指针指向空直接删除N结点情况1可以当成2或者3处理效果是⼀样的 6. 把N结点的⽗亲对应孩⼦指针指向N的右孩⼦直接删除N结点 7. 把N结点的⽗亲对应孩⼦指针指向N的左孩⼦直接删除N结点 8. ⽆法直接删除N结点因为N的两个孩⼦⽆处安放只能⽤替换法删除。找N左⼦树的值最⼤结点R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N因为这两个结点中任意⼀个放到N的位置都满⾜⼆叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换转⽽变成删除R结点R结点符合情况2或情况3可以直接删除。 这是第一种与第二种情况。 第三种情况较为复杂一点 bool erase(const k x) {Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}else//找到当前位置{if (cur-_left nullptr)//左为空{if (_root cur)//特殊情况当cur为空且左为空就将根移动{_root cur-_right;}else{if (cur parent-_left)parent-_left cur-_right;elseparent-_right cur-_right;}delete cur;}else if (cur-_right nullptr)//右为空{if (_root cur)//同上{_root cur-_left;}else{if (cur parent-_left)parent-_left cur-_left;elseparent-_right cur-_left;}delete cur;}else//双边节点{Node* replaceparent cur;Node* replace cur-_right;while (replace-_left){replaceparent replace;replace replace-_left;}cur-_key replace-_key;//replace的左边一定没有节点了if (replace replaceparent-_left)replaceparent-_left replace;elsereplaceparent-_right replace;delete replace;}return true;}}return false; }6. ⼆叉搜索树的实现代码 #includeiostream using namespace std;namespace key {templateclass kstruct BSTNode{k _key;BSTNodek* _left;BSTNodek* _right;BSTNode(const k x) :_key(x), _left(nullptr), _right(nullptr) {}};//节点templateclass kclass BSTree{typedef BSTNodek Node;public:BSTree() default;//强制生成构造BSTree(const BSTree t){_root copy(t._root);}//拷贝构造这块比较简单如果实在不懂的话私聊我BSTree operator(BSTree t){swap(_root, t._root);return *this;}//赋值构造~BSTree(){destroy(_root);_root nullptr;}//析构采用一个后序遍历即可bool insert(const k x){if (_root nullptr){_root new Node(x);}//根节点为空Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}elsereturn false;}//找到该插入的位置为curcur new Node(x);if (x parent-_key){parent-_left cur;}else{parent-_right cur;}return 0;}void inorder(){_inorder(_root);cout endl;}bool erase(const k x){Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}else//找到当前位置{if (cur-_left nullptr){if (_root cur){_root cur-_right;}else{if (cur parent-_left)parent-_left cur-_right;elseparent-_right cur-_right;}delete cur;}else if (cur-_right nullptr){if (_root cur){_root cur-_left;}else{if (cur parent-_left)parent-_left cur-_left;elseparent-_right cur-_left;}delete cur;}else//双边节点{Node* replaceparent cur;Node* replace cur-_right;while (replace-_left){replaceparent replace;replace replace-_left;}cur-_key replace-_key;//replace的左边一定没有节点了if (replace replaceparent-_left)replaceparent-_left replace;elsereplaceparent-_right replace;delete replace;}return true;}}return false;}Node* find(const k x){Node* cur _root;while (cur){if (x cur-_key)cur cur-_left;else if (x cur-_key)cur cur-_right;elsereturn cur;}return nullptr;}private:void _inorder(const Node* root){if (root nullptr)return;_inorder(root-_left);cout root-_key ;_inorder(root-_right);}void destroy(Node* root){if (root nullptr)return;destroy(root-_left);destroy(root-_right);delete root;}Node* copy(Node* root){if (root nullptr)return nullptr;Node* r new Node(root-_key);r-_left copy(root-_left);r-_right copy(root-_right);return r;}Node* _root nullptr;}; }这份代码是key的模型什么是key_value呢就是每个节点存储两个值key跟上面写的一样作为插入删除等等的基准value想存啥就存啥。 7. ⼆叉搜索树key和key/value使⽤场景 7.1 key搜索场景 只有key作为关键码结构中只需要存储key即可关键码即为需要搜索到的值搜索场景只需要判断key在不在。key的搜索场景实现的⼆叉树搜索树⽀持增删查但是不⽀持修改修改key破坏搜索树结构了。 场景1⼩区⽆⼈值守⻋库⼩区⻋库买了⻋位的业主⻋才能进⼩区那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统⻋辆进⼊时扫描⻋牌在不在系统中在则抬杆不在则提⽰⾮本⼩区⻋辆⽆法进⼊。 场景2检查⼀篇英⽂⽂章单词拼写是否正确将词库中所有单词放⼊⼆叉搜索树读取⽂章中的单词查找是否在⼆叉搜索树中不在则波浪线标红提⽰。 7.2 key/value搜索场景 每⼀个关键码key都有与之对应的值valuevalue可以任意类型对象。树的结构中(结点)除了需要存储key还要存储对应的value增/删/查还是以key为关键字⾛⼆叉搜索树的规则进⾏⽐较可以快速查找到key对应的value。key/value的搜索场景实现的⼆叉树搜索树⽀持修改但是不⽀持修改key修改key破坏搜索树结构了可以修改value。 场景1简单中英互译字典树的结构中(结点)存储key(英⽂)和vlaue(中⽂)搜索时输⼊英⽂则同时查找到了英⽂对应的中⽂。 场景2商场⽆⼈值守⻋库⼊⼝进场时扫描⻋牌记录⻋牌和⼊场时间出⼝离场时扫描⻋牌查找⼊场时间⽤当前时间-⼊场时间计算出停⻋时⻓计算出停⻋费⽤缴费后抬杆⻋辆离场。 场景3统计⼀篇⽂章中单词出现的次数读取⼀个单词查找单词是否存在不存在这个说明第⼀次出现单词1单词存在则单词对应的次数。 7.3 key/value⼆叉搜索树代码实现 这里只需要增加一个模版参数即可 namespace key_value {templateclass k,class vstruct BSTNode{k _key;v _value;BSTNodek,v* _left;BSTNodek,v* _right;BSTNode(const k x,const v y) :_key(x), _value(y), _left(nullptr), _right(nullptr) {}};//节点templateclass k,class vclass BSTree{typedef BSTNodek,v Node;public:BSTree() default;//强制生成构造BSTree(const BSTree t){_root copy(t._root);}BSTree operator(BSTree t){swap(_root, t._root);return *this;}~BSTree(){destroy(_root);_root nullptr;}bool insert(const k x,const v y){if (_root nullptr){_root new Node(x, y);}//根节点为空Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}elsereturn false;}//找到该插入的位置为curcur new Node(x,y);if (x parent-_key){parent-_left cur;}else{parent-_right cur;}return 0;}void inorder(){_inorder(_root);cout endl;}bool erase(const k x){Node* parent nullptr;Node* cur _root;while (cur){if (x cur-_key){parent cur;cur cur-_left;}else if (x cur-_key){parent cur;cur cur-_right;}else//找到当前位置{if (cur-_left nullptr){if (_root cur){_root cur-_right;}else{if (cur parent-_left)parent-_left cur-_right;elseparent-_right cur-_right;}delete cur;}else if (cur-_right nullptr){if (_root cur){_root cur-_left;}else{if (cur parent-_left)parent-_left cur-_left;elseparent-_right cur-_left;}delete cur;}else//双边节点{Node* replaceparent cur;Node* replace cur-_right;while (replace-_left){replaceparent replace;replace replace-_left;}cur-_key replace-_key;//replace的左边一定没有节点了if (replace replaceparent-_left)replaceparent-_left replace;elsereplaceparent-_right replace;delete replace;}return true;}}return false;}Node* find(const k x){Node* cur _root;while (cur){if (x cur-_key)cur cur-_left;else if (x cur-_key)cur cur-_right;elsereturn cur;}return nullptr;}private:void _inorder(const Node* root){if (root nullptr)return;_inorder(root-_left);cout root-_key - root-_value endl;_inorder(root-_right);}void destroy(Node* root){if (root nullptr)return;destroy(root-_left);destroy(root-_right);delete root;}Node* copy(Node* root){if (root nullptr)return nullptr;Node* r new Node(root-_key,root-_value);r-_left copy(root-_left);r-_right copy(root-_right);return r;}Node* _root nullptr;}; }8、运用于实际的key_value void test4() {string arr[] { 苹果, 西瓜, 苹果, 西瓜, 苹果, 苹果, 西瓜,苹果, 香蕉, 苹果, 香蕉 };key_value::BSTreestring, int countTree;for (const auto str : arr){// 先查找水果在不在搜索树中// 1、不在说明水果第一次出现则插入水果, 1// 2、在则查找到的结点中水果对应的次数//BSTreeNodestring, int* ret countTree.Find(str);auto ret countTree.find(str);if (ret nullptr){countTree.insert(str, 1);}else{// 修改valueret-_value;}}countTree.inorder();key_value::BSTreestring, int copy countTree;copy.inorder();}
http://www.w-s-a.com/news/816119/

相关文章:

  • 网站建设服务中企动力建筑工程网络进度计划备注填写范例
  • 电子商务网站开发与建设试卷php网站开发专业
  • 运城网站制作路90江苏省网站备案系统
  • 唐山做企业网站实体门店管理系统
  • 网站优化推广教程深圳网站建设世纪前线
  • 网站建设专家哪家好兰州网络推广执行
  • 广东住房和城乡建设厅网站王芃增加网站收录
  • 北京网站建设手机app电子商务网红营销的劣势
  • 网站 营销型wordpress获取4条文章标题
  • 浦东区建设工程监督网站建立全国统一的突发事件信息系统
  • 做网站需要基础吗重庆市造价信息网
  • 我要建设公司网站大连培训网站建设
  • 网站建设校长信箱设计方案小程序报价开发
  • 电子网站建设ppt模板营销策划方案怎么写?
  • 什么网站收录排名最高济南能源建设网站
  • 深圳移动网站建设公司价格桂林做网站哪家公司好
  • 互联网网站名字网站合作建设合同
  • 舟山高端网站设计广州优化排名推广
  • 哪个网站做免费广告好上海人才网站
  • cn域名做网站竞价推广代理
  • 省建设干部培训中心网站网站地图1 500 怎么做
  • 制作一个网站需要哪些人网站建设经营服务合同
  • 山东省住房和城乡建设厅官方网站网易发布广州
  • 长沙设计网站效果设计师灵感网站
  • 做网站php都用什么框架把asp.net写的网站别人怎么访问
  • 网站建设捌金手指下拉六正规的代运营公司
  • 自己申请网站空间冀州建网站
  • 哈尔滨旅游团购网站建设江苏建设工程建设网
  • 在郑州做网站茶叶网站建设网页设计制作
  • 58做网站吗南京有关制作网站的公司