数据结构
文章平均质量分 90
ldd儆儆
这个作者很懒,什么都没留下…
展开
-
几个写链表代码技巧
1.理解指针或引用的含义我们知道,有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,实际上,它们的意思都是一样的,都是存储所指对象的内存地址。接下来,我会拿 C 语言中的“指针”来讲解,如果你用的是 Java 或者其他没有指针的语言也没关系,你把它理解成“引用”就可以了。实际上,对于指针的理解,你只需要记住下面这句话就可以了:将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了原创 2021-09-20 16:19:09 · 112 阅读 · 0 评论 -
数据结构-链表
1.前言数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。2.常见的链表种类1.单链表刚刚讲到,链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每原创 2021-09-20 16:08:56 · 138 阅读 · 0 评论 -
数据结构-数组
1.如何实现随机访问?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。连续的内存空间和相同类型的数据正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随原创 2021-09-20 14:58:37 · 574 阅读 · 0 评论 -
最好、最坏、平均、均摊时间复杂度
一、最好、最坏情况时间复杂度在一个无序的数组(array)中,查找变量 x 出现的位置。如果没有找到,就返回 -1。按照之前说的,这段代码的复杂度是 O(n),其中,n 代表数组的长度// n 表示数组 array 的长度int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) pos = i; } return pos;原创 2021-09-20 14:22:26 · 445 阅读 · 0 评论 -
时间和空间复杂度
一、时间和空间复杂度出现的意义1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度提到时间复杂度,我们就会想,我把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。为什么还要做时间、空间复杂度分析呢?这种分析方法能比我实实在在跑一遍得到的数据更准确吗?是的,事实上也是可以这样的,很多书籍把这种方法叫做:事后统计法,但是有原创 2021-09-20 12:15:07 · 117 阅读 · 0 评论 -
实现一个栈的逆序,只能使用递归和栈本身实现
步骤1.首先定义俩个方法,一个是getLastPeek方法,主要作用通过递归得到栈底元素。package stack1;import java.util.Stack;public class Reverse { public static void main(String[] args) { Stack<Integer> stack = new St...原创 2019-03-29 10:33:29 · 190 阅读 · 0 评论 -
图的存储方式
前言1.图的存储方式其实有很多,我们也可以根据自己的需求选择一种合适的存储方式,一般的存储方式有,邻接矩阵,邻接表,十字链表等。1.邻接矩阵如图所示,右侧是使用邻接矩阵的结果我们会发现,无向图的...翻译 2019-04-09 20:08:15 · 141 阅读 · 0 评论 -
图的相关概念
1.图 :图是由定点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)G表示一个图(Graph),V(Vertex) 是图G中顶点的集合,E(Edage)是图G中边的集合。数据元素不同的表示:线性表中称之为元素树中称之为结点图中称之为顶点线性表中,无数据元素称之为空表树中无结点称之为空树图,一般情况下强调顶点集合V要又穷非空线性表中,相邻的数据元素之间具...原创 2019-04-11 16:25:05 · 874 阅读 · 0 评论 -
树的基本概念和存储
与树相关的概念性质树:n(n>=0)个节点的有限集合,n=0为空树。在任意一个非空树中,有且只有一个被称之为根节点的节点n>1时,其余节点可分为m(m>0)个互不相交的有限集合 T1 . …Tm ,其中每一个集合本身又是一棵树,并称之为子树。A为root节点即为根节点节点:树是由有限个元素组成的集合,每人元素都称作一个节点孩子:节点子树的跟,相应,该节点称之为孩子的双...原创 2019-03-28 20:09:58 · 224 阅读 · 0 评论 -
树,森林,二叉树之间的转换以及 树,森林的遍历
普通树 树转换为二叉树1.树中的所有的兄弟节点之间加上一条线2.对每个节点,除了保留与其长子的连线外,去掉该节点与其他孩子的连线。将下图普通的树,转换为二叉树1.树中的所有的兄弟节点之间加上一条线2.对每个节点,除了保留与其长子的连线外,去掉该节点与其他孩子的连线。经过简单转变:森林转换为二叉树1.现将森林中的每颗树转换为二叉树2.再将各个二叉树的根节点视为兄弟从左...原创 2019-03-29 17:16:59 · 1173 阅读 · 0 评论 -
数据结构之栈
栈的相关概念1.数据结构中的栈是一种线性数据结构。了解完后栈,你会发现,栈是一种被"限制"的数组。之所以是被“限制”,是因为栈只有一个出口,这是它的一个最为显著的特征。2.我们从栈中取数据必须从那一端取,而在取数据的端口被称之为栈顶2.栈的数据的进出策略是采取“先进后出”即 Last In First Out(LIFO)的方法。即先进来的数据,后出去。栈的应用对于以上讲述的栈的特性,...原创 2019-03-26 18:44:57 · 130 阅读 · 0 评论 -
二分搜索树的相关知识
前言为什么要使用二叉搜索树?我们知道对于查找某一组中的一个数据,如果是一组有序数据,我们可以通过折半查找,插值查找,斐波那契查找等查找算法。但是,对于一组无序的数据,上述的方法则不再适用。二分搜索树的作用就来了。那么我们从复杂度进行分析,如果是对于无序的数据进行添加,删除,查找等操作普通数组(无序)均是O(n)普通数组(有序)查找logn 删除,添加均是O(n)...原创 2019-03-30 19:08:43 · 154 阅读 · 0 评论 -
队列简单介绍
队列概述1.队列和之前讲到的栈其实原理是非常相似的。2.与队列不同的是,队列是采取的是“先进先出”的策略。就比如我们生活中排队领取东西一样,排在最前面的人最先得到东西。循环队列为什么要循环队列?1.当我们不使用循环队列时,当我们使用数组去实现队列的时候,,如果不移动,随着数据的不断读写,会出现假满队列的情况。即尾数组已满但头数组还是空的。针对以上情况,也可以采取一些策略,比如可以自己实现...原创 2019-03-26 20:29:44 · 274 阅读 · 0 评论 -
AVL相关知识
前言1.今天我们要介绍一种特殊的树—>平衡二叉树,英文名字AVLAVL是G. M. Adelson-Velsky 和E. M. Landis两人名字中的字母二人在1962年的论文中首次提出的平衡二叉树的,是最早的最平衡的二分搜索树结构。如图所示,是一棵二分搜索树,但是仔细一看是不是有点别扭?试想一下。如果要查找34,是不是得从根节点开始左右子树进行遍历,但是,右子树只有一个节点,...原创 2019-03-31 18:30:07 · 255 阅读 · 0 评论 -
栈面试题实现查找最小栈元素
1.实现一个特殊的栈,在栈的基本功能基础上,再实现返回栈中最小元素的的操作getMin。要求1.pop,push,getMin操作的时间复杂度为O(1)2.设计的栈类型可以使用现成的栈类型。解决方法1:以栈内元素 3,4,1,2,5为例 依次入栈记住一个基本规则,只有当前数小于等于StackMin栈顶元素时,该数才可以放入StackMin步骤:3 入栈 , StackMin...原创 2019-03-28 17:10:34 · 534 阅读 · 0 评论 -
栈面试题通过俩个栈实现队列功能
步骤:1利用栈的“先进后出的功能”,将数据依次入栈stack12.将stack1元素依次出栈,依次进入stack23.将stack3依次出栈原创 2019-03-28 17:20:09 · 126 阅读 · 0 评论 -
栈面试题之实现栈内元素降序排列
题目:一个栈中元素为整型,现将该栈元素从大打小排序,只能允许申请一个栈,除此之外也可以申请别的变量,但是不能额外的申请数据结构。本题中数据为 3 2 5 1 4思路:将stack栈顶元素**(此时已经出栈)**和辅助栈栈顶元素进行比较,如果stack栈顶元素小于等于辅助栈栈顶元素,则将该元素进入辅助栈中如果stack栈顶元素小大于辅助栈栈顶元素,将辅助栈中的元素(出栈)...原创 2019-03-28 18:19:38 · 608 阅读 · 0 评论 -
二叉树的相关知识
二叉树概念二叉树是n(n>=0)个节点的有限集合,该集合或者为空集(即空二叉树),或者有一个根节点和俩棵互不相交的,分别称为根节点的左右子树组成,如图所示:Note:1.二叉树的每个结点的度<=22.左右子树是有顺序的,次序不能够颠倒。下面是俩棵不同的二叉树二叉树的性质:1.在二叉树的底n层中,至多有2^(n-1)个结点(n>0)2.深度为k的二叉树至多有...原创 2019-03-29 15:34:32 · 300 阅读 · 0 评论