查找算法

数据结构——查找:折半查找、二叉查找(排序)树、平衡二叉树

谁说我不能喝 提交于 2020-01-11 00:08:50
七大查找算法: https://www.cnblogs.com/zhang-qc/p/8745153.html 学习的地址 https://www.bilibili.com/video/av27831455?p=20 关于查找表: 上面,静态查找表,找的过程中不改变表。动态查找表,过程中表会变。 静态查找表,对确定的数据元素关系的表查找,不一定是线性表。 关于查找: 上面,概率相同。 我们可以改变元素的排列顺序,可能比较次数会少一点。 平均查找长度,表征效率的问题。 下面为 顺序查找 : 顺序查找适合于存储结构为顺序存储或链接存储的线性表,时间复杂度为O(n) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 折半查找(二分查找): (数据要先有序才行 ,如果是无序的则要先进行排序操作。 ) 最大比较次数就是 log2n 下面2种查找方法(斐波那契查找和插值查找),思想和上面类似,都是按照某个函数给元素分段。 斐波那契查找 : 二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1)。如果>,low=mid+1,k-=2;如果<,high=mid-1,k-=1。 差值查找

【算法学习笔记】并查集

坚强是说给别人听的谎言 提交于 2020-01-10 19:35:43
\(0.\) 简介 并查集是一种维护节点之间不相交集合关系的一种 树状 数据结构。在算法竞赛中较为常用。并查集的基本形态如下 \(1.\) 一些定义 代表元素 代表元素是指代表这个集合的元素,通常由根节点表示。如上图的4号节点就是这个集合的代表元素。 父亲节点 和其他的树状数据结构类似,父亲节点就是某一节点“上方”的节点。在并查集中,边的方向始终指向父亲节点。 \(2.\) 并查集的功能与基本实现方式 基本的并查集一般实现两种操作:合并集合,查找某个节点所在集合的代表元素。 并查集的初始化 一般的我们在初始状态时将每个元素看做独立的集合,即每个元素所在的集合就是自己。 for(rg int i=1;i<=n;i++) fa[i]=i; 上面代码中 \(fa[\ ]\) 就简单的实现了一个并查集。其中 \(fa[i]\) 代表编号为 \(i\) 的元素的父亲节点。 查找代表元素 并查集的实现结构是每个节点有一个指针指向父亲节点,代表元素(根)的指针指向自己。 所以可以递归地查找代表元素 inline int find(int x){ return fa[x]==x?x:find(fa[x]); } 上面的代码就实现了查找代表元素的操作。如果一个节点的父亲是他自己,那么这个节点就是并查集的代表元素,否则往上方跳,直到找到代表元素为止。 合并集合 zcy大神在某个地方讲过

红黑树(一)之 原理和算法详细介绍

隐身守侯 提交于 2020-01-10 08:16:08
概要 前面分别介绍红黑树的 理论知识 、红黑树的 C语言 和 C++的实现 。本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习 红黑树的理论知识 ,再来学习本章。还是那句老话,红黑树的C/C++/Java实现,原理一样,择其一了解即可。 目录 1. 红黑树的介绍 2. 红黑树的Java实现(代码说明) 3. 红黑树的Java实现(完整源码) 4. 红黑树的Java测试程序 转载请注明出处: 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍 (02) 红黑树(二)之 C语言的实现 (03) 红黑树(三)之 Linux内核中红黑树的经典实现 (04) 红黑树(四)之 C++的实现 (05) 红黑树(五)之 Java的实现 (06) 红黑树(六)之 参考资料 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,红黑树还包括许多额外的信息。 红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。 红黑树的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。

B树,B+树

为君一笑 提交于 2020-01-10 04:34:39
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

高阶数据结构:SSTable

陌路散爱 提交于 2020-01-10 00:13:54
1. 前言 最近在组会上面通过小组讨论论文时,发现了SSTable这个数据结构。课后为了深入分析和学习这个数据结构,我做了一些资料查阅。在查询相关分布式的书籍后,找到了SSTable的数据结构,现将其作为笔记记录下来。之前整理的BigTable论文里面提及到了SStable,但是当时并没有引起我的注意。现在将深入理解这个数据结构——SSTable。 2. SSTable的定义 Google SSTable文件格式在内部用于存储Bigtable数据。 它的格式为文件本身就是一个排序的、不可变的、持久的Key/Value对Map,其中Key和value都可以是任意的byte字符串。提供操作以查找与指定键相关联的值,并遍历指定键范围内的所有键/值对。使用Key来查找Value,或通过给定Key范围遍历所有的Key/Value对。每个SSTable包含一系列的Block(一般Block大小为64KB,但是它是可配置的),在SSTable的末尾是Block索引,用于定位Block,这些索引在SSTable打开时被加载到内存中,在查找时首先从内存中的索引二分查找找到Block,然后一次磁盘寻道即可读取到相应的Block。还有一种方案是将这个SSTable加载到内存中,从而在查找和扫描中不需要读取磁盘。 3. BigTable的架构 BigTalbe构建在GFS之上

二分查找(binary search)

∥☆過路亽.° 提交于 2020-01-09 16:51:06
1 二分查找的思想 每次将待查找元素与区间中间元素进行比较,将查找区间缩减为之前的一半,直到找到待查找元素或查找区间大小为0。 2 实现及关键点 2.1 关键点 1)循环退出条件 循环退出条件为low <= high,其中low为查找区间的下边界、high为上边界,而不是low < high。如果条件为low < high,那么当查找区间大小为1即low = high时,循环退出就无法与最后一个数据元素进行比较。 2)区间中间索引mid的取值 一般来说mid = (low + high) / 2,但是当low + high超出其数据类型范围时会造成溢出,所以这样的mid取值是不稳妥的。mid = low + (high - low) / 2这样减少了溢出的可能,或者mid = low + ((high - low) >> 1)这样通过位运算使得计算更加快速。 3)区间上下边界的更新 更新应为low = mid + 1、high = mid - 1而不是low = mid、high = mid。因为如果是low = mid、high = mid的更新方式,那么当查找区间为1时而最后的数据元素又不等于查找元素,那么程序会进入死循环。 2.2 实现 1 /*查找升序数组中是否存在数据元素num,存在返回其在数组中的位置,不存在则返回-1*/ 2 int BinarySearch(int*

『浅入浅出』MySQL 和 InnoDB

﹥>﹥吖頭↗ 提交于 2020-01-09 11:41:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出。 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是 数据库 和 实例 : 数据库:物理操作文件系统或其他形式文件类型的集合; 实例:MySQL 数据库由后台线程以及一个共享内存区组成; 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍。 数据库和实例 在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库,而是要通过数据库实例来操作数据库文件,可以理解为数据库实例是数据库为上层提供的一个专门用于操作的接口。 在 Unix 上,启动一个

06: mysql索引查找原理及调优

▼魔方 西西 提交于 2020-01-09 00:02:01
目录 1.1 常见查找方法举例 1.2 索引数据结构设相关的计算机原理 1.3 MyISAM实现索引 1.4 InnoDB索引实现 1.5 索引使用策略 1.1 常见查找方法举例 1、顺序查找(linear search ) 1. 最基本的查询算法当然是顺序查找(linear search),也就是对比每个元素的方法,不过这种算法在数据量很大时效率是极低的。 2. 数据结构:有序或无序队列 3. 复杂度:O(n) 2、二分查找 1. 从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束; 2. 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且根开始一样从中间元素开始比较。 3. 如果在某一步骤数组为空,则代表找不到。 4. 数据结构:有序数组 5. 复杂度:O(logn) 3、二叉排序树查找 1)二叉排序树的特点是:         1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;         2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;         3. 它的左、右子树也分别为二叉排序树。     2)搜索的原理:         若b是空树,则搜索失败,否则:         若x等于b的根节点的数据域之值,则查找成功;否则:         若x小于b的根节点的数据域之值

算法——几种查找算法的比较和应用

孤街醉人 提交于 2020-01-08 23:30:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 几种基础查找方法的 性能比较 : 算法(数据结构) 查找(最坏) 插入(最坏) 查找命中(平均) 插入(平均) 插入(平均)是否支持有序性相关操作 顺序查询(无序联播) N N N/2 N 否 二分查找(有序数组) lgN N lgN N/2 是 二叉树查找(二叉查找树) N N 1.39lgN 1.39lgN 是 2-3树查找(红黑树) 2lgN 2lgN 1.00lgN 1.00lgN 是 拉链法(链表数组) <lgN <lgN N/(2M) N/M 否 线性探测法(并行数组) clgN clgN <1.5 <2.5 否 顺序查找 :在表中查找一个不存在的键时,我们会将表中每个键和给定的键比较(N)。因为不允许出现重复的键,每次插入操作之前我们都需要这样查找一遍。 推论: 向一个空表中插入N个不同的键需要~N²/2次比较。 二分查找 :在N个键的有序数组中进行二分查找最多需要(lgN+1)次比较(无论是否成功)。插入一个新的元素在最坏情况下要访问~2N次数组。 推论: 向一个空表中插入N个不同的键需要~N²/2次比较。 二叉树查找 :使用二叉查找树的算法运行时间取决于树的形状。最好的情况下含有N个节点的树是完全平衡的,每条空链和根节点的距离都为~lgN;最坏情况下,搜索路径上可能有N个节点

B+树与B*树小结

只愿长相守 提交于 2020-01-08 09:31:45
一、B+树 1.B+树定义与特性 B+ 树是 B- 树的变体,也是一种多路搜索树: 其定义基本与 B- 树同,除了: 1). 非叶子结点的 子树指针与关键字个数相同 ; 2). 非叶子结点的 子树指针 P[i ] ,指向关键字值属于 [K[i], K[i+1]) 的子树 ( B- 树是开区间); 3). 为所有叶子结点 增加一个链指针 ; 4). 所有关键字都在叶子结点出现 为了全面 这里给出网上另外一种说法: 一棵m阶的B+树和m阶的B树的差异在于: 1.有n棵子树的结点中含有n个关键字; (而B 树是n棵子树有n-1个关键字) 2. 所有的叶子结点中包含了全部关键字的信 息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3. 所有的非终端结点可以看成是索引部分 ,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) 下图给出典型的3阶B+树示例 B+ 的特性: 1). 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好 是有序的; 2). 不可能在非叶子结点命中; 3). 非叶子结点相当于是叶子结点的索引 (稀疏索引),叶子结点相当于是存储 (关键字)数据的数据层; 4). 更适合文件索引系统; 2.B+树的基本操作 1)查找操作