【数据结构笔记08】哨兵查找、二分查找、树、儿子-兄弟表示法、二叉树的引子
本次笔记内容:
3.1.1 引子(顺序查找)
3.1.2 引子(二分查找例子)
3.1.3 引子(二分查找实现)
3.1.4 树的定义和术语
3.1.5 树的表示
文章目录
- 树的引子:查找
- 查找(Searching)
- 静态查找
- 方法1:顺序查找(哨兵)
- 方法2:二分查找(Binary Search)
- 二分查找的实现
- 二分查找的启示(二分查找判定树)
- 树
- 树与非树
- 树的基本术语
- 树的实现(儿子-兄弟表示法)
树的引子:查找
- 客观事件中许多事物存在层次关系。
- 分层次组织在管理上具有更高的效率(查找)。
查找(Searching)
- 查找就是根据某个给定的关键字K,从集合R中找出关键字与K相同的记录。
- 静态查找:没有插入和删除的操作;
- 动态查找:有插入的删除的操作。
静态查找
方法1:顺序查找(哨兵)
上述方法没有应用哨兵。
使用技巧:哨兵,在边缘处放置一个值(index=0处),如果查找到“哨兵”,循环就应该退出。哨兵减去了循环过程中边界片段的行为。
上述是哨兵的实现,在0处放置K;如果不成功,返回0。顺序查找算法的时间复杂度是o(n)。
方法2:二分查找(Binary Search)
如上图,二分查找必须在数组中,必须按大小排序。
如上图,当left>right时,可断定要找的元素不在数组中。
二分查找的实现
int BinarySearch(List Tbl, ElementType K)
{int left, right, mid, NotFound = -1;left = 1;right = Tbl->Length;while (left <= right){mid = (left + right) / 2;if (K < Tbl->Element[mid])right = mid - 1;else if (K > Tbl->Element[mid])left = mid + 1;elsereturn mid;}return NotFound;
}
每次循环查找范围都除以二,因此时间复杂度为log_2(n)。
二分查找的启示(二分查找判定树)
- 判定树上每个结点需要的查找次数刚好为该结点所在层数;
- 查找成功时查找次数不会超过判定树的深度;
- n个结点的判定树的深度为[log2n]+1[log_2n]+1[log2n]+1。
- ASL(平均成功查找次数)=(44+43+2*2+1)/11=3。查找4次才成功的有4个元素,以此类推。
因此,引出查找树的概念。查找树时间复杂度也为log_2(n),但插入、删除操作更为方便。因此适于动态查找。
树
树(Tree):n(n大于等于0)个结点构成的有限集合。
- 当n=0时,称为空树;
- 对于任一棵非空树(n大于0),具备以下性质:
- 树中有一个称为“根(Root)”的特殊结点,用r表示;
- 其余结点可分为m(m大于0)个互不相交的有限集T_1,T_2,…,T_m,其中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”。
树与非树
如上图,子树是不相交的;一棵N个结点的树有N-1条边。
树的基本术语
- 结点的度(Degree):结点的子树个数;
- 树的度:树的所有结点中最大的度数;
- 叶结点(Leaf):度为0的结点;
- 父节点(Parent):有子树的结点是其子树的根结点的父结点;
- 子节点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点;
- 兄弟结点(Sibling):具有同一父结点的各个结点彼此是兄弟结点;
- 路径和路径的长度:从结点n_1到n_k的路径为一个结点序列n_1,n_2,…,n_i是n_{i+1}的父结点。路径所包含的个数为路径的长度;
- 祖先结点(Ancestor):沿树根到某一节点路径上所有结点都是这个结点的祖先结点;
- 子孙结点(Descendant):某一节点的子树中的所有结点是这个结点的子孙;
- 结点的层次(Level):规定根节点在1层,其他任一结点的层数是其父结点的层数加1;
- 树的深度(Depth):树中所有结点中最大层次是这棵树的深度。
树的实现(儿子-兄弟表示法)
如上图树难以用数组、链表表示(每个结点不一样)。
因此采用儿子兄弟表示法。
将上述链表旋转45度,如下图。
旋转45度后,每个链结点都有0-2个子树。因此二叉树可以表示任意树。二叉树是树结构研究中最为重要的内容。
【数据结构笔记08】哨兵查找、二分查找、树、儿子-兄弟表示法、二叉树的引子相关推荐
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例
介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...
- Python查找-二分查找
Python查找-二分查找 二分查找 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务. 它的基本思想是,将n个元素分成个数大致相 ...
- C语言之折半查找(二分查找)
一.什么是折半查找? 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中 ...
- Java实现折半查找(二分查找)的递归和非递归算法
Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: * 1.要求所查找的数组已有序,并且其 ...
- 数据结构 | 折半查找 /二分查找 算法细节、二分查找判定树
一.基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步 ...
- 学生成绩管理系统利用数据结构顺序表来进行二分查找,直接插入,快速排序操作
一.实验目的 1.掌握查找的不同方法,并能用高级语言实现查找算法. 2.熟练掌握顺序表和有序表的顺序查找和二分查找方法. 3.掌握排序的不同方法,并能用高级语言实现排序算法. 4.熟练掌握顺序表的选择 ...
- 数据结构基础(2) --顺序查找 二分查找
顺序查找 适用范围: 没有进行排序的数据序列 缺点: 速度非常慢, 效率为O(N) //实现 template <typename Type> Type *sequenceSearch(T ...
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
最新文章
- php – Laravel 7 Session Lifetime
- 销售订单行项目的装运点字段确认规则
- 软件工程学习笔记《目录》
- PHP漏洞全解(二)-命令注入攻击
- 数据结构 排序 java_Java数据结构之排序---选择排序
- 求最大公约数——辗转相除法
- 第一:Java+MyBatis(快速入门)
- python快速入门及进阶
- vue可编辑div_Vue实现MakeDown编辑器
- 使用TypoDetect检测相似域名
- ams1117 lm317 对比_三种典型的基于AMS1117稳压IC的5v转3.3v电路-电路图讲解-电子技术方案...
- C语言中自定义的标识符
- 【Error】Win10/Python3.9安装dlib报错:subprocess.CalledProcessError以及解决方法
- Sql server2008的使用
- java学习:模拟KTV点歌系统
- 【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)
- 什么是*.yml文件
- 伊利诺伊香槟分校计算机排名,伊利诺伊大学香槟分校计算机工程排名第8(2018年TFE美国排名)...
- python输入名字输出你好代码_003-输入和输出
- java memory copy_Java Unsafe.copyMemory java.lang.IllegalArgumentException
热门文章
- 【Oracle】审计
- Appium遇到异常处理
- SVN仓库迁移到Git遇到的两个问题和解决办法
- 抛弃百度UMEditor,拥抱summernote (解决上传文件又慢又卡的问题)
- Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD“ returned status code 128:”的问题解决
- VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法
- 如何从派生类函数调用父类函数?
- LINQ聚合算法解释
- u盘怎么重装系统win11教程
- 思科计算机网络第四章考试,思科网络学院第期第四章.docx