树、二叉树、查找算法总结
时间:2020-04-25
本文章向大家介绍树、二叉树、查找算法总结,主要包括树、二叉树、查找算法总结使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
思维导图
重要概念
二叉树的性质
- 非空二叉树上的叶子结点数等于双分支结点数加1
- 非空二叉树的第i层上最多有2^(i-1)个结点(i>=1)
- 高度为h的二叉树最多有2^h - 1个结点(h>=1)
- 具有n个(n>0)结点的完全二叉树的高度为
\[ \lceil \log_{2}{(n+1)} \rceil \]
或
\[ \lfloor \log_{2}{n} \rfloor +1 \]
查找
- 若整个查找过程都在内存中进行,则称之为内查找;反之,若查找过程需要访问外存,则称之为外查找。
- 若在查找的同时对表做修改操作(如插入和删除),则相应的查找表称为动态查找表。若在查找中不涉及表的修改操作,则相应的查找表称为静态查找表。
- 在查找运算中时间主要花费在关键字的比较上,把平均需要和给定值k进行比较的关键字次数称为平均查找长度(ASL)。
线性表的查找
- 顺序查找:比较简单
- 折半查找:又称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表是有序表,即表中的元素按关键字有序。
哈希表查找性能
- 与装填因子α有关。所谓装填因子是指哈希表中已存入元素数n与哈希地址空间大小m的比值,即α=n/m。α越小,冲突的可能性越小;相反,则更大。
- 与所采用的哈希函数有关。若哈希函数选择得当,就可以使哈希地址尽可能均匀地分布在哈希地址空间上,从而减少冲突的发生;否则,若哈希函数选择不当,就可能使哈希地址集中于某些区域,从而加大冲突的发生。
- 当出现哈希冲突时需要采取解决哈希冲突的方法,所以哈希查找性能也与解决冲突的方法有关。
哈希表的构造方法
- 直接定址法
- 除留余数法
- 数字分析法
哈希冲突解决方法
- 开放定址法:出现哈希冲突时在哈希表中找到一个新的空闲位置存放元素。
- 线性探测法
- 平方探测法
- 拉链法:把所有的同义词用单链表链接起来的方法。
与开放定址法相比,拉链法有以下几个优点:- 拉链法处理冲突简单,且无堆积现象,即非同义词绝不会发生生冲突,因此平均查找长度较短;
- 由于拉链法中各单链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
- 开放定址法为减少冲突要求装填因子α较小,故当数据规模较大时会浪费很多空间,而拉链法中可取α>=1,且元素较大时拉链法中增加的指针域可忽略不计,因此节省空间;
- 在用拉链法构造的哈希表中,删除结点的操作更加易于实现。
拉链法也有缺点:指针需要额外的空间,故当元素规模较小时开放定址法较为节省空间,若将节省的指针空间用来扩大哈希表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高了平均查找速度。
疑难问题及解决方案
刚开始一直想着怎么从u和v往上找,u和v又只有孩子指针,没法往上找。后来从二叉搜索树的性质入手,解决了问题。
对于某一个结点p,如果u->key < p->key 并且 v->key > p->key,则这个结点即为最近公共祖先。如果u和v都在p的左子树或右子树,则继续往相对应的左子树或右子树查找,直到符合u->key < p->key 并且 v->key > p->key为止。
int Find(Tree T,int x)
{
if (!T) return 0;
if (T->Key == x)
{
return 1;
}
if (x > T->Key)
{
return Find(T->Right, x);
}
if (x < T->Key)
{
return Find(T->Left, x);
}
}
int LCA( Tree T, int u, int v )
{
if (!T)
{
return ERROR;
}
if (!Find(T, u) || !Find(T, v))
{
return ERROR;
}else if (u == v)
{
return u;
}
if (u > T->Key && v > T->Key)
{
return LCA(T->Right, u, v);
}
if (u < T->Key && v < T->Key)
{
return LCA(T->Left, u, v);
}
if ( (u > T->Key && v < T->Key) || (u < T->Key && v > T->Key) )
{
return T->Key;
}
}
原文地址:https://www.cnblogs.com/wzt392217419/p/12772084.html
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
- 机器学习实战之决策树
- 初学ReactJS,写了一个RadioButtonList组件
- 今天,你有微信小游戏提交审核吗?
- 云计算,迷你版线程同步
- Kubernetes 年度关键进展回顾
- 比较一下以“反射”和“表达式”执行方法的性能差异
- 人工智能芯片是什么?有什么用?
- 柯洁食言“复出”再战AI:明年4月见分晓
- 深入探讨ASP.NET MVC的筛选器
- pytorch自然语言处理之Pooling层的句子分类
- su命令cannot set groups: Operation not permitted的解决方法
- 利用腾讯云 COS 云对象存储定时远程备份网站
- 腾讯云技术公开课:零基础入门高可用云端架构设计
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Three.js教程(5):光源
- Three.js教程(6):几何体
- Three.js教程(7):材质
- Keep APP技术研究
- Canvas系列(15):实战-小球拖拽
- Canvas系列(16):实战-小球与斜面碰撞
- Three.js教程(3):场景
- Three.js教程(4):相机
- 使用GithubActions自动部署应用到自己的服务器(ECS)
- Nuxt项目给script标签添加crossorigin属性
- Canvas系列(12):动画高级
- Canvas系列(13):实战--星空连线图
- VSCode支持Vue自动保存格式化的配置
- 构造方法或new返回该对象
- 使用Node在浏览器打开某个网页