查找算法

数据结构之树

时光总嘲笑我的痴心妄想 提交于 2019-11-28 16:11:32
本篇只涉及树的概念范围和应考思路,不涉及具体结构或算法的实现与思考 1.树 在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: ①每个节点有零个或多个子节点; ②没有父节点的节点称为根节点; ③每一个非根节点有且只有一个父节点; ④除了根节点外,每个子节点可以分为多个不相交的子树; 然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。 二叉树 二叉树:每个节点最多含有两个子树的树称为二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。) 在二叉树的概念下又衍生出满二叉树和完全二叉树的概念 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上 完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。 算法实现(笑) 二叉树: private static class TreeNode {

《听说史上最全挺好用的》-java集合面试知识大全

余生长醉 提交于 2019-11-28 14:08:59
欢迎关注这一文章系列,一起学习 提升能力,涨薪可待 面试知识,工作可待 实战演练,拒绝996 也欢迎关注公 众 号【 Ccww笔记 】,原创技术文章第一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 一、集合基础 1.1 集合框架有哪些优点如下: 使用核心集合类降低开发成本,而非实现我们自己的集合类。 随着使用经过严格测试的集合框架类,代码质量会得到提高。 通过使用 JDK 附带的集合类,可以降低代码维护成本。 复用性和可操作性。 1.2 Java集合类框架的基本接口有哪些? Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有: Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的 Collection。 List:有顺序的 collection,并且可以包含重复元素。 Map:可以把键(key)映射到值(value)的对象,键不能重复。 还有其它接口 Queue、Dequeue、SortedSet、SortedMap 和 ListIterator。 1.3 为什么集合类没有实现 Cloneable 和 Serializable 接口? 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序,可以使得集合类很灵活

基本的查找算法

ⅰ亾dé卋堺 提交于 2019-11-28 12:25:19
基本的查找算法有:顺序查找,二分查找, 顺序查找很简答,就是遍历数组的每一个元素,通过与待查找到数进行比较来实现,一个for循环即可搞定。 顺序查找不需要对数组进行排序,缺点是执行效率低,耗时,因为要遍历。 二分查找是一个提高查找效率的方法,前提是数组有序,如果拿到一个无需的数组,首先要用排序算法(冒泡、选择、插入)来排序。 二分查找的利用的是二分法,即将数组有一分为二,一半一半的缩小对比范围。 二分法代码实现: class Test { public static void Main() { int[] number=new int[]{11,22,33,44,55,66,77,88,99}; int sValue=33; int index; index=Dichotomy(number,sValue); Console.WriteLine("{0}", index); } public static int Dichotomy(int[] num,int sValue) { int upper=num.Length()-1; int lower=0; int mid= (upper+lower)/2; while( lower<=upper) { if(num[mid]==sValue) { return mid; //存在返回下标 } if(num[mid]>sValue)

数据结构与算法

ぐ巨炮叔叔 提交于 2019-11-28 12:05:29
第一章:概述 1. 数据和数据结点   数据是对客观事物的描述形式和编码形式的统称。   数据是由数据元素组成的,数据元素又称为数据结点,简称结点。   每个数据元素又包括多个数据项,每个数据项又称为结点的域,其中,用来唯一标识结点的域称为关键字。 2.数据结构、逻辑结构、物理结构   一个有穷的结点集合D,以及该集合中各结点之间的关系R,组成一个数据结构,表示成B=(D, R);   D和R是对客观事物的抽象描述,R表示结点间的逻辑关系,所以(D, R)表示的数据的逻辑结构。   数据结构在计算机内的存储形式称为存储结构,也称为物理结构。 3. 数据结构的种类   表结构(一对一)、树结构(一对多)、图结构(多对多)、散结构(结点之间没有关系,或者说存在特殊关系-无关关系) 4. 抽象、抽象数据类型、抽象数据类型的表示   抽象 - 从一般意义上将,抽象是指“抽取事物的共性,忽略个性;体现外部特征,掩饰具体细节”。   抽象数据类型简称ADT(abstract data type), 是将“数据”连同对其的“处理操作”(即运算)封装在一起而形成的复合体。注意: ADT是对一个确定的数学模型,以及定义在该模型上的一组操作的抽象表示,不涉及具体的实现。   抽象数据类型的表示 - 如可以将有序表有关的数据和处理操作封装成一个ADT,涉及的数据可能有元素个数、数据元素等

为什么要重写 hashcode 和 equals 方法?

坚强是说给别人听的谎言 提交于 2019-11-28 11:04:04
引言 以前面试的时候被面试官问到过这样一个问题: 你有没有重写过 hashCode 方法? 心里想着我没事重写哪玩意干啥,能不写就不写。嘴上当然没敢这么说,只能略表遗憾的说抱歉,我没写过。 撇了面试官一眼,明显看到他对这个回答不满意,但是这已经触及到我的知识盲点了,我也很惭愧,可是确实没有重写过,咱也不能胡扯不是。 然后他又问到另外一个问题: 你在用 HashMap 的时候,键(Key)部分,有没有放过自定义对象? 我说我放过,很自信的说我放过(其实我忘了我有没有放过),但是不能怂啊,第一个都不会了,第二个再说不会哪不是直接拜拜要走人了吗? 面试官狡猾的笑了,说是你既然没有重写过 hashCode 方法,你怎么把自定义对象放进去的? 我勒个去,原来你在这等着我呢,没想到这还是个连环炮,惹不起惹不起,认怂三连 不过不会就学,不懂就问,这一直都是咱程序猿优秀的素养,今天就干脆从 Hash 表学起,讲述 HashMap 的存取数据规则,由此来搞定上述问题的答案。 通过 Hash 算法来了解 HashMap 对象的高效性 我们先复习数据结构里的一个知识点: 在一个长度为 n(假设是100)的线性表(假设是 ArrayList)里,存放着无序的数字;如果我们要找一个指定的数字,就不得不通过从头到尾依次遍历来查找,这样的平均查找次数是 n / 2(这里是50)。 我们再来观察 Hash 表

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB

☆樱花仙子☆ 提交于 2019-11-28 10:34:29
作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 ![](https://img2018.cnblogs.com/blog/1092007/201908/1092007-20190824162501679-1707813820.png) 添加描述 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出。 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是数据库和实例: 数据库:物理操作文件系统或其他形式文件类型的集合; 实例:MySQL 数据库由后台线程以及一个共享内存区组成; 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍。 数据库和实例 在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库

4002.基于快排思想的查找

╄→гoц情女王★ 提交于 2019-11-28 09:58:01
基于快排思想的查找 发布时间: 2018年11月26日 10:12 时间限制: 1000ms 内存限制: 128M 基于快排思想,其实就是两面开工,若不加前提判断可能会出现循环卡在头大,尾小的样例中。 描述 借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l..n]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。 输入 多组数据,每组数据三行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数),第三行为要查找的key值。当n等于0时,输入结束。 输出 每组数据输出一行。如果查找成功,输出key在数组中的位置(1到n)和key的值,两个数字之间用空格隔开。如果查找失败,输出“not find”。 样例输入1 5 1 2 43 5 6 43 4 1 9 20 3 21 0 样例输出1 3 43 not find 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int search(int r[], int low, int high, int key) 5 { 6 while (low<high) 7 { 8 if (r[low] > key&&r[high] < key) 9

python术语对照表

Deadly 提交于 2019-11-28 07:42:32
术语对照表 >>> 交互式终端中默认的 Python 提示符。往往会显示于能以交互方式在解释器里执行的样例代码之前。 ... 交互式终端中输入特殊代码行时默认的 Python 提示符,包括:缩进的代码块,成对的分隔符之内(圆括号、方括号、花括号或三重引号),或是指定一个装饰器之后。 2to3 一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题。 2to3 包含在标准库中,模块名为 lib2to3 ;并提供一个独立入口点 Tools/scripts/2to3 。参见 2to3 - 自动将 Python 2 代码转为 Python 3 代码 。 abstract base class -- 抽象基类 抽象基类简称 ABC,是对 duck-typing 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 hasattr() 显得过于笨拙或有微妙错误(例如使用 魔术方法 )。ABC 引入了虚拟子类,这种类并非继承自其他类,但却仍能被 isinstance() 和 issubclass() 所认可;详见 abc 模块文档。Python 自带许多内置的 ABC 用于实现数据结构(在 collections.abc 模块中)、数字(在 numbers 模块中)、流(在 io 模块中)、导入查找器和加载器

程序员,你应该知道的数据结构之哈希表

我怕爱的太早我们不能终老 提交于 2019-11-28 06:28:31
哈希表简介 哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表,例如拼音检查器。 哈希表也有自己的缺点,哈希表是基于数组的,我们知道数组创建后扩容成本比较高,所以当哈希表被填满时,性能下降的比较严重。 哈希表采用的是一种转换思想,其中一个中要的概念是如何将 键 或者 关键字 转换成数组下标?在哈希表中,这个过程有哈希函数来完成,但是并不是每个 键 或者 关键字 都需要通过哈希函数来将其转换成数组下标,有些 键 或者 关键字 可以直接作为数组的下标。我们先来通过一个例子来理解这句话。 我们上学的时候,大家都会有一个学号 1-n号 中的一个号码,如果我们用哈希表来存放班级里面学生信息的话,我们利用学号作为 键 或者 关键字 ,这个 键 或者 关键字 就可以直接作为数据的下标,不需要通过哈希函数进行转化。如果我们需要安装学生姓名作为 键 或者 关键字 ,这时候我们就需要哈希函数来帮我们转换成数组的下标。 哈希函数 哈希函数的作用是帮我们把非int的 键 或者 关键字 转化成int,可以用来做数组的下标。比如我们上面说的将学生的姓名作为 键 或者 关键字 ,这是就需要哈希函数来完成,下图是哈希函数的转换示意图。 哈希函数的写法有很多中

程序员,你应该知道的二分查找算法

血红的双手。 提交于 2019-11-28 06:27:44
原理 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 为了方便理解,我们以数组 1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39 ,在数组中查找 26 为例,制作了一张查找过程图,其中 low 标示左下标, high 标示右下标, mid 标示中间值下标 二分查找的过程就像上图一样,如果中间值大于查找值,则往数组的左边继续查找,如果小于查找值这往右边继续查找。二分查找的思想虽然非常简单,但是查找速度非常长,二分查找的时间复杂度为O(logn)。虽然二分查找的时间复杂度为O(logn)但是比很多O(1)的速度都要快,因为O(1)可能标示一个非常大的数值,比例O(1000)。我们来看一张二分查找与遍历查找的效率对比图。 图片来源网络 从图中可以看出二分查找用了三步就找到了查找值,而遍历则用了11步才找到查找值,二分查找的效率非常高。但是二分查找的局限性非常大。那二分查找有哪些局限性呢? 局限性 二分查找依赖数组结构 二分查找需要利用下标随机访问元素,如果我们想使用链表等其他数据结构则无法实现二分查找。 二分查找针对的是有序数据