2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Java面试题 - 数据结构与算法

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

时间:2023-05-02 20:28:09

相关推荐

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

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

【快速排序】

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

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

复杂度: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节点)。每个红节点的两个节点都是。(从每个叶到根的所有路径上不能有两个连续的红节点)从任节点到其每个叶的所有路径都包含相同数的节点。

这些规则保证了红树的平衡。

红树从根到叶的最长路径不会超过最短路径的2倍。

提寻址效率。

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

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:

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

结构:

HashMap扩容:

1、很简单的计算:由于默认的加载因是0.75 ,那么,此时map的阀值是 16*0.75 = 12,即添加第13个键值对<Key,Value>的时候,map的容量会扩充倍。

2、确实如此,但是为了尽可能第减少桶中的Entry<Key,Value>链表的长度,以提HashMap的存取性能,确定的这个经验值。如果读者你对存取效率要求的不是太,想省点空间的话,你可以new HashMap(int initialCapacity, float loadFactor)构造法将这个因设置得些也妨。

扩容步骤:

2. 为何扩容为原来的两倍(性能):

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

put流程:

a. 获取这个Key的hashcode值,根据此值确定应该将这对键值对存放在哪个桶中,即确定要存放桶的索引;

b.遍历所在桶中的Entry<Key,Value>链表,查找其中是否已经有了以Key值为Key存储的Entry<Key,Value>对象,

c1. 若已存在,定位到对应的Entry<Key,Value>,其中的Value值更新为新的Value值;返回旧值;

c2.若不存在,则根据键值对<Key,Value>创建个新的Entry<Key,Value>对象,然后添加到这个桶的Entry<Key,Value>

d.当前的HashMap的(即Entry<key,Value>节点的数)是否超过了阀值,若超过了阀值(threshold), 则增HashMap的容量(即Entry[] table 的),并且重新组织内部各个Entry<Key,Value>排列。

get流程:

a. 获取这个Key的hashcode值,根据此hashcode值决定应该从哪个桶中查找;

b.遍历所在桶中的Entry<Key,Value>链表,查找其中是否已经有了以Key值为Key存储的Entry<Key,Value>对象,

c1. 若已存在,定位到对应的Entry<Key,Value>,返回value c2. 若不存在,返回null;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。