![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 90
菠萝y
发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行。
展开
-
树状结构数据的数据库表设计及使用 - 5. 四种模型的性能比较与分析
本文以 MySQL 为例。文档比较长,故分为5部分发出:附:树状结构数据的数据库表设计及使用 - 1. 邻接表树状结构数据的数据库表设计及使用 - 2. 路径枚举(Path Enumeration)模型树状结构数据的数据库表设计及使用 - 3. 闭包表(Closure Table)模型树状结构数据的数据库表设计及使用 - 4. 嵌套集(Nested Set)模型这里比较一下不同模型类似数据量(大概600多条)下的性能。这里除了闭包表的关联表都未加索引。可以看到嵌套集的查询速度对比邻接表是数量级上转载 2022-06-22 14:59:40 · 1195 阅读 · 0 评论 -
树状结构数据的数据库表设计及使用 - 4. 嵌套集(Nested Set)模型
本文以 MySQL 为例。文档比较长,故分为5部分发出:嵌套集模型嵌套集(Nested Set)模型的算法也叫做预排序遍历树算法 MPTT(Modified Preorder Tree Taversal)。在嵌套集的表里我们会有 lft和 rgt 两个字段,分别用来记录遍历整个集合或整棵树时,一个节点的左右边到根节点左边的距离。如果我们用集合的图来看的话,根节点左边初始为1,那么从左向右划过所有子集,碰到集合边缘时计数加1,各个子集(即节点)的左右边的数就一目了然的出来了。换成用树形结构展示,那转载 2022-06-22 14:42:51 · 2553 阅读 · 2 评论 -
树状结构数据的数据库表设计及使用 - 3. 闭包表(Closure Table)模型
本文以 MySQL 为例。文档比较长,故分为5部分发出:闭包表模型闭包表(Closure Table)是一种通过空间换时间的模型,它是用一个专门的关系表(其实这也是我们推荐的归一化方式)来记录树上节点之间的层级关系以及距离。为了防止插入数据出错,我们需要一个存储过程:然后我们插入一些数据,这里以在论坛里发帖回帖为例:前面的存储过程会在关系表里插入每条贴子与自身和它上级贴子的关系以及距离:获取闭包表全树或子树通过关联表的父子关系,去掉自指的记录,使用内连接获取所有子节点。叶节点的特征是没有转载 2022-06-22 14:25:33 · 5827 阅读 · 0 评论 -
树状结构数据的数据库表设计及使用 - 2. 路径枚举(Path Enumeration)模型
本文以 MySQL 为例。文档比较长,故分为5部分发出:路径枚举模型路径枚举(Path Enumeration)模型通过一个字符串字段记录保存从根节点到本节点经过的所有节点枚举。创建一个表,为了方便就把人员信息和路径信息放在一起了。路径枚举模型的特点是通过将所有祖先的信息联合成一个字符串,并保存为每个节点的一个属性。字符串的构建根据喜好或需要。上面的 path_string 也可以写成 ‘A/C/E’ 或 ‘A_C_E’ 这样的。emp_id 也可以是数字,例如 ‘1/3/5’ 。路径枚举模型的问题与转载 2022-06-22 11:54:24 · 2308 阅读 · 0 评论 -
树状结构数据的数据库表设计及使用 - 1. 邻接表
树状结构或层次结构的数据在企业应用里非常常见,例如公司的组织架构、文档库的目录结构、仓库的库位组织以及物件的分类等等。通常的树状图是一种数据结构。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。在设计树状结构的数据库表的时候,大部分开发者会下意识的选择邻转载 2022-06-22 11:41:11 · 6697 阅读 · 0 评论 -
JAVA数据结构和算法-简单排序之插入排序
解析在大多数情况下,插入排序算法是之前所指出的JAVA数据结构和算法-简单排序之冒泡排序和 JAVA数据结构和算法-简单排序之选择排序 算法中最好和效率最高的一种。虽然插入排序算法仍然需要O(n的平方)的时间,但是在一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。尽管它比冒泡排序算法和选择排序算法都更麻烦一些,但它也并不很复杂。它经常被用在较复杂的排序算法的最后阶段,例如快速排序。插入排序为棒球队员排序开始插入排序之前,把棒球队员按随机顺序排成一行。(他们可能着急想打球,但是现在显然没有时间原创 2020-08-24 11:14:33 · 322 阅读 · 0 评论 -
JAVA数据结构和算法-简单排序之选择排序
选择排序选择排序改进了JAVA数据结构和算法-简单排序之冒泡排序。将必要的交换次数从O(n的平方)减少到了O(n).不幸的是,比较次数仍然保持着O(n的平方)。然而,选择排序仍然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。(一般来说,在JAVA语言中不是这种情况,JAVA中只是改变了引用位置,而实际对象的位置并没有发生改变。)用选择排序算法来对棒球队员进行排序让我们再来考虑棒球队排序的问题。在选择排序中,不再只原创 2020-08-20 17:17:05 · 179 阅读 · 0 评论 -
JAVA数据结构和算法-简单排序之冒泡排序
解析冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。使用冒泡排序算法对棒球队员排序如果人近视的像计算机一样,以至于只能看到站在他面前的两个相邻的棒球队员。在这种困难的情况下,如何为队员们进行排序呢?假设有N个队员,并且根据所占的位置从左到右分别给每个队员编号,从0到N-1。冒泡排序程序执行如下:从队列的最左边开始,比较0号位置和1号位置的队员。如果左边的队员(0号)高,就让两个队员交换。如果右边的队员高,就什么也不做。然后右移一原创 2020-08-20 17:12:56 · 190 阅读 · 0 评论 -
JAVA数据结构和算法-有序数组的二分查找
二分查找当使用二分查找时,就体现出有序数组的好处。这种查找比线程查找快很多,尤其是对于大的数组来说更为显著。猜数游戏二分查找使用的方法与我们在小时候常玩的猜数游戏中所用的方法一样。在这个游戏里,一个朋友会让你猜她整想的一个1至100之间的数。当你猜了一个数字后,她会告诉你三种选择中的一个:你猜的比她想的大、或小、或猜中了。JAVA数据结构和算法-有序数组的二分查找猜数游戏为了能使用最少的次数猜中,必须从50开始猜。如果她说你猜的太小,则推出那个数在51至100之间,所以下一次猜75(51至100原创 2020-08-18 11:56:47 · 243 阅读 · 0 评论 -
JAVA数据结构和算法之数组
一、简单使用/** * Created by Bruce on 2020/8/5 **/public class ArrayApp_01 { public static void main(String[] args) { long[] arr = new long[100];//最多有100个元素 int nElems = 0;//数量 int j ; long searchKey; arr[0] = 77;原创 2020-08-06 11:19:25 · 185 阅读 · 2 评论 -
LeetCode--节点与其祖先之间的最大差值
题目:给定二叉树的根节点 root,找出存在于不同节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)示例:输入:[8,3,10,1,6,null,14,null,null,4,7,13]输出:7解释: 我们有大量的节点与其祖先的差值,其中一些如下:|8 - 3| = 5|3 - 7| = 4|8 - 1| = 7|10 -原创 2020-07-30 11:38:49 · 253 阅读 · 0 评论 -
LeetCode--除数博弈
题目:爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 False。假设两个玩家都以最佳状态参与游戏。示例 1:输入:2输出:true解释:爱丽丝选择 1,鲍勃无法进行操作。示例 2:原创 2020-07-29 10:01:46 · 136 阅读 · 0 评论 -
LeetCode--盛最多水的容器
题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49代码:p原创 2020-07-24 17:04:27 · 78 阅读 · 0 评论 -
LeetCode--回文数
题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。进阶:你能不将整数转为字符串来解决这个问题吗?解题:方法一:/** * 下标比较-拆分后放入数组原创 2020-07-24 16:29:22 · 115 阅读 · 0 评论 -
LeetCode--字符串转换整数 (atoi)
题目:请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来, 形成一个有符号整数。 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函 数不应该造成影响。注意:假如该字符串原创 2020-07-24 11:34:31 · 342 阅读 · 0 评论 -
LeetCode--整数反转
题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。解法一:使用String的一些函数 public int reverse(int x) { if(x ==原创 2020-07-24 09:55:33 · 97 阅读 · 0 评论 -
什么是一致性Hash算法?
最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家整理一下什么是Hash一致性算法,希望对大家有帮助!文末送书,长按抽奖助手小程序即可参与,祝君好运!经常阅读我文章的小伙伴应该都很熟悉我写文章的套路,上来就是先要问一句为什么?也就是为什么要有Ha...转载 2019-04-09 17:15:11 · 120 阅读 · 0 评论 -
数据结构之链表
链表是一种插入和删除都比较快的数据结构,缺点是查找比较慢。除非需要频繁的通过下标来随机访问数据,否则在很多使用数组的地方都可以用链表代替在链表中,每个数据项都包含在“链结点”中,一个链结点是某个类的对象。每个链结点对象中都包含一个对下一个链接点的引用,链表本身的对象中有一个字段指向第一个链结点的引用,如下图所示:在数组中,每一项占用一个特定的位置,这个位置可以用一个下标号直接访问,就像一排房...转载 2019-03-14 18:40:00 · 126 阅读 · 0 评论 -
数据结构之AVL树
1. 什么AVL树AVL树由两位科学家在1962年发表的论文《An algorithm for the organization of information》当中提出,其命名来自于它的发明者G.M. Adelson-Velsky和E.M. Landis的名字缩写。**AVL树是最先发明的自平衡二叉查找树,也被称为高度平衡树。**相比于二叉查找树,它的特点是:任何节点的两个子树的最大高度差为1...转载 2019-03-19 14:49:22 · 434 阅读 · 0 评论 -
数据结构之二叉树
通过前面的学习,我们知道,有序数组可以利用二分查找法快速的查找特定的值,时间复杂度为O(log2N),但是插入数据时很慢,时间复杂度为O(N);链表的插入和删除速度都很快,时间复杂度为O(1),但是查找特定值很慢,时间复杂度为O(N)。那么,有没有一种数据结构既能像有序数组那样快速的查找数据,又能像链表那样快速的插入数据呢?树就能满足这种要求。不过依然是以算法的复杂度为代价在编程的世界里,有一...转载 2019-03-15 16:45:26 · 166 阅读 · 0 评论 -
排序算法(一)——冒泡排序及改进
排序算法概述所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。稳定性:一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。如果算法是稳定的有什么好处呢?排序算法如果是稳定的,...转载 2019-03-21 11:24:27 · 1269 阅读 · 0 评论 -
排序算法(二)——选择排序及改进
选择排序基本思想冒泡排序中有一个缺点,比如,我们比较第一个数a1与第二个数a2的时候,只要a1比a2大就会交换位置,但是我们并不能确定a2是最小的元素,假如后面还有比它更小的,该元素还会与a2再次进行交换,而且这种交换有可能发生多次才能确定a2的最终位置。选择排序可以避免这种耗费时间的交换操作,从第一个元素开始,扫描整个待排数组,找到最小的元素放之后再与第一个元素交换位置,然后再从第二个元素...转载 2019-03-21 14:13:49 · 823 阅读 · 0 评论 -
排序算法(三)——插入排序及改进
插入排序基本思想在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。java实现//插入排序public void insertionSort(){ int len = array.length; int counter ...转载 2019-03-21 16:55:16 · 444 阅读 · 0 评论 -
数据结构之霍夫曼树
计算机里每个字符在没有压缩的文本文件中都由一个字节(如ASCII码)或两个字节(如Unicode码)表示。这些方案中,每个字符需要相同的位数下表列出了字母对应的ASCII码字母 十进制 二进制A 65 01000001B 66 ...转载 2019-03-18 14:48:32 · 522 阅读 · 0 评论 -
数据结构与算法概念解析
数据之间的相互关系称为逻辑结构。通常分为四类基本结构:集合 结构中的数据元素除了同属于一种类型外,别无其它关系。线性结构 结构中的数据元素之间存在一对一的关系。树型结构 结构中的数据元素之间存在一对多的关系。图状结构或网状结构 结构中的数据元素之间存在多对多的关系。数据结构在计算机中有两种不同的存储方法:顺序存储结构:用数据元素在存储器中的相对位置来表示数据元...转载 2019-03-13 14:47:18 · 204 阅读 · 0 评论 -
数据结构之数组
数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本数据类型使用,因此,在一些教材中,数组并没有被当做一种数据结构单独拿出来讲解(其实数组就是一段连续的内存,即使在物理内存中不是连续的,在逻辑上肯定是连续的)。其实没必要在概念上做纠缠,数组可以当做学习数据结构的敲门砖,以此为基础,了解数据结构的基本概念以及构建方法数据结构不仅是数据的容器,还要提供对数据的操作方法,比如检索、插入、删...转载 2019-03-13 16:30:51 · 145 阅读 · 0 评论 -
数据结构之栈
数组、链表、树等数据结构适用于存储数据库应用中的数据记录,它们常常用于记录那些现实世界的对象和活动的数据,便与数据的访问:插入、删除和查找特定数据项而栈和队列更多的是作为程序员的工具来使用。他们主要作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比那些数据库类型的结构要短很多。在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当任务完成后就被销毁栈和队列的访...转载 2019-03-13 17:09:23 · 154 阅读 · 0 评论 -
排序算法(四)——归并排序与递归
基本思想分析归并排序之前,我们先来了解一下分治算法。分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。分治算法的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解...转载 2019-04-03 11:23:36 · 231 阅读 · 0 评论 -
排序算法(五)——快速排序
基本思想快速排序也是基于分治算法得。步骤如下:(1)选择一个基准元素,通常选择第一个元素或者最后一个元素;(2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大;(3)此时基准元素在其排好序后的正确位置;(4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。上图中,演示的是第一轮快速排序的过程,首先...转载 2019-04-03 15:21:49 · 220 阅读 · 0 评论 -
排序算法(六)——希尔排序
基本思想希尔排序是基于插入排序的,又叫缩小增量排序。在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据。试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右移一位...转载 2019-04-03 16:53:50 · 1380 阅读 · 2 评论 -
数据结构之队列
栈是“后进先出”(LIFO,Last InFirst Out)的数据结构,与之相反,队列是“先进先出”(FIFO,First InFirst Out)的数据结构队列的作用就像售票口前的人们站成的一排一样:第一个进入队列的人将最先买到票,最后排队的人最后才能买到票在计算机操作系统或网路中,有各种队列在安静地工作着。打印作业在打印队列中等待打印。当敲击键盘时,也有一个存储键盘键入内容的队列,如果我...转载 2019-03-14 11:26:34 · 168 阅读 · 0 评论