C++进阶 | [3] 续 | 搜索二叉树的两种模型

摘要:搜索二叉树的效率,搜索二叉树的两种搜索模型及应用举例

前面一片文章学习了并实现了搜索二叉树,这篇将从实际应用的角度进一步介绍搜索二叉树。


1. 搜索二叉树的效率

平衡搜索二叉树

BST的查找效率是 O(N)
分析:如右图所示的二叉树中,如果我们需要查找结点1,则我们需要遍历所有的结点才能找到。因此,很明显BST的查找效率是O(N)

另外,当BST为满二叉树/完全二叉树,BST的查找效率为O(logN),这样的BST成为平衡搜索二叉树。


2. 搜索二叉树的两种模型

1)Key 模型

用途:查找某 key 值是否存在。

实际应用举例:门禁系统——读取门禁卡信息,查找该门禁卡信息是否存储在门禁系统的名单中。

上一篇中我们实现的BST即为Key模型。

2)KV 模型 (key and value)

用途:查找 key 是否存在,并通过 key 查找 value。value 是 key 的一个映射。

实际应用举例:e.g.1 英汉词典,通过查找英文找到对应的中文。e.g.2 统计出现的单词个数

实现KV模型的BST

e.g.1 英汉词典

相对于Key模型,KV模型没有很多需要更改的地方。

  • 首先,每个结点多了一个key的映射值val,具体代码如下。
    template<class K, class V>
    struct BSTreeNode_KV
    {BSTreeNode_KV(const K key = K(), const V val = V()):_key(key), _val(val), _left(nullptr), _right(nullptr){}K _key;V _val;BSTreeNode_KV<K, V>* _left;BSTreeNode_KV<K, V>* _right;
    };
    
     
  • insert:构造结点的时候需要多传一个参数,具体代码如下。(ps.递归版本的 find 也要相应的修改)
    bool Insert(const K& key, const V& val)
    {if (_rootp == nullptr){_rootp = new Node(key, val);return true;}Node* curp = _rootp;Node* parent_p = curp;while (curp){if (curp->_key > key){parent_p = curp;curp = curp->_left;}else if (curp->_key < key){parent_p = curp;curp = curp->_right;}elsereturn false;}Node* newp = new Node(key, val);if (parent_p->_key > key){parent_p->_left = newp;}else{parent_p->_right = newp;}return true;
    }
     
  • 另外,我们可以把 find 函数修改一下,返回找到的结点的指针。具体代码如下。(ps.递归版本的 find 也要相应的修改)
    Node* Find(const K& key)
    {if (_rootp == nullptr)return nullptr;Node* curp = _rootp;while (curp){if (curp->_key > key){curp = curp->_left;}else if (curp->_key < key){curp = curp->_right;}elsereturn curp;}return nullptr;
    }
    //这里find函数没找到选择返回空指针的方式,对该情况的处理可以根据需求选择其他更合适的方式
    上面这个是类内的成员函数int main()
    {BSTree_KV<std::string, std::string> treekv;treekv.Insert("test", "测试");treekv.Insert("tress", "树");treekv.Insert("left", "左");treekv.Insert("right", "右");//…………………………………………std::string str;while (std::cin >> str)//通过这样的方式我们可以简单地实现通过英文查找中文的功能{std::cout << (treekv.Find(str))->_val << std::endl;}
    }
e.g.2 用KV模型实现统计出现次数 

示例应用代码如下。

int main
{std::vector<std::string> vs = { "what","world","speak","now","speak","now","tolerate","speak" };BSTree_KV<std::string, int> countTree;for (auto str : vs){if (countTree.Find(str) == nullptr)countTree.Insert(str, 1);else++(countTree.Find(str))->_val;}countTree.InOrder();return 0;
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696417.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WWW服务器搭建(2)——Apache服务器配置与管理

一、Apache简介 1.1 关于Apache Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的Web服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。…

爆款小红书免费流量体系课程(两周变现),小红书电商教程

课程下载&#xff1a;小红书电商教程-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-爆款标题(三段式取标题).mp3 11-爆款封面怎么作图.mp3 12-爆款内容的模板(三段式模板).mp3 13-小红书流量推荐背后的秘密(四大流…

P6397 [COI2008] GLASNICI

题目描述 一条直线上有 &#x1d45b; 个信使&#xff0c;将他们按照从左至右的顺序以 1 至 &#x1d45b; 编号。换句话说&#xff0c;设 &#x1d456; 号信使的的坐标为 &#x1d451;&#x1d456;​&#xff0c;则对于 1≤&#x1d456;<&#x1d45b;&#xff0c; &am…

ubuntu server 22.04 安装docker、docker-compose

ubuntu server 22.04安装docker有两种方式&#xff0c;第一种是使用ubuntu镜像源的软件包进行安装&#xff0c;第二种使用官方GPG密钥手动添加Docker存储库方式进行安装&#xff0c;两种方式都可以&#xff0c;但第二种方式略复杂&#xff0c;这里介绍第一种比较简单的安装方式…

保研机试之【同步操作】

我们先来看一下这六个选项是什么意思&#xff1a; 思考一下&#xff0c;给出你的答案~ 再来总结一下六个选项的考点&#xff1a; 我认为答案选择B&#xff0c;因为&#xff08;延迟敏感&#xff09;&#xff08;短&#xff09;&#xff08;更新&#xff09;

让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】

目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识&#xff0c;将数学表达式的整个计算过程&#xff0c;以及计算繁多结果在 Java 中绘制出来&#xff0c;计算机中的数学表达式计算的功能很常见了&a…

Java中PriorityQueue的用途和性能深度剖析

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

[C++核心编程-09]----C++类和对象之继承

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

探究NVMe SSD HMB应用场景与影响-<续>

如果需要采用HMB功能&#xff0c;需要SSD支持NVME协议且NVMe 1.2及以上版本。NVME协议中对HMB对应有2个关键参数&#xff1a; HMB建议值&#xff08;HMPRE&#xff09;&#xff1a;设定实际分配给HMB使用的主机内存容量&#xff0c;为设备提供最优性能的内存分配量。 HMB最小值…

Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)

目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xf…

盛最多水的容器(双指针)

解题思路&#xff1a; 1&#xff0c;暴力解法&#xff08;超时&#xff09; 我们可以使用两层for循环进行遍历。找到那个最大的面积即可&#xff0c;这里我就不写代码了&#xff0c;因为写了也是超时。 2&#xff0c;双指针法 先定义两个指针一个在最左端&#xff0c;一个在…

C++入门-stack和queue(下)

大家好啊&#xff0c;在这先祝天下的母亲节日快乐啦&#xff01;现在呢&#xff0c;给大家带来C中priority_queue和容器适配器的相关知识点 3.1 C 中的优先队列&#xff08;priority_queue&#xff09;介绍 优先队列&#xff08;priority_queue&#xff09;是一种特殊的队列…