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

智能推荐

芯片解密STM8S903K3/STM8S003F3破解意法单片机程序提取_stm8s003f3程序提取-程序员宅基地

文章浏览阅读8.8k次。原文地址::http://blog.sina.com.cn/s/blog_148f658a00102vqdd.htmlSTM8S系列芯片解密已成为了热门行业,本工作室长期研究并提供各种型号STM8S系列芯片解密。不仅解密速度快,当天提供芯片解密后的程序,并可提供STM8S系列芯片解密后的反汇编。  ◆芯片简介  意法半导体(ST)再次扩大8位微控制器的产品阵_stm8s003f3程序提取

在 CentOS 1804 中 修改 MySQL 密码策略-程序员宅基地

文章浏览阅读466次。相关链接:在 CentOS 1804 中 使用 yum 安装 MySQL 5.7 最新版在 CentOS 1804 中 安装 MySQL 5.7.20 (或任意MySQL版本)在 CentOS 1804 中 修改 MySQL 密码策略在 CentOS 中 开启 MySQL 的 3306 端口在不打开 MySQL 3306 端口的情况下,使用 Navicat 进项远程连接(使用2...

计算机专业ic设计,ic设计是什么专业_IC设计的设计方法-程序员宅基地

文章浏览阅读2.2k次。ic设计是什么专业IC专业就是集成电路设计专业。集成电路设计,是电子工程学和计算机zhi工程学的一个学科,其主要内容是运用专业的逻辑和电路设计技术设计集成电路(IC)。IC设计涉及硬件软件两方面专业知识。集成电路设计涉及对电子器件(例如晶体管、电阻器、电容器等)、器件间互连线模型的创建。所有的器件和互连线都需安置在一块半导体衬底材料之上,这些组件通过半导体器件制造工艺(例如光刻等)安置在单一的硅衬..._ic设计有哪些方法?

Hadoop集群环境搭建——文件上传_hadoop 图片上传-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏18次。实验内容Hadoop由Apache基金会开发的分布式系统基础架构,是利用集群对大量数据进行分布式处理和存储的软件框架。用户可以轻松地在Hadoop集群上开发和运行处理海量数据的应用程序。Hadoop有高可靠,高扩展,高效性,高容错等优点。Hadoop 框架最核心的设计就是HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce为海量的数据提供了计算。此外,Hadoop还包括了Hive,Hbase,ZooKeeper,Pig,Avro,Sqoop,Flume,Mahout等项目。(摘_hadoop 图片上传

史上最全Redis面试题及答案-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏93次。在网上看到有关Redis的50道面试题目,但是没有给出答案,之前我也在寻找这份试题的答案,特地把答案分享出来。有需要的可以看看咯花了大量时间整理了这套Redis面试题首发50题,绝无仅有,从入门到精通从基础,高级知识点,再到集群,运维,方案…弄明白了这些题可以说可以成为面霸了面试官都得折服,Redis学得怎么样,都来检验下吧..._redis面试题

随便推点

基于FPGA的cameralink编解码测试系统设计_基于fpga的cameralink编码测试系统设计-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏15次。1、目的项目需要设计一个多功能参数可变的cameralink相机视频接收机,接收到相机传过来的视频数据通过PCIE往上位机发。开始没有可供测试的相机,于是想着用FPGA模拟cameralink协议自行写一个视频发送机,用于对接自己的设计的cameralink视频接收机;采用两块FPGA板对接,用lvds差分信号传输数据;发送机实现FPGA对视频数据的cameralink协议编码;接收机实现FPGA对视频数据的cameralink协议解码;接收到的数据是:portA,portB,por_基于fpga的cameralink编码测试系统设计

java项目中使用dubbo实战_dubbo使用java-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏7次。在java项目中使用dubbo的实战事例。_dubbo使用java

IDA pro 安装keypatch插件_ida fail to load the dynamic library.-程序员宅基地

文章浏览阅读8.9k次,点赞3次,收藏7次。IDA pro 7.5 安装keypatch插件前言一、安装过程二、出现问题前言本篇记录IDA pro 7.5 安装keypatch插件。缺少相应库,无法加载keypatch插件:"fail to load the dynamic library"一、安装过程安装好python环境后,安装 keystone。 (网址:https://www.keystone-engine.org/download/)pip install keystone-engine # 安装pip inst_ida fail to load the dynamic library.

【Unity】绘制阿基米德螺旋线-程序员宅基地

文章浏览阅读2.6w次,点赞9次,收藏23次。阿基米德螺旋线公式: //极坐标方程为: r = a + bθ //平面笛卡尔坐标方程式为: x = (a + bθ)cos(θ), y = (a + bθ)sin(θ) //a: 当θ=0°时的极径(mm) //b: 阿基米德螺旋线系数(mm/°),表示每旋转1度时极径的增加/减小量 //θ: 极角,单位为度,表示阿基米德螺旋线转过的总度数(弧度)......_阿基米德螺旋线

C++贪心算法之均分纸牌_粮食均分c++-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏14次。均分纸牌题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。_粮食均分c++

编辑器之战_vi 有两个模式 :“不停地哔哔叫”和“搞砸一切”。-程序员宅基地

文章浏览阅读631次。编辑器之战 是指计算机编程领域内,两类文本编辑器vi(以及衍生版本)和Emacs用户之间的对抗冲突。这已经成为黑客文化和自由软件社区文化的一部分。战火在两群用户之间多次点燃,他们互相蔑视,坚信自己的选择才是最完美的。相比其他的IT领域战争(如浏览器大战、操作系统之争、编程语言之争、代码缩进风格之战),编辑器的选择其实通常只是个人问题。vi与Emacs的不同vi与Emacs之间最_vi 有两个模式 :“不停地哔哔叫”和“搞砸一切”。

推荐文章

热门文章

相关标签