Java知识点精要总结(二)

Java知识点精要:

1.栈和队列?

答:栈是一个线性数据结构,栈是一个插入与删除操作都发生在同一端的有序列表,栈又称先进后出。栈的主要操作有推入和弹出操作。

栈的常见实现方式有:⑴数组实现⑵动态数组实现⑶链表实现。

数组实现的缺点有数组的创建前提是大小固定,因为对于插入元素元素来说,当数组饱和,继续插入会报错;

动态数组的实现:优点是数组的大小可以根据需求扩充,但是如何扩充?有两种方式,⑴当数组的元素N已经饱和时,继续插入元素时,将重新创建一个N+1的数组,将前面的数组复制到新创建的数组中,然后在这个数组中将元素插入到数组的尾端,当连续推入n个元素,假设数组的初始大小为1,则,需要执行的元素复制次数就是:1+2+3+4+..+n=O(n*n),即单次执行推入操作的操作时间为O(n).⑵当数组的元素N饱和时,继续执行插入元素,将重新创建一个2*N的数组,然后进行复制和插入,则当连续推入n个元素,假设数组的初始大小为1,则,需要执行的元素复制次数为:O(n),即单次执行推入操作的操作时间为O(1)。

链表实现:优点是每次操作需要的时间为O(1)。

栈的用途:⑴用于实现函数的调用⑵进行符号匹配⑶进行求后缀表达式的值⑷浏览器的后退动能;充当辅助数据结构(树的遍历)。

队列是一个线性数据结构,队列实现从一端插入,另一端删除的有序列表,即先进先出。

队列的实现方式有:⑴简单的循环数组实现⑵动态的循环数组实现⑶链表。

循环数组的实现:缺点是数组的大小问题,数组中已有的元素达到数组的最大的容量时,进行插入操作时,会出现异常。

2.优先级队列?

答:优先级队列是支持插入,删除操作的数据结构,优先级队列的处理顺序不一定与元素的入队顺序相同。如果键最小的元素优先级最高,即键最小的元素最先出队,则这样的优先级队列称为升序优先级队列,反之,如果键最大的元素优先级最高,即键最大的元素最先出队,则这样的优先级队列称为降序优先级队列。

3.线索二叉树,二叉搜索树(BST),平衡二叉搜索树(AVL)?

答:对于普通的二叉树遍历,它存在以下缺点:需要创建栈和队列来进行辅助,这样需要较多的存储空间,其次,由于二叉树中有很多NULL指针,则会浪费一些内存,最后,对于先序,中序,后序遍历,都很难根据某个节点寻找它的后继节点;因此,引入线索二叉树来解决上面的问题,可以将原来NULL指针所在的地方用来存放有用的信息,即用来存放其其前驱节点和后继节点,当该节点没有左侧子节点的时候,则根据其遍历顺序将该节点的前驱节点信息放入其中,同理,如果该节点没有右侧子节点的时候,则根据其遍历顺序将该节点的后继节点信息放入其中。

对于线索二叉树,我们添加指针,用来方便确定前驱和后继节点,但是对于其值,我们没有加以约束,因此当进行对特定数值进行查找时,它的时间复杂度会比较高,为了解决这个问题,我们引入二叉搜索树。二叉搜索树是在二叉树的基础上,对于其某个节点来说,其值大于左侧的任意节点的值,其值小于右侧任意节点的值,对于二叉搜索树来说,中序遍历会得到一个有序的数值序列。

对于线索二叉树,二叉搜索树,都存在一种情况,即斜树,这种情况下,对树的查找的时间复杂度会是O(n),因此为了降低复杂度,引入平衡二叉搜索树,平衡二叉树对子树的高度有所约束,即任意节点左,右子树的高度差的绝对值,最多是1。对平衡二叉搜索树来说,当对树进行插入或删除操作的时候,容易使树的结构发生变化,即不满足平衡二叉树的性质,这个时候需要进行必要的旋转操作来维持炳恒二叉树。

注意:堆,堆是具有特殊属性的树,堆的基本性质是,父节点的值必须大于/小于子节点,父节点不一定必须大于左子节点,小于右子节点,对于高度为h的堆来说,如果h>0,则所有的子节点必须位于第h或h-1层,而且必须填满左侧的位置,即堆必须是完全二叉树。当堆因为插入元素或删除元素而破坏堆的性质的时候,我们需要对其进行调整,即堆化。

4.编写算法,判断二叉树是不是二叉搜索树?

答:根据二叉搜索树的性质,我们很容易想到,只要判断每个节点大于其左侧子节点,小于右侧子节点便可以,但是这样的算法是不严谨的,错误的,正确的是我们需要判断其左子树中的最大节点是否小于该节点,并判断其右子树的最小节点是否大于该节点。

5.在包含几十亿个数字的大文件中,如何寻找最大的那10个数?(题目来自《程序员面试手册》)

答:对于寻找最大的n个元素,可以使用优先级队列。也可以将数据集分割成以n为单位的多个堆,并求出每个堆中的最大的10个元素,最后把各个堆中的最大元素汇集起来,执行堆排序,并返回最大的10个元素,问题在于对于每个堆中的最大元素的存储空间问题,改进为,首先把前1000个元素视为第一个集合,对集合做堆排序,把最大的10个元素与之后的990个元素合起来,视为第二个集合,并继续做堆排序,求最大的10个元素,以此类推,求出数据集中的前10个最大的元素。

 

 

内容参考《程序员面试手册》  以及加上自己的理解,如有问题,敬请指出,谢谢。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值