算法与数据结构

数据结构与算法之美——散列表

核能气质少年 提交于 2020-03-14 05:06:11
1.1 散列思想 ​ 将数据以散列函数的方式(键值对)存储 1.2 散列函数 ​ 形如hash(key)的键值对函数叫散列函数,hash(key)是值,key是键。 1.3 散列函数设计的基本要求 散列函数计算值应该是非负整数 如果散列函数的键相等,则函数一定相等 如果键不相等,则值也一定不相等 ​ 但是在真实的情况下第三个条件很难满足,这种不满足的情况叫它 散列冲突 。 1.4 散列冲突的解决办法 ​ 散列冲突有两类解决办法:开放寻址法、链表法。 开放寻址法 ​ 开放寻址法的思想是如果出现了散列冲突,就向后探测空闲位置,将其插入。列举下比较简单的方法,比如: 线性探测法 。 删除操作不能直接将其值赋为null,否则会使寻址法失效,如果一定用的话,可以用个表示来标记要删除的元素,寻址时发现此标识就向后寻找。 ​ 其实,线性探测法有很多的问题,比如:当空闲的位置越来越少的时候,寻找时间越来越久,性能会下降很多,最坏的情况下会达到O(n)。除了线性探测,还有 二次探测 、 双重散列 等方法可以解决。 ​ 不过,不管哪一种方法,空闲位置不多时,性能都会下降很多。一般情况,都会使空闲位置与散列表的长度处于一个健康的比值,这个比值叫 装载因子 。 链表法 ​ 链表法是相比寻址法较好的解决散列冲突的解决办法。他会根据键值的不同来划分不同的‘桶’,每一个桶都会对应一条链表

数据结构与算法之比较排序算法总结

喜欢而已 提交于 2020-03-13 14:53:32
介绍: 比较算法大致可以分为两种,一种为比较算法,另一种为非比较算法。 比较算法有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序。 非比较算法有:计数排序,基数排序,桶排序。 https://gitee.com/linqiankun/Utils/tree/v3.0/ 时间复杂度: 排序方法 最好情况 平均情况 最差情况 辅助空间 稳定性 冒泡排序 n n^2 n^2 1 yes 选择排序 n^2 n^2 n^2 1 no 插入排序 n n^2 n^2 1 yes 归并排序 nlogn nlogn nlogn n yes 堆排序 nlogn nlogn nlogn 1 no 快速排序 nlogn nlogn n^2 1 no 希尔排序 n^1.3 nlogn~n^2 n^2 logn~n no 比较算法: 冒泡排序 普通冒泡排序 冒泡排序是一种极为简单的排序算法。通过循环反复的遍历数组中的元素,依次比较相邻的两个元素。如果不满足排序规则,就进行位置交换,直到没有元素需要交换位置,排序完成。 这个算法会慢慢的使元素按照需要的顺序浮出来。 时间复杂度为:O(n)~O(n^2)~O(n^2) 冒泡排序运行顺序: 比较相邻元素,按照排序规则进行位置交换。 对每一对相邻元素进行第一步的操作,操作完之后,队伍最后会是满足条件的数。循环体的内层循环走完一圈。

软考笔记第六天之数据结构与算法基础(一)

邮差的信 提交于 2020-03-13 07:43:05
数组 数组类型 存储地址计算 一维数组a[n] a[i]的存储地址是:a+i*len 二维数组a[n][m] a[i][j]的存储地址是: 按行存储:a+(i*m+j)*len 按列存储:a+(j*n+i)*len 例:已知5行5列的二维数组a中的各元素占2个字节,求元素a[2][3]按行优先存储的存储地址? a+(2*5+3)*2=a+26 稀疏矩阵 数据结构: 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往和高效的检索算法和索引技术有关。 数据逻辑结构: 线性结构,非线性结构(树,图[有环路]) 树: 二叉树遍历 前序遍历(根,左,右) 中序遍历(左,根,右) 后序遍历(左,右,根) 层次遍历(第一层,第二层...) 前序遍历:1,2,4,5,7,8,3,6 中序遍历:4,2,7,8,5,1,3,6 后序遍历:4,8,7,5,2,6,3,1 层次遍历:1,2,3,4,5,6,7,8 反向构造二叉树(已知两种序列,画出二叉树) 普通树转二叉树(孩子结点-左子树结点,兄弟结点-右孩子结点) 查找二叉树 二叉排序树(左孩子小于根,右孩子大于根) 最优二叉树(哈夫曼树) 构造最短的带权路径的树 线索二叉树: 使遍历更加快捷 绿线指向前驱结点,红线指向后驱结点

数据结构与算法基础 模块二

别说谁变了你拦得住时间么 提交于 2020-03-13 07:34:38
那么在上一次的分享中,针对链表和顺序表进行了比较,也对于他们二者进行了基础性的分析和说明,那么在模块二中,紧接着上一次的分享,说明一下栈,队列和树的相关知识。 栈 栈的关键主要是记住: 先进后出 (可以形象的比喻为洗盘子,先洗的盘子放在最下面,放的时候一个一个放,最先洗完的最后放进碗橱) 并且我们需要明确,栈只是一个逻辑上的概念,并非是实际存在的,并且,出栈的顺序是灵活的,并不是固定的一定是按照进来的顺序走,有可能是进一个出一个,也有可能是全部进来再出,所以,我们要明确不能死记栈的概念,而是要灵活的运用。 队列 队列的关键是: 先进先出 (可以形象的比喻成在银行排队取钱,先进去的人排在队伍的前面,完成取钱任务后,先出门) 队列和栈两者有一个很明显的区别,就是出的顺序,所以在记忆的时候,我们可以组合在一起记忆,并且将他们各自都形象的记忆,这样有利于我们区分两者之间的关系,也有利于我们记忆。 那么,队列中还包括循环队列 :在判断循环队列空的条件:head=tail 这个式子也可以表示队满的情况, 但也有这种可能,就是他的尾指针并没有和他的头指针存在一个地址里,为了区分开来,头地址和尾地址之间还存在一个地址,即其队满的条件是:tail+1=head 树 首先,我们在说明树的一些问题的时候,我们需要明确有关于树的相关基本概念: 1、节点的度 (就看与下一层与几个结点相关联) 2、树的度

数据结构与算法(4)树

本秂侑毒 提交于 2020-03-13 07:33:22
树的基本概念: 1、结点的度 结点的度是子结点的个数。例如:结点1有三个字结点2,3,4,所以结点1的度为3。 2、树的度 树的度等于所有结点度中度最高的值。例如:上图中结点度最高为3,所以树的度为3。 3、叶子结点 叶子结点是度为0的结点即没有子结点的结点。例如:上图中3,5,6,7,9,10。 4、分支结点 分支结点是除了叶子结点,树中的其他所有结点。例如:上面树的分支结点为1,2,4,8。 5、内部结点 内部结点是除了根结点以及叶子结点或在分支结点的基础之上在去掉根结点。例如:上面树的内部结点为2,4,8。 6、父结点、子结点、兄弟结点 父节点、子结点和兄弟结点是相对而言的。例如:结点1是结点2,3,4的父节点,结点2,3,4也是结点1的子结点,结点2,3,4又是兄弟结点。 7、层次 图中我们已经表出来了,根为第一层,根的孩子为第二层,依此类推,若某结点在第i层,则其孩子结点在第i+1层。 树的遍历 1、前序遍历 基本思想:前序遍历就是先访问根结点,再访问叶子结点。 图中树的前序遍历为:1,2,5,6,7,3,4,8,9,10。 2、后序遍历   基本思想:本后序遍历就是先访问子结点,再访问根结点。 图中树的后序遍历为:5,6,7,2,3,9,10,8,4,1。 3、层次遍历 基本思想:从第一层开始,依此遍历每层,直到结束。 图中树的层次遍历为:1,2,3,4,5,6,7,8

Java数据结构与算法-单链表 新浪,腾讯面试题详解

放肆的年华 提交于 2020-03-12 17:24:52
单链表常见的几个面试题 新浪,腾讯内部面试题目 题目分析 代码实现 测试用例 一,面试题目 统计链表中 有效节点 的个数(不含 头结点 )【新浪】 获取链表中倒数第 K 个元素【新浪】 单向链表的 逆转 【腾讯】 二,题目分析 第一题:我们可以获取链表的头结点后,然后进行 遍历 ,设置一个变量进行计数, 注意不要算上头结点 。 第二题:我们可以在第一题的基础上,在获取到了链表的长度后,只需要考虑倒数第K个节点是从前面开始第几个节点,我们就循环几次不就可以了?注意如果你的下标从 0 开始循环那就 size - k 就可以了,如果你是从 1 开始的那么就 size-k+1 就可以了。 第三题:我们需要创建一个新的头结点,然后把原来的那个节点从前往后依次放到新节点的后面,注意是newHeadNode.next始终等于新加入的那个元素;核心代码就是: oldNode.next = newHeadNode.next;newHeadNode.next = oldNode ;就是这样移动,最后在把新的节点后的元素指向原来头结点: oldHeadNode = newHeadNode; 图解如下: 三,代码实现 第一题 //统计出有效的节点个数,不含头结点。 public static int getLength ( HeroNode headHeroNode ) { int count = 0 ;

数据结构与算法复习笔记一

倾然丶 夕夏残阳落幕 提交于 2020-03-12 08:56:30
一.基本数据结构 1.数组、字符串 优点: 构建一个数组非常简单 能让我们在O(1)的时间里根据数组下标查询某个元素 缺点: 构建时必须分配一段连续的空间 查询、删除、添加某个元素时须遍历整个数组 2.链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 双链表:双链表的每个结点中都含有两个引用字段。 优点:灵活分配空间 缺点:查询元素需要O(n)时间 解题技巧: 利用快慢指针(有时需要三个指针) 加链表头 例如: 两个排序链表进行整合排序 将链表的奇偶数按原定顺序分离,生成前半部分为奇数,后半部分为偶数的链表 3.栈 特点:后进先出 算法基本思想: 可以用一个单链表实现 只关心上一次操作 处理完上一次操作后,能在O(1)时间内查找到更前一次的操作。 4.队列 特点:先进先出 双链表实现 常用场景: 广度优先搜索 5.树 特点:结构直观 常考算法:递归 常考树的形状: 普通二叉树 平衡二叉树 完全二叉树 二叉搜索树 红黑树 树的遍历应用场景: 前序遍历:多应用于树的创建和搜索 中序遍历:二叉搜索树 后序遍历:在对某个节点进行分析的时候,需要来自左子树和右子树的信息。 二.高级数据结构 1.优先队列 与普通队列区别: 保证每次取出的元素是队列中优先级最高的 优先级别可自定义 常用场景: 从杂乱无章的数据中按照一定的顺序(或优先级

(数据结构)顺序存储的线性表

我是研究僧i 提交于 2020-03-12 07:05:35
---恢复内容开始--- 推荐一本学习书籍:程杰的《大话数据结构》。 既然是数据结构,那什么是数据结构呢?这里补充一些基本术语和概念。 数据结构: 是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 数据: 是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号总集。 数据元素: 是组成数据、有一定意义的基本单位,在计算机中通常作为整体处理。也成为记录。 数据项: 一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。 数据对象: 是性质相同的数据元素的集合,是数据的子集。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构:是指数据对象中数据元素之间的相互关系。 集合结构:集合结构中的数据元素除了属于同一个集合外,它们之间没有其他关系。 线性结构:线性结构中的数据元素之间是一对一的关系。 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。 图形结构:图形结构的数据元素是多对多的关系。 物理结构:是指数据的逻辑结构在计算机中的存储形式 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据将的逻辑关系和物理关系是一致的。 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 数据类型

数据结构与算法——删除排序表中的重复元素

与世无争的帅哥 提交于 2020-03-12 02:31:02
题目 解题 设置两个节点newhead,newnext,newnext用于遍历链表中的所有元素,newhead通过判断newhead.val与newnext.val是否相等,指向不重复的元素,达到删除重复元素的效果。 注意遍历结束后要将newhead.next=null,否则若原链表最后两个元素相等,删除后的新链表会保留该重复元素。 public ListNode DeleteDuplicates ( ListNode head ) { if ( head == null || head . next == null ) { return head ; } ListNode newhead = head ; ListNode newnext = head . next ; while ( newnext != null ) { if ( newhead . val != newnext . val ) { newhead . next = newnext ; newhead = newnext ; } newnext = newnext . next ; } newhead . next = null ; return head ; } 来源: CSDN 作者: Leeyayai 链接: https://blog.csdn.net/qq_44425179/article

js数据结构与算法存储结构

孤街醉人 提交于 2020-03-12 01:50:30
数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。 传统上,我们把数据结构分为逻辑结构和物理结构。 逻辑结构: 是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。 物理结构: 是指数据的逻辑结构在计算机中的存储形式。 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的一端进行;队列(Queue):运算只在表的两端进行。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表。 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。 四大结构 集合结构 线性结构 树形结构 图形结构 顺序存储和链式存储 数据元素的存储结构形式有两种:顺序存储和链式存储。 例如我们编程语言的数组结构就是这样滴。 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 链式存储结构 线性表 线性表:就好像是排队一样,具有线一样性质的结构,它是由零个或多个数据元素组成的有限序列。 若元素存在多个