数据结构与算法
文章平均质量分 75
随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题的。
杯莫停883
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
并查集路径压缩
并查集里的 find 函数里可以进行路径压缩,是为了更快速的查找一个点的根节点。对于一个集合树来说,它的根节点下面可以依附着许多的节点,因此,我们可以尝试在 find 的过程中,从底向上,如果此时访问的节点不是根节点的话,那么我们可以把这个节点尽量的往上挪一挪,减少数的层数,这个过程就叫做路径压缩。如下图中,find(4) 的过程就可以路径压缩,让树的层数更少。节点 4 往上寻找根节点时,压缩第一步,树的层数就减少了一层:节点 2 向上寻找,也不是根节点,那么把元素 2 指向原来父节点的原创 2022-04-09 09:01:58 · 536 阅读 · 0 评论 -
并查集size rank的优化
并查集 size 的优化按照上一篇文章的思路,我们把如下图所示的并查集,进行 union(4,9) 操作。合并操作后的结构为:可以发现,这个结构的树的层相对较高,若此时元素数量增多,这样产生的消耗就会相对较大。解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。构造并查集的时候需要多一个参数,sz 数组,sz[i] 表示以 i 为根的集合中元素个数。// 构造函数public UnionFin原创 2022-04-08 10:15:13 · 211 阅读 · 0 评论 -
并查集快速查找,快速合并
并查集基础一、概念及其介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。二、适用说明并查集用在一些有 N 个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这个过程看似并不复杂,但数据量极大,若用其他的数据结构来描述的话原创 2022-04-08 12:36:37 · 482 阅读 · 0 评论 -
二分搜索树节点删除以及二分搜索树的特性
本文介绍二分搜索树节点的删除之前,先介绍如何查找最小值和最大值,以及删除最小值和最大值。以最小值为例(最大值同理):查找最小 key 值代码逻辑,往左子节点递归查找下去:...// 返回以node为根的二分搜索树的最小键值所在的节点private Node minimum(Node node){ if( node.left == null ) return node; return minimum(node.left);}...删除二分搜索树的最小...原创 2022-04-06 11:11:48 · 210 阅读 · 0 评论 -
二分搜索树节点的插入及查找
目录二分搜索树节点的插入Java 实例代码二分搜索树节点的查找Java 实例代码二分搜索树节点的插入首先定义一个二分搜索树,Java 代码表示如下:BST.javapublic class BST<Key extends Comparable<Key>, Value> { // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现 private class Node { private Key k原创 2022-04-04 10:58:36 · 303 阅读 · 0 评论 -
二分搜索树
目录一、概念及其介绍二、适用说明三、二分查找法过程图示四、Java 实例代码一、概念及其介绍二分搜索树(英语:Binary Search Tree),也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件:若它的左子树不为空,左子树上所有节点的值都小于它的根节点。 若它的右子树不为空,右子树上所有的节点的值都大于它的根节点。它的左、右子树也都是二分搜索树。如下图所示:二、适用说明二分搜索树有着高效的插入、删除、查询操作。平均时原创 2022-04-03 14:21:17 · 122 阅读 · 0 评论 -
索引堆及其优化
目录一、概念及其介绍二、适用说明三、结构图示四、Java 实例代码一、概念及其介绍索引堆是对堆这个数据结构的优化。索引堆使用了一个新的 int 类型的数组,用于存放索引信息。相较于堆,优点如下:优化了交换元素的消耗。 加入的数据位置固定,方便寻找。二、适用说明如果堆中存储的元素较大,那么进行交换就要消耗大量的时间,这个时候可以用索引堆的数据结构进行替代,堆中存储的是数组的索引,我们相应操作的是索引。三、结构图示我们需要对之前堆的代码实现进行改造原创 2022-04-03 11:53:36 · 1200 阅读 · 0 评论 -
堆排序(java)
目录基础堆排序一、概念及其介绍二、适用说明三、过程图示四、Java 实例代码优化堆排序Java 实例代码基础堆排序一、概念及其介绍堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似 完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。二、适用说明我们之前构造堆的过程是一个个数据调用 insert 方法使用 shift up 逐个插入到堆中,这个算法的时候时间复杂度是 O(nlo原创 2022-04-02 11:19:54 · 4875 阅读 · 0 评论 -
堆的shiftup以及shiftdown
目录堆的 shift upJava 实例代码堆的 shift downJava 实例代码堆的 shift up本小节介绍如何向一个最大堆中添加元素,称为 shift up。假设我们对下面的最大堆新加入一个元素52,放在数组的最后一位,52大于父节点16,此时不满足堆的定义,需要进行调整。首先交换索引为 5 和 11 数组中数值的位置,也就是 52 和 16 交换位置。此时 52 依然比父节点索引为 2 的数值 41 大,我们还需要进一步挪位置。这时原创 2022-04-01 10:32:13 · 1342 阅读 · 0 评论 -
堆的基本储存
目录一、概念及其介绍二、适用说明三、结构图示四、Java 实例代码一、概念及其介绍堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值。 堆总是一棵完全二叉树。二、适用说明堆是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在 O(1)~O(logn) 之间,堆通常用于动态分配和释放程序所使用的对象。若为优原创 2022-04-01 09:50:57 · 149 阅读 · 0 评论 -
双路快速排序以及三路排序算法
目录双路快速排序一、概念及其介绍二、适用说明三、过程图示四、Java 实例代码三路排序算法一、概念及其介绍二、适用说明四、Java 实例代码双路快速排序一、概念及其介绍双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将 <v 的元素放在索引i所指向位置的左边,而将 >v 的元素放在索引j所指向位置的右边,v 代表标定值。二、适用说明时间和空间复杂度同随机化快速排序。 对于有大原创 2022-03-31 11:15:47 · 1257 阅读 · 0 评论 -
随机化快速排序(java)
一、概念及其介绍快速排序由 C. A. R. Hoare 在 1960 年提出。随机化快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。二、适用说明快速排序是一种比较快速的排序算法,它的平均运行时间是 O(nlogn),之所以特别快是由于非常精练和高度优化的内部循环,最坏的情形性能为 O(n^2)。像归并一样,快速排序也是一种原创 2022-03-31 11:01:23 · 1546 阅读 · 0 评论 -
归并排序(java实现)
目录一、概念及其介绍二、适用说明三、过程图示四、Java 实例代码一、概念及其介绍归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二、适用说明当有 n 个记录时,需进行 logn 轮归并排序,每一轮归并,其比较次数不超过 n,元素移原创 2022-03-30 12:08:34 · 7984 阅读 · 1 评论 -
希尔排序(java实现)
一、概念及其介绍希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。二、适用说明希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数原创 2022-03-29 19:14:44 · 5370 阅读 · 0 评论 -
插入排序(java)
java插入排序原创 2022-03-29 12:15:55 · 109 阅读 · 0 评论 -
数据结构与算法
数据结构:数据结构(英语:data structure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。常见的数据结构栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。 队列(Queue):原创 2022-03-29 11:03:34 · 188 阅读 · 0 评论
分享