Java常见八股-(6.算法+实施篇)

Java常见八股-(1.Java基础篇)

Java常见八股-(2.Java高级篇)

Java常见八股-(3.MySQL篇)

Java常见八股-(4.前端篇)

Java常见八股-(5.框架篇)

目录

一、算法与数据结构

[1. 算法](#1. 算法)

1.1你知道哪些算法,说下你了解的排序算法

1.2谈一下递归

1.3栈和队列的区别

1.4二叉排序树了解吗

1.5在堆中查找一个数字用什么方法可以快速查到

1.6递归和迭代的区别

[2. 数据结构](#2. 数据结构)

2.1什么是堆和栈,说一下堆栈的区别?

2.2用过什么树结构

[2.3 B树,B+树哪个用的比较多](#2.3 B树,B+树哪个用的比较多)

二、实施

[1. Linux](#1. Linux)

1.1谈一下对Linux的了解

[1.2 Linux如何查看文件内容](#1.2 Linux如何查看文件内容)

[1.3 Linux如何删除文件内容](#1.3 Linux如何删除文件内容)

[1.4 Linux切换目录命令](#1.4 Linux切换目录命令)

[1.5 Linux创建文件命令](#1.5 Linux创建文件命令)

[1.6 linux中搜索文件命令](#1.6 linux中搜索文件命令)

[1.7 Linux的部署](#1.7 Linux的部署)

[1.8 linux 中 vim](#1.8 linux 中 vim)

[1.9 Linux文件分页查看指令](#1.9 Linux文件分页查看指令)


一、 算法与数据结构

1. 算法

1.1 你知道哪些算法 说下你了解的排序算法

1、冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

2、选择排序(Selection Sort)

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

3、插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

4、希尔排序(Shell Sort)

1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

5、归并排序(Merge Sort)

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

6、快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

7、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

8、计数排序(Counting Sort)

计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

9、桶排序(Bucket Sort)

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

10、基数排序(Radix Sort)

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

1.2 谈一下递归

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

1.3 栈和队列的区别

栈(Stack)和队列(Queue)是两种常见的线性数据结构.

主要区别:

操作原则:栈遵循后进先出(LIFO),而队列遵循先进先出(FIFO)。

操作位置:栈的操作只在栈顶进行,而队列的插入操作在队尾进行,删除操作在队头进行。

应用场景:栈常用于处理需要反向处理的数据运算,如递归调用和表达式求值;队列则更多用于消息传递和任务调度等场景。

1.4 二叉排序树了解吗

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree)或二叉搜索树,是一种数据结构,主要用于存储数据并支持高效的查找、插入和删除操作‌‌。

二叉排序树是一种特殊的二叉树,满足以下性质:

  1. ‌空树‌:若左子树不空,则左子树上所有结点的值均小于根结点的值。
  2. ‌右子树‌:若右子树不空,则右子树上所有结点的值均大于根结点的值。
  3. ‌递归性质‌:左、右子树也分别为二叉排序树‌

1.5 在堆中查找一个数字用什么方法可以快速查到

堆排序

1.6递归和迭代的区别

定义和结构

  • 递归 ‌:****递归是一种通过函数自己调用自己的编程技巧。****它通常将一个大问题分解为更小的子问题,通过不断调用自身来解决。递归算法包括递归定义和基本情况,递归函数会反复调用自身,每次处理一个子问题,直到达到基本情况为止。‌
  • 迭代 ‌:迭代是通过循环结构重复执行某段代码,每次迭代使用上一次的结果作为下一次的初始值。迭代不需要函数调用栈空间,因此通常比递归更高效。‌

时间复杂度

  • 递归 ‌:递归的时间复杂度通常较高,因为每次函数调用都会增加栈空间的开销。对于一些递归算法,随着问题规模的增加,递归调用的次数可能会呈指数增长,导致时间复杂度急剧上升。‌
  • 迭代 ‌:迭代的时间复杂度通常较低,因为它不需要额外的函数调用开销。迭代通过循环结构逐步逼近目标,适合处理大规模数据问题。‌

适用场景

  • 递归 ‌:递归适合解决那些可以分解成相似子问题的问题,如树形结构的遍历、计算斐波那契数列等。递归的优点在于代码简洁,但缺点是可能导致栈溢出,特别是在深度递归的情况下。‌
  • 迭代 ‌:迭代适合处理需要逐步逼近目标的问题,如计算数组中所有数字的和。迭代的优点是效率高、稳定,缺点是代码可能较冗长,不易理解。‌

优缺点总结

  • 递归 ‌:
    • 优点 ‌:代码简洁、易于理解
    • 缺点 ‌:效率较低,可能导致栈溢出,特别是在深度递归的情况下。‌3
  • 迭代 ‌:
    • 优点 ‌:效率高、稳定,适合处理大规模数据问题。
    • 缺点 ‌:代码较长,不易理解

2. 数据结构

2.1 什么是堆和栈,说一下堆栈的区别?

功能方面:堆是用来存放对象的,栈是用来执行程序的。

共享性:堆是线程共享的,栈是线程私有的。

空间大小:堆大小远远大于栈

2.2 用过什么树结构

在编程和计算机科学中,常用的树结构包括二叉树二叉搜索树AVL树红黑树B-tree等‌。这些树结构各有其特点和适用场景。

二叉树

二叉树是最基础的树结构之一,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树有多种类型,包括完全二叉树、满二叉树和平衡二叉树等。二叉树在各种算法中都有广泛应用,例如在堆排序优先队列中‌12。

二叉搜索树

二叉搜索树是一种特殊的二叉树,其每个节点的左子树上的所有节点值都小于该节点的值,而右子树上的所有节点值都大于该节点的值。这种结构使得在二叉搜索树中查找、插入和删除节点变得非常高效。AVL树和红黑树都是自平衡的二叉搜索树,它们通过保持树的平衡来优化查找、插入和删除操作的效率‌13。

AVL树

AVL树是一种自平衡的二叉搜索树,其每个节点的左子树和右子树的高度最多相差1。为了保持平衡,当插入或删除节点时,可能需要通过旋转节点来重新平衡树。AVL树的查找、插入和删除操作的平均时间复杂度为O(log n)‌13。

红黑树

红黑树也是一种自平衡的二叉搜索树,每个节点都有颜色属性,可以是红色或黑色。红黑树的平衡特性保证了其高效的查找、插入和删除操作。红黑树的性质包括根节点是黑色、每个叶节点(NIL或空节点)是黑色、红色节点的子节点必须是黑色等‌13。

B-tree

B-tree是一种多路平衡搜索树,适用于磁盘或其他直接访问辅助设备。B-tree能够保持数据有序,并且广泛应用于数据库和文件系统中。

2.3 B树,B+树 哪个 用的比较多

B+树

‌B+树是B树的变体,是一种自平衡的树数据结构,在数据库系统中使用得更为广泛 B+树中所有实际数据都存储在叶子节点中,而非叶子节点仅用于索引。这种设计使得B+树在处理大量数据时能够显著提高查询效率 ,尤其是在范围查询方面表现优异 。B+树的叶子节点之间通过链表连接,便于区间查找和遍历。因此,B+树广泛应用于关系型数据库的索引

二、实施

1. Linux

1.1 谈一下对Linux的了解

一种支持多用户,多任务,多平台,内核免费的操作系统。

1.2 Linux如何查看文件内容

文件内容不足一页可以用cat

两页以上建议使用more或less

查看前几行用head,查看后几行用tail

从最后一行开始查看用tac

1.3 Linux如何删除文件内容

利用vi file.txt打开文件进行编辑

按下"i"键进入编辑模式,然后选择要删除的内容并按下"x"键删除

完成后按下"Esc"键退出编辑模式,再输入":wq"保存并退出

1.4 Linux切换目录命令

cd

1.5 Linux创建文件命令

touch

1.6 linux中搜索文件命令

which搜索可执行文件

whereis搜索可执行文件,源文件,帮助文档

locate和find可以搜索各种类型文件

1.7 Linux的部署

安装Linux系统,安装时需要指定超级管理员和普通用户的账户密码

配置Linux网络

根据业务需要配置防火墙

配置Linux图形化客户端如finalshell

配置Linux图形化文件传输工具winscp

1.8 linux 中 vim

vi作为Linux系统默认的编辑器,vim是vi的升级版,两者最大区别就是编辑一个文本时vi不会显示颜色,而vim会显示颜色。显示颜色更便于用户进行编辑,但其他功能没有太大的区别。

vim有三种工作模式

(一)命令模式:控制光标移动,可对文本进行复制、粘贴、删除等工作。

(二)编辑模式(输入模式):正常的文本录入。

(三)末行模式:保存或退出文档,以及设置编辑环境。

1.9 Linux文件分页查看指令

more或less