二分搜索 树结构 python描述
搜索是在一个项目集合中找到一个特定项目的算法过程. 搜索通常的答案是真的或假的, 因为该项目是否存在. 搜索的几种常见方法: 顺序查找. 二分法查找, 二叉树查找, 哈希查找.
二分法查找
二分查找又称折半查找, 有点事比较次数少, 查找速度快, 平均性能好; 其缺点是要求待查表为有序表, 且插入删除困难. 因此, 二分查找法适用于不经常变动而查找频繁的有序列表.
二分法查找步骤
⾸先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进⼀步查找前一子表,否则进⼀步查找后一子表。重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
代码实现
非递归实现
# –*– coding: utf-8 –*–
# @Time : 2019/4/6 22:21
# @Author : Damon_duanlei
# @FileName : binary_search.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
def binary_search(find_list, search_info):
"""
二分法非递归实现
:param find_list: 查询列表
:param search_info: 查找元素
:return: Ture or False
"""
low = 0
high = len(find_list) - 1
while low <= high:
mid = (low + high) // 2
if search_info == find_list[mid]:
return mid
if search_info > find_list[mid]:
low = mid + 1
else:
high = mid - 1
return None
递归实现
# –*– coding: utf-8 –*–
# @Time : 2019/4/6 22:21
# @Author : Damon_duanlei
# @FileName : binary_search.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
def binary_search2(find_list, search_info):
"""
二分法递归实现
:param find_list: 查询列表
:param search_info: 查找元素
:return: Ture or False
"""
n = len(find_list) // 2
if find_list[n] == search_info:
return True
elif search_info > find_list[n]:
return binary_search2(find_list[n:], search_info)
else:
return binary_search2(find_list[:n], search_info)
注意:经过一定次数的测试, 非递归方式的二分法查找效率明显高于递归方式的二分法查找.
树与树算法
树的概念
树 (英语 tree ) 是一种抽象数据类型 (ADT) 或是视作这种抽象数据类型的数据结构, 用来模拟就有树状结构性质的数据集合. 它是由 n (n >= 1) 个有限节点组成一个具有层次关系的集合. 把它叫做 “树” 是因为他看起来像一颗倒挂的树, 也就是说它是根朝上, 叶朝下的. 它具有以下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非跟节点有且只有一个父节点;
- 除了根节点外, 每个子节点可以分为多个不想交的子树;
树的术语
- 节点的度: 一个节点含有的子树的个数称为该节点的度;
- 树的度: 一棵树中, 最大的节点的度称为树的度;
- 叶节点或终端节点: 度为零的节点;
- 父亲节点或父节点: 若一个节点含有子节点, 则这个节点成为其子节点的父节点;
- 孩子节点或子节点: 一个节点含有的子树的跟节点称该节点的子节点;
- 兄弟节点: 具有相同父节点的节点互称为兄弟节点;
- 节点的层次: 从根开始定义起, 根为第一层,根的子节点为第二次, 以此类推;
- 树的高度或深度: 树中节点的最大层次;
- 堂兄弟节点: 父节点在同一层的节点互为堂兄弟;
- 节点的祖先: 从根到该节点所经分支上的所有节点;
- 子孙: 以某节点为根的子树中任一节点都称为该节点的子孙
- 森林: 由 m (m &