Java面试题-数据结构_数据结构面试-程序员宅基地

技术标签: Java  Java面试题  数据结构  Java面试宝典  

八大基本数据结构

数组

       数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。
       优点:
       1、按照索引查询元素速度快;
       2、按照索引遍历数组方便。
       缺点:
       1、数组的大小固定后就无法扩容了;
       2、数组只能存储一种类型的数据;
       3、添加,删除的操作慢,因为要移动其他的元素。
       适用场景: 频繁查询,对存储空间要求不大,很少增加和删除的情况。

       栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。栈常应用于实现递归功能方面的场景。

队列

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

链表

       链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
       优点:
       1、链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
       2、添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快。
       缺点:
       1、因为含有大量的指针域,占用空间较大;
       2、查找元素需要遍历链表来查找,非常耗时。
       适用场景:
       数据量较小,需要频繁增加,删除操作的场景。

       树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
       1、每个节点有零个或多个子节点;
       2、没有父节点的节点称为根节点;
       3、每一个非根节点有且只有一个父节点;
       4、除了根节点外,每个子节点可以分为多个不相交的子树。
       二叉树是树的特殊一种,具有如下特点:
       1、每个结点最多有两颗子树,结点的度最大为2;
       2、左子树和右子树是有顺序的,次序不能颠倒;
       3、即使某结点只有一个子树,也要区分左右子树;
       二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
       二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂,想学习的话还是需要花时间去深入的。

散列表

       散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。
       哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后新加了数组加红黑树的结构。

       堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
       堆中某个节点的值总是不大于或不小于其父节点的值;
       堆总是一棵完全二叉树。

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

树的三种遍历方式

先序遍历:根节点 →左子树 → 右子树
中序遍历:左子树 → 根节点 → 右子树
后序遍历:左子树 → 右子树 → 根节点

红黑树

       R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:

       (比较难理解,建议看专门介绍的文章)
       (1)每个节点或者是黑色,或者是红色;
       (2)根节点是黑色;
       (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!];
       (4)如果一个节点是红色的,则它的子节点必须是黑色的;
       (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点;
       红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。例如,Java集合中的TreeSet和TreeMap和Jdk1.8 HashMap部分情况。

红黑树为什么要自旋

       添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。

B树

       (比较难理解,建议看专门介绍的文章)
       B树(B-tree,B-树就是B树)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。
       B-树中所有结点中孩子结点个数的最大值成为B-树的阶,通常用M表示,从查找效率考虑,一般要求M>=3。如B-树孩子结点个数最多为4时,就是4阶B树。
       一棵M阶B-树或者是一棵空树,或者是满足以下条件的M叉树:
是一种多路搜索树(并不是二叉的):
       1.定义任意非叶子结点最多只有M个儿子;且M>2;
       2.根结点的儿子数为[2, M](不为空树时至少有两个);
       3.除根结点以外的非叶子结点的儿子数为[M/2, M];
       4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
       5.非叶子结点的关键字个数=指向儿子的指针个数-1;
       6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
       7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
       8.所有叶子结点位于同一层;

B+树

       B+树是对B树的一种变形树,它与B树的差异在于:
       1、有k个子结点的结点必然有k个关键码;
       2、非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中;
       3、树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lyhkmm/article/details/79978720

智能推荐

超详细保姆级ubuntu16.04源码安装autoware1.13.0_autoware1.13.0中qpoases文件-程序员宅基地

文章浏览阅读3k次,点赞6次,收藏46次。ubuntu16.04源码安装autoware.ai 1.13.0官网提供的autoware版本与ubuntu系统适配情况,作者使用ubuntu16.04,选择版本v1.13.0下图为官方适配表详见https://github.com/Autoware-AI/autoware.ai/wiki/Source-Build,本安装步骤按照官网步骤进行,期间遇到的一些坑也会指出作者已经安装完成ROS、QT5、CUDA9.0,未安装的请参考其他博客,在此不再赘述ROShttps://blog.csdn.ne_autoware1.13.0中qpoases文件

python PIL Image 图像处理基本操作_image.bicubic-程序员宅基地

文章浏览阅读3.8w次,点赞60次,收藏309次。1. 图片加载、灰度图、 显示和保存# Created by 牧野 CSDNfrom PIL import Imageimg = Image.open('01.jpg')imgGrey = img.convert('L')img.show()imgGrey.show()img.save('img_copy.jpg')imgGrey.save('img_gray.jpg')..._image.bicubic

使用Vue开发Chrome插件_vite+vue开发谷歌插件-程序员宅基地

文章浏览阅读6.4k次,点赞6次,收藏19次。原文链接:使用Vue开发Chrome插件 - 愧怍的小站 (kuizuo.cn)前言我当时学习开发Chrome插件的时候,还不会Vue,更别说Webpack了,所以使用的都是原生的html开发,效率就不提了,而这次就准备使用vue-cli来进行编写一个某B站获取视频信息,评论的功能(原本是打算做自动回复的),顺便巩固下chrome开发(快一年没碰脚本类相关技术了),顺便写套模板供自己后续编写Chrome插件做铺垫。关于Chrome插件开发的基本知识就不赘述了,之前写过一篇原生开发的Chrome._vite+vue开发谷歌插件

CPU微指令相关概念_时空无限 csdn-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏21次。第1章 微程序控制器微程序控制器是一种控制器,同组合逻辑控制器相比较,具有规整性、灵活性、可维护性等一系列优点,因而在计算机设计中逐渐取代了早期采用的组合逻辑控制器,并已被广泛地应用。在计算机系统中,微程序设计技术是利用软件方法来设计硬件的一门技术 。中文名 微程序控制器外文名 Microprogram controller基本思想 按照通常的解题程序的方法优 点 规整性、灵活性、可维护性设计技术 利用软件方法来设计硬件定 义 采用微程序控制方式的控制器1.1_时空无限 csdn

探索地图新维度:MapTR - 地图轨迹渲染神器-程序员宅基地

文章浏览阅读272次,点赞5次,收藏6次。探索地图新维度:MapTR - 地图轨迹渲染神器项目地址:https://gitcode.com/hustvl/MapTRMapTR 是一个开源的项目,由 hustvl 创建并维护。它提供了一个强大的工具,用于可视化和分析地理位置数据,特别是对于追踪数据(如GPS轨迹)的展示。无论你是地理信息系统的爱好者、开发者,还是需要处理大量轨迹数据的研究人员,MapTR 都将是你得力的助手。技术分析...

windows下通过钩子获取指定进程的鼠标按键消息_window 进程 鼠标钩子-程序员宅基地

文章浏览阅读280次。【代码】windows下通过钩子获取指定进程的鼠标按键消息。_window 进程 鼠标钩子

随便推点

委外PR的BOM清单导出_bom在pr-程序员宅基地

文章浏览阅读127次。委外PR的BOM清单导出_bom在pr

html table 个人简历demo_html table demo-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏20次。个人简历 个人简历 个人资料 姓 名: 婚姻状况: 照片 出 生: 政治面貌: _html table demo

麦克风灵敏度_mic灵敏度计算公式-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏12次。麦克风灵敏度,通常都是以负数形式呈现,比如-45db、-47db。麦克风灵敏度为何是负数呢?db是一个无量纲单位,因此就有一个参考系。麦克风0db的定义是:在1pa声压下,麦克风输出1V电压时为0db。计算公式如下:Lm=20lgVm/Vs,Vs=1v,Vm为麦克风在1帕时输出的电压。通常情况下,麦克风输出的电压都是mV级别,因此得到的Lm一般为负数。比如 -47db,对应的Vm值_mic灵敏度计算公式

Python 节省内存的循环写法 (一)_python循环读取文件的每一行 节省内存-程序员宅基地

文章浏览阅读470次。艺赛旗 RPA9.0全新首发免费下载 点击下载http://www.i-search.com.cn/index.html?from=line10 前言说到处理循环,我们习惯使用 for, while 等,比如依次打印每个列表中的字符:lis = [‘I’, ‘love’, ‘python’]for i in lis:print(i)输出:Ilovepython在打印内容字节数..._python循环读取文件的每一行 节省内存

解决!Mac在进行tensor board可视化时出现网址打不开的情况_训练可视化网址没反应-程序员宅基地

文章浏览阅读1.1k次。作为一个新手学习,我遇到很多问题(_训练可视化网址没反应

【精】TCP/IP协议简介(一) 之 TCP/IP简介_tcp/ip协议中,ip地址200.179.193.21属于什么地-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏4次。一、实验说明1. 环境登录无需密码自动登录,系统用户名 shiyanlou2. 环境介绍本实验环境采用 Ubuntu Linux 桌面环境,实验中会用到桌面上的程序:1.命令行终端: Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令;2.Gedit:简单、便捷的代码编辑器。3. 环境使用使用命令行终端运行所需命令进行操作,使用编辑器输入实验所需的代码及文件。“实验记_tcp/ip协议中,ip地址200.179.193.21属于什么地

推荐文章

热门文章

相关标签