- 概念
- 静态查找: 无插入和删除
动态查找: 边插入删除边查找- 静态和动态查找的实现方式
1.线性表: 静态查
2.树表(二叉排序树)动态查
3.散列表 静态动态都可以- 查找: 集合中查找满足条件的数据
- 关键码
1.主关键码:可以表标识数据唯一性
2.次关键码: 不能标识- 查找效率: 比较次数决定的,
- 平均查找效率: ASL=求和(i出现的概率*查i需要的比较次数[只有这个可以控制])
2.顺序查找(从头到尾,从尾到头)
- 改进设置哨兵
- 优点 代码简单,用得广,数据不用有序
缺点: 元素多时,慢,不用他
3.折半查找(别名,对半,二分查找)!!!有序的顺序表,取中间 比较两边;!!!不用哨兵比较容易理解
//每次除的时候是[xxx,xx) 相加起来/2
//也可以用递归实现,结束条件 low>high
4.折半查找判断树(以上面的为例)(二叉排序树)
//时间由深度决定,求二叉(折半)查找判定树,根据某个元素的深度,得到他的查找次数
ASL平均查找长度为: ASL=(11+22+34+44)/10
查找失败时平均查找长度为: (记得看层数每一层节点数)(自己补上失败的节点)ASL=34/11=12/11=1
5.树表之二叉排序树(边插入边查)
1.存储:二叉链表
2.中序:可写出升序序列
3.二叉排序树的插入,自己构造二叉排序树(一个节点一个节点插入,先从根节点开始一一判断节点值)
6.平衡二叉树(解决左右树高的差值>1,通过转换变为最大高度差为1的二叉树)
7.散列查找(查找专用) (之前是用比较放位置,现在直接由数据运算得到数据的地址)
- 概念
1.散列表:数组+使用散列函数来实现查找
2.散列函数:封装了 由数据技术得出数据地址的函数
3.同义词 比如 10%7=3 17%7=3(散列函数的部分实现) 所以10和17是同义词会导致冲突!!!- 方式
1.直接定址法(直接由数据得到地址比如) 10/10=1 存到下标为1的数组
2.平方取中法: 如 (12)^2=144 我取 4(中间部分)为地址
3.除留余数法(实用) 要取小于表长的最小素数(就是要不可分解,比如 13只能分解为1和13)
如: 1%13=1 ; 13%13=0; //不会下标超过数组长度
4.(解决冲突的方法)开放定址法: 如果冲突那么,去放到冲突元素的下一位
5.(解决冲突的方法)二次探测法: 如果冲突 那么和4一样,就是跳跃的距离是 1^2 2^2
3^3…, 比如 10%10=0 已经冲突了 第一次我去下一个元素,第二次我去4的下标探测…
6.拉链法: 数组+单链表, 如果这个数组下标被放 了元素,我直接放到链表里面
下面使用线性探测法解决冲突
//另外一个例子,如果探测后面都冲突了,需要重新从头开始探测, %的魅力
----------排序算法--------------
8.插入排序
- 直接插入排序(无序区的元素插入有序区中,有序插入元素以后,数组需要后移)
- 希尔排序(直接插入的优化,也是插入,但是元素的距离,相当于一个数组看成多个数组来排序)
9.交换排序
- 冒泡(起泡)排序(相邻元素相互比较,最大的元素/最小的元素 向后面跑)(优化,如果移动的位置与上一趟相同,退出循环)
2.快速排序(冒泡排序的优化) c语言类库常用算法(本质是, 小<轴<大,两个指针在左和右边,遇到可以和轴可以交换的就交换)
//核心轴值不变,交换轴改变
动画 https://www.bilibili.com/video/BV1rW4y1x7Kh/?spm_id_from=333.337.search-card.all.click&vd_source=a50956e86b1f1bd61ba2abf42b71ff61
10.选择排序
1.简单选择排序(直接我从头遍历,得到最小的元素) 趟数=有多少个元素-1次
11.归并排序(和MapReduce分而治之的思想一样,先大任务分为小任务,然后小任务一一汇总为一个结果)
1.二路归并排序((n)/2-1趟)
49 38 65 97 76 13 27