0
点赞
收藏
分享

微信扫一扫

Java面试题 - 数据结构与算法

Just_Esme 2022-03-26 阅读 54
java后端

1. 说下种常的排序算法和分别的复杂度

【快速排序】

原理:快速排序采的是种分治的思想,它先找个基准数(般选择第个值),然后将这个基准数的数字都放到它的左边,然后再递归调,分别对左右两边快速排序,直到每边只有个数字.整个排序就完成了.

  1. 选定个合适的值(理想情况中值最好,但实现中般使数组第个值),称为“枢轴”(pivot)。
  2. 基于这个值,将数组分为两部分,较的分在左边,较的分在右边。
  3. 可以肯定,如此轮下来,这个枢轴的位置定在最终位置上。
  4. 对两个数组分别重复上述过程,直到每个数组只有个元素。
  5. 排序完成。

复杂度:O(n)

特点:快速排序是我们平常最常使的种排序算法,因为它速度快,效率,是最优秀的种排序算法.

【冒泡排序】

原理:冒泡排序其实就是逐较交换,进外两次循环,外层循环为遍历所有数字,逐个确定每个位置,层循环为确定了位置后,遍历所有后没有确定位置的数字,与该位置的数字进较,只要该位置的数字,就和该位置的数字进交换.

复杂度:O(n^2),最佳时间复杂度为O(n)

特点:冒泡排序在我们实际开发中,使的还是较少的.它更加适合数据规模较少的时候,因为它的效率是较低的,但是优点是逻辑简单,容易让我们记得.

直接插排序

原理:直接插排序是将从第个数字开始,逐个拿出来,插到之前排好序的数列.

复杂度:O(n^2),最佳时间复杂度为O(n)

直接选择排序:

原理:直接选择排序是从第个位置开始遍历位置,找到剩余未排序的数据最的,找到最的后,再做交换

复杂度:O(n^2)

特点:和冒泡排序样,逻辑简单,但是效率不,适合少量的数据排序。

2. java写个冒泡排序算法

在这里插入图片描述

3. 描述下链式存储结构

a. 线性结构的优点是可以实现随机读取,时间复杂度为O(1),空间利率,缺点是进插和删除操作时较麻烦,时间复杂度为O(n),同时容量受限制,需要事先确定容量,容量过,浪费空间资源,过不能满使要求,会产溢出问题。

b. 链式存储结构的优点主要是插和删除常简单,前提条件是知道操作位置,时间复杂度是O(1),但如果不知道操作位置则要定位元素,时间复杂度为O(n),没有容量的限制,可以使过程中动态分配的分配内存空间,不担溢出问题,但是它并不能实现随机读取,同时空间利率不。

4. 如何遍历一颗二叉树

在这里插入图片描述

树节点:
在这里插入图片描述
b. 递归先序遍历:先输出节点的值,再递归遍历左右树。中序和后序的递归类似,改变根节点输出位置即可。
在这里插入图片描述
c. 递归中序遍历:过程和递归先序遍历类似
在这里插入图片描述
d. 递归后序遍历:
在这里插入图片描述

5. 倒排个LinkedList

Collections.reverse(linkedList);

6. java写个递归遍历录下的所有件(directory.listFiles())

在这里插入图片描述

7. 叉树与红树

叉树

在这里插入图片描述
特性:

  • 左树上所有结点的值均于或等于它的根结点的值。
  • 右树上所有结点的值均于或等于它的根结点的值。
  • 左、右树也分别为叉排序树。

查找:

  • 分查找(通过层层的较来查找位置):如查找值为10的节点:9–13–11–10

缺陷:

  • 插容易变成线性形态,查找性能打折扣,这时需要引红树来解决

红黑树
在这里插入图片描述

特点:是种平衡的叉查找树,除了符合叉树的特点之外,还符合以下点:

  • 节点是红或。
  • 根节点是。
  • 每个叶节点都是的空节点(NIL节点)。
  • 每个红节点的两个节点都是。(从每个叶到根的所有路径上不能有两个连续的红节点)
  • 从任节点到其每个叶的所有路径都包含相同数的节点。

添加删除:通过旋来保证平衡

8. b-tree、b+tree多叉树

b-tree(件系统)

B树也称B-树,它是颗多路平衡查找树。我们描述颗B树时需要指定它的阶数,阶数表示了个结点最多有多少个孩结点,般字m表示阶数。当m取2时,就是我们常的叉搜索树。

定义:

  • 1)每个结点最多有m-1个关键字。
  • 2)根结点最少可以只有1个关键字。
  • 3)根结点少有Math.ceil(m/2)-1个关键字。
  • 4)每个结点中的关键字都按照从到的顺序排列,每个关键字的左树中的所有关键字都于它,右树中的所有关键字都于它。
  • 5)所有叶结点都位于同层,或者说根结点到每个叶结点的度都相同。
    在这里插入图片描述
    插数据,向兄弟节点借,兄弟节点不够则向节点借;

b+tree(mysql索引)

定义:

  • 1)B+树包含2种类型的结点:内部结点(也称索引结点)和叶结点。根结点本身即可以是内部结点,也可以是叶结点。根结点的关键字个数最少可以只有1个。
  • 2)B+树与B树最的不同是内部结点不保存数据,只于索引,所有数据(或者说记录)都保存在叶结点中。
  • 3)m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个树),阶数m同时限制了叶结点最多存储m-1个记录。
  • 4)内部结点中的key都按照从到的顺序排列,对于内部结点中的个key,左树中的所有key都于它,右树中的key都于等于它。叶结点中的记录也按照key的排列。
  • 5)每个叶结点都存有相邻叶结点的指针,叶结点本身依关键字的顺序链接。

在这里插入图片描述

9. 谈谈数据结构,如TreeMap

TreeMap实现了红树的结构。

10. 图的深度遍历和度遍历

1、深度优先遍历:
在这里插入图片描述

2、度优先遍历:
在这里插入图片描述

11. 介绍下红树、叉平衡树

12. 说说java集合,每个集合下有哪些实现类,及其数据结构。

HashMap:

在这里插入图片描述

  1. 在HashMap内部,采了数组+链表的形式来组织键值对Entry<Key,Value>(利数组的查询快+链表的插删除快)
  2. HashMap在存储键值对Entry<Key,Value>的时候,会根据Key的hashcode值,以某种映射关系,决定应当将这对键值对Entry<Key,Value>存储在HashMap中的什么位置上
  3. 在JDK1.7进多线程put操作,之后遍历,直接死循环,CPU飙到100%,在JDK 1.8中进多线程操作会出现节点和value值丢失,为什么JDK1.7与JDK1.8多线程操作会出现很不同,是因为JDK 1.8的作者对resize法进了优化不会产链表闭环。

结构:
在这里插入图片描述

HashMap扩容:
在这里插入图片描述

扩容步骤:
在这里插入图片描述
2. 为何扩容为原来的两倍(性能):

  • 在HashMap通过键的哈希值进定位桶位置的时候,调了个indexFor(hash, table.length在这里插入图片描述
  • 通过限制length是个2的幂数,h & (length-1)和h % length结果是致的。
  • 如果length是个2的幂的数,那么length-1就会变成个mask, 它会将hashcode低位取出来,hashcode的低位实际就是余数,和取余操作相,与操作会将性能提升很多。

put流程:

get流程:

举报

相关推荐

0 条评论