数据结构和算法
文章平均质量分 58
今天你学习了ma
不积跬步,无以至千里
展开
-
hash为什么这么快?
hash表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做hash表.相对于传统的线性查找,需要查找一个数组的元素,需要遍历整个数组,如果存在就返回.而通过hash表,就能够大幅度的提高查找的效率.若我们需要查询数组为100的大小,找到一个特定的值,用传统的做法就是依次从数组的0号元素开始,依次遍历到第99号元素,去通过比较元素的原创 2022-03-04 15:16:12 · 2127 阅读 · 4 评论 -
查找算法(线性查找,二分查找)
线性查找线性查找:用逐一的去比对数组每个位置元素的值,直到找到需要找到的元素.线性查找也叫做顺序查找,从数组的第一个元素一直到最后一个元素去查找.方法简单,遍历整个数组即可;public class SeqSearch { public static void main(String[] args) { int[] arr={12,2,3,13,13,8,6}; int result = searchIndex(arr, 3); Sy原创 2022-03-01 15:02:25 · 296 阅读 · 0 评论 -
几大排序算法介绍
排序分为内部排序和外部排序。所谓内部排序就是将程序先加载进内存再进行排序。而外部排序就是若数据量比较大的时候,如果无法将程序全部加载进内存,则用外部排序,外部排序是内部和外部相结合的方式去进行排序。常见的内部排序有插入排序,选择排序,交换排序,归并排序,基数排序其中 插入排序有可以分为:直接插入排序,希尔排序。 选择排序又可以分为:简单选择排序和堆排序。 交换排序可以分为:冒泡排序和快速排序。...原创 2022-02-28 14:21:43 · 997 阅读 · 4 评论 -
环形链表的构建
环形链表:所谓环形链表通俗的来说就是一个结点可以通过若干次遍历之后,又可以 遍历到自身。环形链表的创建思路:考虑到所有的结点加入进链表都要成环,则将第一个结点特殊化,每次将新的结点加进来都指向第一个结点,每次都断开上一个结点指向第一个结点的指针。这样保证链表成为一个尾指向头的环形链表。我们将用到三个指针:第一个firstNode指针,永远都指向第一个结点。第二个指针curNode,指向链表的最后一个结点。第三个就是指向当前加进来结点的指针heroNode。在对第一个结原创 2022-01-21 14:43:40 · 1230 阅读 · 0 评论 -
求连续相邻的最大子列和
leetcode第53题,此题用暴力能做出结果但是显然过不了,因为时间复杂度太高了。当然其它的做法也有很多,最简单的方法还是用数学的方法。先上思路。遍历数组,先定义一个最大的数,让第一个数和它相加,如果相加的结果是负数,则把最大子列和maxSize置为0,若是正数则先保存在curSize里面,对后续的遍历,若结果为负一样的将结果curSize置为0,若为正数,且curSize大于之前保存的maxSize则将maxSize置换。另外就是如果子列全都是负数的情况,需要重新做判断,...原创 2022-01-04 13:30:11 · 216 阅读 · 0 评论 -
选择排序原理
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的开头。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。选择排序的不稳定例子很简单。比如A 80 B 80 C 70 这三个数据从小到大排序第一步会把C和A做交换 变成C B A第二步和第三步不需要再做交换了。所以排序完是C B A.原创 2022-01-01 21:44:02 · 2679 阅读 · 0 评论 -
双链表的增删改查
1、啥是双链表?双链表也是链表的一种,相对于单链表而言,双链表是双向的。既有包含指向序列的前一个节点的指针,又包含指向序列的下一个节点的指针。所以基本的操作都是大同小异的,还没有了解过单链表的小伙伴可以先去了解一下。2、思路对上图的说明: 分析 双向链表的遍历,添加,修改,删除的操作思路1) 遍历2) 添加3) 修改4) 删除在初始化链表时,只需要在在单链表的基础上,加上heroNode.previous = temp;让每次添加都指向前...原创 2021-12-23 13:25:01 · 2730 阅读 · 0 评论 -
冒泡排序原理和实现
冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 比如说我现在有个数组 {8,6,5,11}第一大次从第一个数开始,8如果碰到比自己小的数就会把它和换个位置,开始时,第一次8和6比较,6比...原创 2021-12-17 22:34:52 · 935 阅读 · 0 评论 -
辗转相除法求最大公约数和最小公倍数
辗转相除法,欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。算法思路:先找出俩个数最大的数a,用最大的数对小的数b取余,a%b若余数r不为0,则将除数作为新的被除数,余数给新除数。循环直到余数r为0,则最后一次运算的除数则为最大公约数。假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:1997 / 615 = 3 (余 152)615 /.原创 2021-12-15 23:45:53 · 6025 阅读 · 2 评论 -
单链表的增删改查
目录1、链表的介绍2、链表初始化增加数据3、查找链表4、删除节点5、修改节点1、链表的介绍1.链表是有序的,但是在内存中不一定是连续的。如下图:2.链表是以节点的方式来存储,是链式存储。3.每个节点包括data(数据)域,next(指针)域:指向下一个节点。4.链表的头节点一般不存数据,利于操作链表,有时候会存一些关于链表的长度等信息。2、链表初始化增加数据思路:1.java没有指针的概念,但是可以利用辅助变量去遍历整个链表...原创 2021-12-05 22:15:51 · 1135 阅读 · 0 评论 -
队列和环形队列
1、队列1) 队列是一个有序列表,可以用数组或是链表来实现。2) 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。实例:声明: MaxSize:队列最大的长度 rear:尾指针 front:头指针,指向对列的第一个元素的下一个元素。 约定:初始时为空,rear=front=-1。当有数据进入队列时,front不变,rear向上移动。取数据时,rear不变,front向上移动。...原创 2021-12-03 11:29:05 · 1018 阅读 · 0 评论 -
稀疏数组实现
1、什么是稀疏数组稀疏数组就是将原来的数组进行简化,压缩原来的数组,减少内存的使用。2、稀疏数组的实现分析:原来的数组存在大量相同的数据0,其它不同的数据仅仅占一小部分,此时可以用稀疏数组来保存该数组。处理方式:1) 记录数组一共有几行几列,有多少个不同的值2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模稀疏数组的总共有三列,其中,第一行分别是原数组的行列数,和存在多少个不同的值。其它行数说明了在原数组不同数据出现的行..原创 2021-12-03 10:41:31 · 520 阅读 · 0 评论