数据结构和算法
深入理解java底层的数据结构,提升自己,为自己从中级段位进入高级段位准备
大当家_白
这个作者很懒,什么都没留下…
展开
-
数据结构-堆和堆排序java
堆堆是一颗特殊的二叉树,什么样的二叉树才是堆?只需要满足一下两个条件,那么它就是堆。堆是一颗完全二叉树 堆中每一个节点的值都必须大于等于(或者小于或等于)其子树中每一个节点的值。对于每个节点的值大于等于子树中每个节点中的值的堆,称之为大顶堆。对于每个节点的值小于或等于子树中每个节点的值的堆,称之为小顶堆。如下图:编号1和编号2是大顶堆,编号3是小顶堆,编号4不是堆。如何实现一个堆?要实现一个堆,需要先知道,如何存储一个堆以及堆支持哪些操作。堆中数据的存储堆是一颗完全二原创 2020-07-16 19:04:59 · 218 阅读 · 0 评论 -
数据结构和算法第一阶段学习知识点汇总
对数据结构和算法第一阶段学习的知识点做一个简单的汇总,这一阶段的学习是数据结构和算法的基础篇。还需要通过项目实战和看源码的方式加深这些知识的理解。同时也为下一阶段的学习打下了比较良好的基础。虽然第一阶段已经学习完了。但仍需要多练、多学、多思、多想...原创 2020-07-15 23:59:52 · 689 阅读 · 0 评论 -
数据结构-平衡二叉查找树和红黑树
平衡二叉查找树平衡二叉树的严格定义:二叉树中任意节点的左右子树高度相差不能大于1。所以满二叉树和完全二叉树都是平衡二叉树,而非完全二叉树也可以是平衡二叉树如下图:平衡二叉查找树不仅需要满足平衡二叉树的特定,还需要满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL树,AVL树严格符合上面谈到的平衡二叉查找树的定义。任意节点左右子树高度相差不大于1,是一颗高度平衡的二叉查找树。AVL树的优缺点:ALV树是一颗高度平衡的二叉查找树,查询效率非常高效,时间复杂度为O()。但有利也...原创 2020-07-15 16:56:01 · 294 阅读 · 0 评论 -
数据结构--二叉查找树的实现以及性能分析
目录二叉查找树二叉查找树的实现1、查询2、新增3、删除支持重复数据的二叉查找树二叉查找树的性能分析二叉查找树二叉查找树又称二叉搜索树,也被称为二叉排序树问题一:什么样的树才是二叉查找树?在树中的任意节点,其左子树中的每一个节点均小于该节点值,其右子树中的值均大于该节点的值。如果使用中序遍历,遍历二叉查找树,可以输出一个有序的数据序列,时间复杂度为O(n),非常高效。二叉查找树的实现1、查询先取根节点与要查询的数据进行比较,如果等于根节点,那就.原创 2020-07-15 00:19:35 · 1452 阅读 · 0 评论 -
数据结构--树以及二叉树的相关概念
学习树这种数据结构,从普通树到工业级别使用的树,它是一个递进的过程。如果跳过前面的步骤,而直接取学习和查阅工业级别使用的树(红黑树)的相关资料,我想这样学习的效果和体验都是很差的。学习红黑树之前。首先需要理解的是树的基本概念和相关术语。其次二叉树,二叉树的相关概念和术语,以及二叉树的存储方式和遍历方式。其次是弄明白什么样的树是二叉查找树,以及二叉查找树的性能分析和其不能成为工业级别使用的树的原因。再引出平衡二叉查找树以及构建平衡二叉查找树的初衷,分析AVL树(最先被发明的严格的平衡二叉树)的优越点,最后原创 2020-07-14 00:43:48 · 313 阅读 · 0 评论 -
排序算法--归并排序、快速排序
归并排序和快速排序都适合大规模的数据排序,它们的平均时间复杂度都是O()。这两种排序方式解决问题的方式都是将一个大问题分解成若干个小问题来解决的,小问题解决了。大问题自然也就解决了。归并排序归并排序的核心思想:对于一个要排序的数组,先把数组从中间分解为前后两部分,然后对前后两部分进行排序,再将排序好的数组合并在一起,这样的数组就有序了。(摘自:数据结构之美)归并排序的主要思想:把待排序的记录序列分成若干个子序列,先将每一个子序列的记录进行排序,再将已排序的子序列合并,得到一个完全排序的记录.原创 2020-07-11 04:16:43 · 1168 阅读 · 0 评论 -
排序算法---冒泡排序、插入排序、选择排序
时间复杂度为O()的排序算法:冒泡排序、插入排序、选择排序这三个算法都有一个共同点,即可以把数组分解成两部分:已排序部分和未排序部分,我会用已排序数组和未排序数组替代。每次循环都是从未排序数组中获取一个数据元素放入已排序数组。只是放入的方式不一样而已。冒泡排序:未排序数组中的数据两两比较。把最大的数据元素放入未排序数组的最后,也就是已排序数据的第一个位置。插入排序:取出未排序数组的第一个元素,放入已排序数组的最后,与已排序数组的中的数据数据元素进行计较,插入正确位置选择排序:从未排序数组中获原创 2020-07-10 00:53:13 · 898 阅读 · 0 评论 -
排序算法--如何分析、评价一个排序算法的优劣
学习排序算法感觉有种回到高中做数学题的感觉,需要深入的理解这些排序算法,才能真正的掌握它。如何评价、分析一个排序算法?一)、排序算法的执行效率如何来评估排序算法的执行效率呢1、最好情况、最坏情况、评价情况的时间复杂度 对于要排序的数据,有的接近有序,有的完全无序,而排序数据的有序度会影响算法的执行时间,我们需要知道排序算 法在不同数据下的性能表现2、时间复杂度的系数、常量、低阶 时间复杂度是随规模n增长的变化趋势。对于规模很小的数据,如...原创 2020-07-09 20:33:24 · 2787 阅读 · 0 评论 -
算法--递归算法
什么样的场景可以使用递归呢?需要同时满足以下三个条件才可以使用递归:1、一个问题的解可以分解为几个子问题2、这个问题分解分解之后的子问题,除了数据规模不同,求解思路完成相同3、递归存在终止条件如何编写递归代码?写递归代码的关键是如何找到将大问题分解为小问题的规律,并且基于此写出递归公式,然后再推导出终止条件,最后将递归公式和终止条件翻译成代码。这里需要注意的是:当我们遇到递归,把它抽象为递归公式的时候,不要想着层层调用,不要试图用人脑去分解每一个步骤,否则你就会被绕进去。.原创 2020-07-08 01:21:22 · 402 阅读 · 0 评论 -
数据结构和算法-复杂度分析
如何衡量代码的效率?时间和空间复杂度分析。(这个是数据结构和算法的重中之重)数据结构和算法的作用主要是用来解决“快”和“省”的问题。即如何让代码运行的更快,如何让代码更节省内存空间。执行效率是一项非常重要的考量指标。而我们可以时间、空间复杂度分析代码的执行效率。事后统计法我们可以跑一遍代码,通过统计、监控,就能得到算法执行的时间占比,内存大小。这种分析方法叫做事后统计法。而这种统计方法有两个明显的缺陷缺陷一:测试环境非常依赖测试环境。缺陷二:测试结果受数据规模的影响很大虽然缺陷.原创 2020-07-07 16:56:59 · 127 阅读 · 0 评论 -
数据结构 -- 数组
数组(Array)是一种线性表数据结构,它用一组连续的内存地址,来存储一组具有相同类型的数据。这里的关键字是“线性表”,“连续的内存空间和相同的数据类型”线性表:就是数据排成一条线一样的数据结构。除了数组,还有链表,队列,栈等。对于线性表和非线性表我前面的博客中有介绍。这里就不详述了连续的存储空间和相同的数据类型:正因为这个原因,数组才有了一个堪称杀手锏的特性“随机访问”。也就是根据索引或者说下标去获取数组中的数据。这个有利那同时也存在弊端,弊端一:这两个限制让数组的很多操作..转载 2020-07-06 21:26:56 · 286 阅读 · 0 评论 -
如何学习数据结构和算法
首先掌握常用的、基础的。然后在此基础上往进行扩展学习。常用的、基础的数据结构和算法有20个。数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。这些需要一一攻克。多思考,多想。往往需要灵魂三问,是什么?有什么用?怎么用?用来解决哪些实际问题?当然了,你也可以思考一下为啥要学习这门课程?什么是数据结构?什么是算法?广义:数据结构就是一组存储结构。算..转载 2020-07-05 09:59:24 · 6167 阅读 · 3 评论 -
数据结构--队列的相关概念和实现
参考《数据结构-java语言描述》队列是一种运算受限的线性表,只能在一端进行数据元素的添加,在另一端进行删除。允许添加的一端被称之为队尾(rear),允许删除的一端被称为队头(front)添加操作称之为入队,删除操作称之为出队队列遵循先进先出(First In First out)的原则上图为队列示意图队列的基本操作1、初始化 -- 构造一个空队列2、入队 -- 在队列的尾部插入一个新的数据元素3、出队 -- 删除队列头部的元素4、获取对头 -- 获取对头数据元.原创 2020-06-28 18:18:54 · 875 阅读 · 0 评论 -
数据结构--栈的相关知识点以及实现
参考:《数据结构--java语言描述》栈是仅限在表尾(也就是栈顶)进行插入和删除操作的线性表。允许插入和删除操作的一端称为栈顶(top),另一端称之为栈底(button)不含任何元素的栈称之为空栈。假设栈S={a1 , a2, … , an},则称a1为栈元素, an为栈顶元素。由于入栈和出栈都是对栈顶元素进行操作,遵循后进先出(LIFO, last in first out)的原则,因此栈又称为后进先出的线性表入栈和出栈是栈的两个主要操作,入栈和出栈操作都是对栈顶元素进行过操作。所..原创 2020-06-24 03:46:03 · 3220 阅读 · 0 评论 -
数据结构--线性表之链表实现
参考:《数据结构--Java语言描述》线性表的链式存储结构是用一组任意的存储单元来存放线性表的数据元素,这组存储单位可以是连续的,也可以是不连续的。那么对于某一个元素如何找到下一个元素存放的位置?对于任意数据元素ai ,存在本身的的信息之外,还需要存储一个指示其直接后继元素存放位置的指针,这两部分组成数据元素ai的存储映像,被称之为结点存储数据元素信息的称为数据域,存储直接后继存放位置的域称为指针域。如下图,单链表结点结构单链表结点类的泛型定义如下: class Nod.原创 2020-06-23 21:20:49 · 413 阅读 · 0 评论 -
数据结构-线性表之顺序表实现
参考《数据结构-java语言描述》线性表的顺序表指的是用一组连续的存储单元依次存储线性表中的数据元素,通常采用数组来描述顺序表顺序表的存储结构示意图顺序表实现相关操作1、初始化顺序表的初始化是为顺序表分配一个预定义大小的内存空间,无参构造函数设置数组长度为maxSize,有参构造函数设置数组的长度为n,length设置为0,表明顺序表为空表没有数据元素。public class ArraysequenceList<T> implements sequenceList原创 2020-06-22 12:30:00 · 985 阅读 · 0 评论 -
数据结构--线性表的概念以及相关操作
参考:《数据结构--Java语言描述》线性表的相关知识点:线性表,顺序表,链表(单向链表、双向链表、循环链表),头指针、头结点。概念:线性表是n个元素的有序序列,是最简单的数据结构,它具备线性结构的特点,并且表中的数据元素为同一种数据类型,元素之间存在着一种偶序关系。L = (a1, a2, …, ai,ai+1 ,…, an)线性表的特点:在数据元素的非空有限集中存在唯一的一个被称作“第一个”的数据元素 存在唯一的一个被称作“最后一个“的数据元素 除第一个之外,集合中每个数.原创 2020-06-22 10:10:30 · 270 阅读 · 0 评论 -
数据结构和算法的基本概念
参考:《数据结构-java语言描述》相关术语:数据、数据对象、数据元素、数据项、数据结构数据的逻辑结构数据的物理结构算法的五要素、时间复杂度、空间复杂度运用计算机处理数据时,必须解决的四个方面的问题:一)、如何高效的在计算机中方便、高效地表示和组织数据二)、如何在计算机存储器(内存和外存)中存储数据三)、如何对存储在计算机中的数据进行操作,可有哪些操作、如何实现这些操作以及对同一问题的不同操作方法进行评价四)、必须理解每一种数据结构的性能,以便选择一个适合于某..原创 2020-06-20 23:39:46 · 1307 阅读 · 0 评论