精华内容
下载资源
问答
  • 结构
    千次阅读 多人点赞
    2021-01-06 22:58:12

    原创公众号:bigsai
    文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star

    前言

    数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,架构师他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低内存占用,在这里数据结构起到相当重要的作用。此外数据结构也蕴含一些面向对象的思想,故学好掌握数据结构对逻辑思维处理抽象能力有很大提升。

    为什么学习数据结构与算法?如果你还是学生,那么这门课程是必修的,考研基本也是必考科目。工作在内卷严重的大厂中找工作数据结构与算法也是面试、笔试必备的非常重要的考察点。如果工作了数据结构和算法也是内功提升一个非常重要的体现,对于程序员来说,想要得到满意的结果,数据结构与算法是必备功力!

    数据结构

    image-20201108002732048

    概念

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

    简言之,数据结构是一系列的存储结构按照一定

    更多相关内容
  • 数据结构:八大数据结构分类

    万次阅读 多人点赞 2018-09-05 18:23:28
    数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都...

    本文目录:

    数据结构分类

    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。
    常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
    这里写图片描述
    每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。

    1、数组

    数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。

    int[] data = new int[100];data[0]  = 1;
    

    优点:
    1、按照索引查询元素速度快
    2、按照索引遍历数组方便

    缺点:
    1、数组的大小固定后就无法扩容了
    2、数组只能存储一种类型的数据
    3、添加,删除的操作慢,因为要移动其他的元素。

    适用场景:
    频繁查询,对存储空间要求不大,很少增加和删除的情况。

    2、栈

    栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
    这里写图片描述
    栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。

    3、队列

    队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:
    这里写图片描述
    使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。

    4、链表

    链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
    这里写图片描述
    链表的优点:
    链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
    添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

    缺点:
    因为含有大量的指针域,占用空间较大;
    查找元素需要遍历链表来查找,非常耗时。

    适用场景:
    数据量较小,需要频繁增加,删除操作的场景

    5、树

    是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

    • 每个节点有零个或多个子节点;
    • 没有父节点的节点称为根节点;
    • 每一个非根节点有且只有一个父节点;
    • 除了根节点外,每个子节点可以分为多个不相交的子树;

    在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树
    这里写图片描述
    二叉树是树的特殊一种,具有如下特点:

    1、每个结点最多有两颗子树,结点的度最大为2。
    2、左子树和右子树是有顺序的,次序不能颠倒。
    3、即使某结点只有一个子树,也要区分左右子树。

    二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。

    扩展:
    二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂,想学习的话还是需要花时间去深入的。

    6、散列表

    散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。

    记录的存储位置=f(key)

    这里的对应关系 f 成为散列函数,又称为哈希 (hash函数),而散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。

    哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构,其示例图如下:
    这里写图片描述
    从图中可以看出,左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

    哈希表的应用场景很多,当然也有很多问题要考虑,比如哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃。

    7、堆

    堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:

    • 堆中某个节点的值总是不大于或不小于其父节点的值;

    • 堆总是一棵完全二叉树。

    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

    堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
    (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆,这两者的结构图可以用完全二叉树排列出来,示例图如下:
    这里写图片描述
    因为堆有序的特点,一般用来做数组中的排序,称为堆排序。

    8、图

    图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

    按照顶点指向的方向可分为无向图和有向图:
    这里写图片描述
    这里写图片描述
    图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构,这里不做展开,读者有兴趣可以自己学习深入。

    展开全文
  • java数据结构和算法(第二版)

    千次下载 热门讨论 2012-11-29 21:12:37
    数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类...
  • 数据结构——栈的详解

    万次阅读 多人点赞 2020-04-20 00:02:43
    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和...

    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。

    C语言中的栈

    栈的定义

    栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
    栈的示意图

    C语言中栈的基本操作

    栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈

    栈的初始化

    栈和线性表类似,也有两种存储表示方法顺序栈链栈,链栈的操作是线性表操作的特例,操作比较容易实现。顺序栈即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,top = 0表示空栈。由于栈在使用的过程中所需要的大小难以估计,所以通常是先为栈分配一个基本容量,然后再使用的过程中,当栈的空间不够使用的时候再继续追加存储空间。我们以下述类型说明作为顺序栈的定义:

    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    

    栈的初始化操作为:按照设定的初始分配量进行第一次存储分配,这里使用==malloc()==函数来分配存储空间。malloc()函数的详细说明请看:malloc详细说明。base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。top为栈顶指针,top的初值指向栈底。每当插入一个元素时top加1,弹出一个元素时top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上
    栈顶指针和栈中元素的关系图

    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    }
    

    判断是否为空栈

    当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。上面我们说到==base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。==所以我们可以这样判断栈是否为空:

    //判断是否为空栈
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    

    判断是否为满栈

    当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。因为我们定义了一个StackSize来表示当前已经分配的存储空间,所以我们可以用s.top - s.base 来算出当前已经使用的栈空间。所以当s.top - s.base == s.StackSize 时表示已经满栈:

    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    }
    

    入栈

    入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。realloc()函数详解请看realloc详解

    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后将栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    }
    

    出栈

    出栈时我们首先要判断栈是否为空栈。如果栈已经空了,则返回error。

    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    

    C语言实现栈的具体代码

    #include<stdio.h>
    #include<malloc.h>
    
    #define STACK_INIT_SIZE 100  //栈的初始容量 
    #define STACKINCREMENT 10    //容量增量
    #define OK 1 
    #define OVERFLOW -2
    typedef int SDataType;
    typedef int Status;
    
    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    
    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    } 
    
    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;  //系统会将原来的内容复制过来
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后使栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    } 
    
    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    
    //判断是否为空栈 
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    
    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    } 
    
    int main(){
    	SqStack s;
    	SDataType element;
    	
    	InitStack(s);  //初始化栈
    	//将1-5入栈
    	for(int i=1;i<=10;i++){
    		Push(s,i);
    	}
    	
    	judgeNull(s);
    	judgeFull(s);
    	
    	printf("出栈:\n");
    	//只要栈不为空 
    	while(s.top != s.base){
    		Pop(s,element);    //出栈的元素用e接收 
    		printf("%d ",element);
    	}
    	
    	printf("\n"); 
    	judgeNull(s);
    	
    	return 0;
    	 
    } 
    

    C++中的栈

    C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm >、<deque >、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中的<stack>就是栈。

    C++的STL已经将栈的操作都封装成了函数,我们只需要引进#include<stack>头文件即可使用。

    C++中栈的基本操作

    初始化

    我们可以直接使用stack<int> s;来创建一个空的 stack 对象。

    判断是否为空栈

    使用empty()函数来判断栈是否为空。
    empty()函数详解

    入栈

    使用push()函数来完成入栈操作。
    push()函数详解

    出栈

    使用pop()函数实现出栈
    pop()函数详解

    返回栈顶元素

    使用top()函数返回栈顶元素
    top()函数详解

    返回栈中元素数目

    使用size()函数返回栈中元素的数目。
    size()函数详解


    以上就是C语言和C++中栈的基本用法了,如果你觉得我的文章对你有用请点个赞支持一下吧,如果喜欢我写的文章那么请点个关注再走。
    嘿嘿
    下一篇将继续写数据结构的队列,后续将会再写一些有关栈和队列的具体应用。我是ACfun:一个成长中的程序猿,感谢大家的支持。

    展开全文
  • 数据结构:八种数据结构大全

    万次阅读 多人点赞 2021-07-29 12:36:10
    数据结构 1.1 数据结构概述 数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)...

    数据结构

    1.1 数据结构概述

    数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;

    在这里插入图片描述

    1.2 数据结构的分类

    1.2.1 排列方式

    1)集合

    集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;

    在这里插入图片描述

    2)线性结构

    线性结构:数据结构中的元素存在一对一的相互关系;

    在这里插入图片描述

    3)树形结构

    树形结构:数据结构中的元素存在一对多的相互关系;

    在这里插入图片描述

    4)图形结构

    图形结构:数据结构中的元素存在多对多的相互关系;

    在这里插入图片描述

    1.2.2 逻辑结构

    数据结构按逻辑上划分为线性结构非线性结构

    • 线性结构有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。

    典型的线性表有:链表、栈和队列。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外,每个结点都有唯一的前驱和唯一的后继,也就是所谓的一对一的关系。

    • 非线性结构:对应于线性结构,非线性结构也就是每个结点可以有不止一个直接前驱和直接后继。常见的非线性结构包括:树、图等。

    1.3 数据结构的实现

    1.2.1 数组

    • 数组(Array):数组是有序元素的序列,在内存中的分配是连续的,数组会为存储的元素都分配一个下标(索引),此下标是一个自增连续的,访问数组中的元素通过下标进行访问;数组下标从0开始访问;

    • 数组的优点是:查询速度快;

    在这里插入图片描述

    • 数组的缺点是:删除增加、删除慢;由于数组为每个元素都分配了索引且索引是自增连续的,因此一但删除或者新增了某个元素时需要调整后面的所有元素的索引;

    新增一个元素40到3索引下标位置:

    在这里插入图片描述

    删除2索引元素:

    在这里插入图片描述

    总结:数组查询快,增删慢,适用于频繁查询,增删较少的情况;

    1.2.2 链表

    • 链表(Linked List):链表是由一系列节点Node(也可称元素)组成,数据元素的逻辑顺序是通过链表的指针地址实现,通常情况下,每个节点包含两个部分,一个用于存储元素的内存地址,名叫数据域,另一个则指向下一个相邻节点地址的指针,名叫指针域;根据链表的指向不同可分为单向链表、双向链表、循环链表等;我们本章介绍的是单向链表,也是所有链表中最常见、最简单的链表;

    链表的节点(Node):

    在这里插入图片描述

    完整的链表:

    在这里插入图片描述

    • 链表的优点:新增节点、删除节点快;

    在链表中新增一个元素:

    在这里插入图片描述

    在单向链表中,新增一个元素最多只会影响上一个节点,比在数组中的新增效率要高的多;

    在链表中删除一个元素:

    在这里插入图片描述

    • 链表的缺点:
      • 1)查询速度慢,查询从头部开始一直查询到尾部,如果元素刚好是在最尾部那么查询效率势必非常低;
      • 2)链表像对于数组多了一个指针域的开销,内存相对占用会比较大;

    总结:数据量较小,需要频繁增加,删除操作的场景,查询操作相对较少;

    1.2.3 栈

    • 栈(Stack):是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出从栈顶放入元素的操作叫入栈(压栈),取出元素叫出栈(弹栈)。

    入栈操作:

    在这里插入图片描述

    出栈操作:

    在这里插入图片描述

    栈的特点:先进后出,Java中的栈内存就是一个栈的数据结构,先调用的方法要等到后调用的方法结束才会弹栈(出栈);

    1.2.4 队列

    • 队列(Queue):队列与栈一样,也是一种线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。队列的特点是先进先出,从一端放入元素的操作称为入队,取出元素为出队;

    在这里插入图片描述

    队列的特点:先进先出;

    1.2.5 树

    是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

    • 1)每个节点有0个或多个子节点;
    • 2)没有父节点的节点称为根节点;
    • 3)每一个非根节点有且只有一个父节点;
    • 4)除了根节点外,每个子节点可以分为多个不相交的子树;
    • 5)右子树永远比左子树大,读取顺序从左到右;

    树的分类有非常多种,平衡二叉树(AVL)、红黑树RBL(R-B Tree)、B树(B-Tree)、B+树(B+Tree)等,但最早都是由二叉树演变过去的;

    二叉树的特点:每个结点最多有两颗子树

    在这里插入图片描述

    1.2.6 堆

    • 堆(Heap):堆可以看做是一颗用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。

    在这里插入图片描述

    堆的特性:如果一个结点的位置为k,则它的父结点的位置为[k/2],而它的两个子结点的位置则分别为2k和2k+1。这样,在不使用指针的情况下,我们也可以通过计算数组的索引在树中上下移动:从arr[k]向上一层,就令k等于k/2,向下一层就令k等于2k或2k+1。

    堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆;

    (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1)满足前者的表达式的成为小顶堆(小根堆),满足后者表达式的为大顶堆(大根堆),很明显我们上面画的堆数据结构是一个大根堆;

    大小根堆数据结构图:

    在这里插入图片描述

    一般来说将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

    1.2.7 散列表

    • 散列表(Hash),也叫哈希表,是根据键和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。它利用数组支持按照下标访问的特性,所以散列表其实是数组的一种扩展,由数组演化而来。

    散列表首先需要根据key来计算数据存储的位置,也就是数组索引的下标;

    • HashValue=hash(key)

    散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。

    在这里插入图片描述

    在散列表中,左边是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

    1.2.8 图

    • 图(Graph):图是一系列顶点(元素)的集合,这些顶点通过一系列边连接起来组成图这种数据结构。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。

    图分为有向图和无向图:

    • 有向图:边不仅连接两个顶点,并且具有方向;
    • 无向图:边仅仅连接两个顶点,没有其他含义;

    在这里插入图片描述

    例如,我们可以把图这种数据结构看做是一张地图:

    地图中的城市我们看做是顶点,高铁线路看做是边;很显然,我们的地图是一种无向图,以长沙到上海为例,经过的城市有长沙、南昌、杭州、上海等地;那么从上海也可以按照原有的路线进行返回;

    在这里插入图片描述

    实现了图这种数据结构之后我们可以在此数据结构上做一些复杂的算法计算,如广度优先搜索算法、深度优先搜索算法等;

    • 广度搜索:搜索到一个顶点时,先将此顶点的所有子顶点全部搜索完毕,再进行下一个子顶点的子顶点搜索;

    在这里插入图片描述

    例如上图:以武汉为例进行广度搜索,

    1)首先搜索合肥、南昌、长沙等城市;

    2)通过合肥搜索到南京;

    3)再通过南昌搜索到杭州、福州,

    4)最终通过南京搜索到上海;完成图的遍历搜索;

    不通过南京搜索到杭州是因为已经通过南昌搜索到杭州了,不需要再次搜索;

    • 深度搜索:搜索到一个顶点时,先将此顶点某个子顶点搜索到底部(子顶点的子顶点的子顶点…),然后回到上一级,继续搜索第二个子顶点一直搜索到底部;

    在这里插入图片描述

    例如上图:以武汉为例进行深度搜索,

    1)首先搜索合肥、南京、上海等城市;

    2)回到武汉,进行第二子顶点的搜索,搜索南昌、杭州等地;

    3)回到南昌,搜索福州;

    4)回到武汉,搜索长沙;

    图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构。我们本次了解到这里即可;

    记得点赞!!!

    展开全文
  • 微软等数据结构+算法面试100题全部答案集锦

    万次下载 热门讨论 2011-10-15 00:28:43
    一年之前的10月14日,一个名叫July 的人在一个叫csdn 的论坛上开帖分享微软等公司数据结构+算法 面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法 算法之道的编程...
  • 图解!24张图彻底弄懂九大常见数据结构

    万次阅读 多人点赞 2020-05-24 22:23:36
    ​数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不...
  • 数据结构,计算机网络,数据库,计算机组成原理,操作系统这些在大学期间一定要掌握好来,因为现在互联网大厂面试都爱考察这些内容,一句话,计算机基础,yyds! 可能大家第一个问题是,这些课需要哪些先学? 讲真,...
  • 一、功能结构图 1定义 功能结构图就是按照功能的从属关系画成的图表,在该图表中的每一个框都称为一个功能模块。功能模块可以根据具体情况分得大一点或小一点,分解得最小功能模块可以是一个程序中的每个处理过程...
  • Python中的程序控制结构 顺序结构和选择结构

    千次阅读 多人点赞 2021-01-06 11:05:35
    程序控制结构Python中的程序控制结构1.程序中的组织结构2.顺序结构3.对象的布尔值4.分支结构4.1 单分支if结构4.2 双分支if...else结构4.3 多分支if...elif...else结构4.4 if语句的嵌套4.5 条件表达式5.pass空语句 ...
  • 冯诺依曼结构和哈佛结构

    千次阅读 多人点赞 2021-07-25 10:57:04
    全面理解冯诺依曼结构和哈佛结构 CPU采用的是哈佛结构还是冯诺依曼结构? 0. 前言 哈佛结构和冯诺依曼结构都是针对于CPU来说的。 1. 冯诺依曼结构 冯诺伊曼结构又称为普林斯顿体系结构,是一种将程序存储器和数据...
  • 书中深入分析了Oracle数据库体系结构,包括文件、内存结构以及构成Oracle数据库和实例的底层进程,利用具体示例讨论了一些重要的数据库主题,同时分析了数据库中的物理结构,如表、索引和数据类型,并介绍采用哪些...
  • 【数据结构】八种常见数据结构介绍

    万次阅读 多人点赞 2021-02-05 13:59:44
    数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的,但是我们可以使用指针等道具,构造出类似“树形”的复杂结构。下面介绍八个常见的数据结构
  • 数据结构核心原理与算法应用

    万人学习 2019-09-03 17:50:03
    数据结构”,编程者如果没有掌握数据结构与算法,就说明没有真正掌握程序设计的能力,也就是不没有真正的学会编程。 从编程的角度来看,数据结构与算法几乎是最朴素的基础知识了,这一关,是每一个立志当好程序员的...
  • 为什么要学数据结构

    万次阅读 多人点赞 2019-11-19 09:45:23
    一、前言 在可视化化程序设计的今天,借助于...1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
  • yolov5网络结构学习

    万次阅读 多人点赞 2021-04-19 14:21:13
    上图是yolov5s的网络结构,它是yolov5系列中深度最小、特征图宽度最小的网络。后面的m、l、x都是在此基础上不断加深、加宽的。 网络主要分为输入端、Backbone、Neck、Prediction四个部分。 它和yolov3主要不同的地方...
  • 软件体系结构表示系统的框架结构,用于从较高的层次上来描述各部分之间的关系和接口,主要包括构件、构件性质和构件之间的关系。 通过使用软件体系结构,可以有效地分析用户需求,方便系统的修改,以及减小程序构造...
  • 第十期安防弱电资料包内容后台有朋友问到计算机的拓扑结构,今天我们就来看下几种常见的计算机网络结构。拓扑结构一般指点和线的几何排列或组成的几何图形。计算机网络的拓扑结构是指一个网络的通信链路和结点的几何...
  • 分布式体系结构:非集中式结构

    万次阅读 2021-12-21 20:39:16
    分布式体系结构:非集中式结构前言什么是非集中式结构?Akka 集群Redis 集群Cassandra 集群对比分析知识扩展:如何优化 Gossip 协议中的重复消息问题?总结 前言 虽然很多云上的管理都采用了集中式结构,但是这种...
  • 数据结构1800题及答案.pdf

    热门讨论 2011-12-04 17:11:44
    9.以下数据结构中,哪一个是线性结构( )?【北方交通大学 2001 一、1(2 分) 】 A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串 10.以下那一个术语与数据的存储结构无关?( ) 【北方交通大学 2001 一、2(2 分) ...
  • 数据结构(C++语言版)课本带习题解析第三版
  • 图解数据结构与算法

    万人学习 2020-07-27 10:56:16
    【为什么学习数据结构与算法】     程序=数据结构+算法。数据结构和算法是程序的基础,没有系统地学习过数据结构和算法的程序员只能称作是coder,知道我们写的代码使用了什么数据结构,它的特征是什么。...
  • 一、结构化数据 结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据。一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。举一个例子: id name age gender 1...
  • 数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 为什么要学数据结构? 首先,因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你...
  • Abaqus 子结构分析 实例

    千次阅读 2020-05-18 18:40:54
    目 录一、前沿二、子结构部分的创建三、与主结构的合并四、计算结果的合并五、尾声 本文仅用于个人学习,除此之外,无其他任何用途,侵删。 一、前沿   本文以一四腿方桌为例,来介绍 Abaqus 子结构分析的...
  • 《画解数据结构》九张动图,画解顺序表

    万次阅读 多人点赞 2021-08-25 08:32:05
    本文已收录于专栏 《画解数据结构》 零、前言   目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券。   这篇文章,作者将用 「 七张动图 」 来阐述一种最基础...
  • 数据结构与算法(总结)

    万次阅读 多人点赞 2022-04-23 20:25:09
    逻辑结构分为集合结构、线性结构、树形结构、图形结构;物理结构分为顺序存储结构、链式存储结构。 三、算法是一系列运算步骤。算法有5个基本特性,输入、输出、有穷性、确定性、可行性;算法最求5个目标,正确性、...
  • 数据结构---C++版

    千次阅读 多人点赞 2020-02-11 13:45:11
    1.1 数据结构在程序设计中的作用 1)程序设计的实质是什么? 数据表示:将数据存储在计算机(内存)中 数据处理:处理数据,设计方案(算法) 1.2 计算机求解问题: 1)问题→抽象出问题的模型→求模型的解 问题——...
  • 什么是数据结构

    千次阅读 2019-06-19 20:25:39
    什么是数据结构?数据结构是什么? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,456,533
精华内容 3,382,613
关键字:

结构

友情链接: DHTML 手册.zip