本次笔记内容:
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[log2​n]+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条边。

树的基本术语

  1. 结点的度(Degree):结点的子树个数;
  2. 树的度:树的所有结点中最大的度数;
  3. 叶结点(Leaf):度为0的结点;
  4. 父节点(Parent):有子树的结点是其子树的根结点的父结点;
  5. 子节点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点;
  6. 兄弟结点(Sibling):具有同一父结点的各个结点彼此是兄弟结点;
  7. 路径和路径的长度:从结点n_1到n_k的路径为一个结点序列n_1,n_2,…,n_i是n_{i+1}的父结点。路径所包含的个数为路径的长度;
  8. 祖先结点(Ancestor):沿树根到某一节点路径上所有结点都是这个结点的祖先结点;
  9. 子孙结点(Descendant):某一节点的子树中的所有结点是这个结点的子孙;
  10. 结点的层次(Level):规定根节点在1层,其他任一结点的层数是其父结点的层数加1;
  11. 树的深度(Depth):树中所有结点中最大层次是这棵树的深度。

树的实现(儿子-兄弟表示法)

如上图树难以用数组、链表表示(每个结点不一样)。

因此采用儿子兄弟表示法。

将上述链表旋转45度,如下图。

旋转45度后,每个链结点都有0-2个子树。因此二叉树可以表示任意树。二叉树是树结构研究中最为重要的内容。

【数据结构笔记08】哨兵查找、二分查找、树、儿子-兄弟表示法、二叉树的引子相关推荐

  1. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  2. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例

    介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...

  3. Python查找-二分查找

    Python查找-二分查找 二分查找 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务. 它的基本思想是,将n个元素分成个数大致相 ...

  4. C语言之折半查找(二分查找)

    一.什么是折半查找? 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中 ...

  5. Java实现折半查找(二分查找)的递归和非递归算法

    Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其 ...

  6. 数据结构 | 折半查找 /二分查找 算法细节、二分查找判定树

    一.基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步 ...

  7. 学生成绩管理系统利用数据结构顺序表来进行二分查找,直接插入,快速排序操作

    一.实验目的 1.掌握查找的不同方法,并能用高级语言实现查找算法. 2.熟练掌握顺序表和有序表的顺序查找和二分查找方法. 3.掌握排序的不同方法,并能用高级语言实现排序算法. 4.熟练掌握顺序表的选择 ...

  8. 数据结构基础(2) --顺序查找 二分查找

    顺序查找 适用范围: 没有进行排序的数据序列 缺点: 速度非常慢, 效率为O(N) //实现 template <typename Type> Type *sequenceSearch(T ...

  9. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

最新文章

  1. php – Laravel 7 Session Lifetime
  2. 销售订单行项目的装运点字段确认规则
  3. 软件工程学习笔记《目录》
  4. PHP漏洞全解(二)-命令注入攻击
  5. 数据结构 排序 java_Java数据结构之排序---选择排序
  6. 求最大公约数——辗转相除法
  7. 第一:Java+MyBatis(快速入门)
  8. python快速入门及进阶
  9. vue可编辑div_Vue实现MakeDown编辑器
  10. 使用TypoDetect检测相似域名
  11. ams1117 lm317 对比_三种典型的基于AMS1117稳压IC的5v转3.3v电路-电路图讲解-电子技术方案...
  12. C语言中自定义的标识符
  13. 【Error】Win10/Python3.9安装dlib报错:subprocess.CalledProcessError以及解决方法
  14. Sql server2008的使用
  15. java学习:模拟KTV点歌系统
  16. 【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)
  17. 什么是*.yml文件
  18. 伊利诺伊香槟分校计算机排名,伊利诺伊大学香槟分校计算机工程排名第8(2018年TFE美国排名)...
  19. python输入名字输出你好代码_003-输入和输出
  20. java memory copy_Java Unsafe.copyMemory java.lang.IllegalArgumentException

热门文章

  1. 【Oracle】审计
  2. Appium遇到异常处理
  3. SVN仓库迁移到Git遇到的两个问题和解决办法
  4. 抛弃百度UMEditor,拥抱summernote (解决上传文件又慢又卡的问题)
  5. Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD“ returned status code 128:”的问题解决
  6. VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法
  7. 如何从派生类函数调用父类函数?
  8. LINQ聚合算法解释
  9. u盘怎么重装系统win11教程
  10. 思科计算机网络第四章考试,思科网络学院第期第四章.docx