tail -f 查找关键字_九种查找算法
weixin_39941721 于 2020-11-20 15:44:37 发布 2375 收藏 2
时间、空间复杂度比较
查找算法 | 平均时间复杂度 | 空间复杂度 | 查找条件 |
---|---|---|---|
顺序查找 | O(n) | O(1) | 无序或有序 |
二分查找(折半查找) | O(log2n) | O(1) | 有序 |
插值查找 | O(log2(log2n)) | O(1) | 有序 |
斐波那契查找 | O(log2n) | O(1) | 有序 |
哈希查找 | O(1) | O(n) | 无序或有序 |
二叉查找树(二叉搜索树查找) | O(log2n) | ||
红黑树 | O(log2n) | ||
2-3树 | O(log2n - log3n) | ||
B树/B+树 | O(log2n) |
1 顺序查找
算法思路:
代码:
运行结果:
查找成功 查找失败
2 二分查找(折半查找)
算法思路:
说明:
在做查找的过程中,如果 low 指针和 high 指针的中间位置在计算时位于两个关键字中间,即求得 mid 的位置不是整数,需要统一做取整操作。
代码:
运行结果:
查找成功 没有查找到
3 能在K线当中看出来什么? 插值查找
算法思路:
说明:
- 插值查找是基于折半查找进行了优化的查找方法。
- 当表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能要比折半查找要好得多。
代码:
运行结果:
能在K线当中看出来什么? 运行结果
4 斐波那契查找
算法思路:
说明:
low=mid+1说明待查找的元素在[mid+1,high]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。
代码:
运行结果:
能在K线当中看出来什么? 47的位置为5
5 哈希查找
哈希表:
哈希函数:
算法思路:
- 用给定的哈希函数构造哈希表;
- 根据选择的冲突处理方法(常见方法:拉链法和线性探测法)解决地址冲突;
- 在哈希表的基础上执行哈希查找;
代码:
6 二叉树查找
算法思路:
- 若b是空树,则搜索失败:
- 若x等于b的根节点的数据域之值,则查找成功:
- 若x小于b的根节点的数据域之值,则搜索左子树:
- 查找右子树。
代码:
7 2-3树
算法思路:
2-3 树中查找键为H的节点 2-3 树中查找键为B的节点
代码:
8 红黑树
理解红黑树一句话就够了:红黑树就是用红链接表示3-结点的2-3树。
2-3树转红黑树
为什么使用红黑树:
- 红黑树是一种平衡树,他复杂的定义和规则都是为了保证树的平衡性。如果树不保证他的平衡性就是下图:很显然这就变成一个链表了。 能在K线当中看出来什么?
- 保证平衡性的最大的目的就是降低树的高度,因为树的查找性能取决于树的高度。所以树的高度越低搜索的效率越高!
- 这也是为什么存在二叉树、搜索二叉树等,各类树的目的。
红黑树性质:
- 每个节点要么是黑色,要么是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。
- 每个红色结点的两个子结点一定都是黑色。
- 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
算法思路:
红黑树的思想就是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息。红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个3-nodes节点。黑色链接用来链接普通的2-3节点。特别的,使用红色链接的两个2-nodes来表示一个3-nodes节点,并且向左倾斜,即一个2-node是另一个2-node的左子节点。这种做法的好处是查找的时候不用做任何修改,和普通的二叉查找树相同。
代码:
9 B树/B+树
- 定义任意非叶子结点最多只有M个儿子;且M>2;
- 根结点的儿子数为[2, M];
- 除根结点以外的非叶子结点的儿子数为[M/2, M];
- 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
- 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
- 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的 子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
- 所有叶子结点位于同一层;
如:(M=3)
算法思路:
- 关键字集合分布在整颗树中;
- 任何一个关键字出现且只出现在一个结点中;
- 搜索有可能在非叶子结点结束;
- 其搜索性能等价于在关键字全集内做一次二分查找;
- 自动层次控制;
代码:
B+树:
- 非叶子结点的子树指针与关键字个数相同;
- 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树, B树是开区间
- 为所有叶子结点增加一个链指针;
- 所有关键字都在叶子结点出现;
1
iPad Pro 2020 的实际体验如何?值得入手吗?
最新对比跑分,Mac为低配版
目前,苹果唯一一款带Face ID的“电脑”
我这款是iPad Pro 11 英寸 512G,视频更新了下加了新内容
外形如何?会不会弯
会不会弯?材质目前体验是一样的还是。很薄,弯的话真的个人感觉还好,还是平时带带套比较稳妥。因为iPad Air也会弯呀。是薄的就可能会弯的。预算够的当然再买个Apple care就更好了,随便裸奔,随便浪。
正面对比,能看出哪个是新款不?不可能看出来啦 边框 摄像头对比 背面对比 C口 数据线 摄像头特写
新款性能到底如何?
2018 iPad Pro 11英寸 2020 iPad Pro 11英寸
这是为啥呢?新款性能还不如旧款吗?
3.27更新:老外最新消息,之前的A12X GPU7核说是其实也是8核,被Apple自己封印内力,Apple NB!
摄像头的提升作用到底有多少?
这次iPad Pro升级最值得的地方是哪里?
图取自Apple
图取自Apple 官方视频
epub怎么打开?
Cindy
方法1:使用专门的EPUB阅读器
如果你想要最好的阅读体验,建议使用专门的ePub阅读软件,比如Neat Reader,它提供了电脑和手机端的软件,还支持把书存在云端,自动同步数据。专门的软件,好处就是把ePub文件的特点都能展现出来,比如让你可以点击放大查看图片,可以修改字体、字号之类的。下面就是Neat Reader的截图,还有打开一本书在不同配色下的效果。(手机端我就不截图了,我用的不多)
Python基础之程序暂停
zxnode 于 2018-09-03 12:34:57 发布 74609 收藏 55
input()
- 优点:不需要借助模块,执行到此处阻塞等待人工输入。
- 缺点:程序结束时候需要强制结束或者在控制台输入值。
time.sleep()
- 优点:动态等待程序执行完毕,不需要强行终止,等待时间可调。
- 缺点:需要导入模块,等待规定时间结束后便继续往下执行。
os.system("pause")
- 优点:不必强行终止;不必等待时间,可自由按下enter继续。
- 缺点:导入模块,执行系统命令。
将进程挂起(Suspend) 而非 阻塞(Block) 如果用sleep() 能在K线当中看出来什么? 进程将阻塞 假设进程下有两个线程 那么这两个线程会继续运行 要使进程挂起 可以考虑使用psutil import psutil p = psutil.Process(pid) p.suspend() #挂起进程 p.resume() #恢复进程 为了证明效果 我写了一个简单的进程Process 其下有两个线程 读者Reader 和 写者Writer(简单的读者写者问题) Process: import threading from time import ctime, sleep import Threa
在使用python时,经常会暂停(不是停止)运行程序查看结果,网上的方法比较多,但都会用到专用的库,因此比较麻烦且繁琐。考虑到使用python经常会用到opencv库,所以可以使用opencv库中的相关函数进行实现。 使用到的函数或库 1.cv2.imshow() 2.cv2.waitKey() 3.能在K线当中看出来什么? time.sleep() 4.cv2.putText() 5.np.zeros() 程序如下 程序说明: 运行后,无操作则等待一段时间后继续运行程序;若按空格键暂停运行程序,再按空格键继续运行程序。 import time import cv2 import numpy as np def pa
03-12 2492
在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同。 1、input(); 这种方法不用包含模块,因此这也是最常用的一种暂停手段。 Python2中的raw_input()和input()语句在Python3中已经被合并到input()中。 2、os.system("pause"); 这种方法需要包含os模块(import os),在windows下IDLE运行会弹出cmd命令行
11-25 2442