初试倒数第二,复试第二,成功上岸
文章目录
- 计算机网络
-
- OSI七层模型
-
- 基本介绍
-
- 物理层
- 数据链路层
- 网络层
- 传输层:
- 会话层
- 表示层
- 应用层
- 物理层
-
- 信息交互方式
- 信道复用
- 虚电路
- 数据链路层 局域网
-
-
-
-
- CSMA/CD
-
-
- PPP协议
- 下一次跳(网关)
-
- 网络层
-
-
-
-
- 路由器
-
-
- MAC地址、IP地址、子网掩码、网关
- ARP协议
- RARP
- Ip协议
- ICMP协议
-
- 传输层
-
- UDP协议
- TCP协议
- HTTP请求
-
-
-
- 无状态:
-
- ssh
-
-
- 设计模式
-
- 设计原则
- 单例模式
- 工厂模式
- 适配器模式(Adapter Pattern)
- 计算机组成原理
-
- Q:TLB与cache与内存的区别
- 操作系统
-
- 进程和程序
- 进程和线程
-
- 不同于线程
- 多线程和多过程的区别
- 微内核
- DMA和中断
-
- 区别
- 硬中断和软中断
-
- 软中断
- 硬中断
- 什么是操作系统?
-
- 组成
- 使用的数据结构
- 系统调用过程
- 虚拟存储器
- 存储器管理
- 解释分段和分页的区别
- 什么是 TLB
- 程序装入模式
- 程序链接
- 交换技术,覆盖技术
- 内存连续分配管理方式
- 拼接技术
- 原子操作
- 常用的存储保护方法
- 页表
- 段寄存器
- 作业和进程
- 分段和分页
- FCB文件控制块
- 数据结构
-
- 哈希
- 堆排序
- C的结构体
- 哈夫曼树,
- 非连通图
- B树B 树
-
- B树
- B 树
- 最短路径
-
- 迪杰斯特拉算法
- Floyd算法
- 排序算法
-
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并算法
- 快速排序
- 堆排序
- 基数排序
- 计数排序
- 时间复杂度
- 循环队列
- 二叉排序树的搜索过程
- 哈夫曼树
- 深度优先搜索遍历
- 广度优先搜索遍历
- 迪杰斯特拉算法
- 链表搜索元素
- 图的存储方式
- 图
- 二叉树
- 堆
- 循环队列
- 拓扑排序
- 非连通图
- 专业课面试问题
-
- 信息安全
- 网络安全有哪些方面?
-
- 密码学
- 渗透测试
- Web安全
- 网络信息安全
- 身份认证
- 编译原理
- 堆与堆的区别
-
- 栈
- 堆
- Docker和KVM
- java和c
- C和C
-
-
-
- 1.构造函数:
- 2.分析函数:
- 垃圾回收
-
-
- 过程调用
- 编译原理
-
-
- 词法分析器
- 语法分析器
- 语义分析器
- 生成中间代码
- 代码优化器:
- 代码生成器
-
- NoSQL
-
- Redis
-
- 单机模式
- 集群模式:分布式
-
- 主从模式
- 哨兵模式
- 集群模式
- 适合场景
- 爬虫
- 综合面试
-
-
- 数据结构
- 信息系统安全
-
-
- 中国墙模型可以完全模拟 BLP 模型吗?
-
- Linux的内存管理机制是什么?
- Linux任务调度机制
- 库函数与系统调用的区别
- Linux 安全模块 LSM 是什么?
- Linux
- 函数连续性
- 面向过程面向对象
- 浏览器访问网页的流程
- 优缺点
- 导师矛盾
- 为什么选择
- 素质
- 进程间通信
- 定位内存泄漏
- 静态链接与动态链接的区别和使用
- 一个进程能用的最大内存(堆区)空间大小
-
- 前沿知识
-
- 物联网协议
- 离散数学
- 级数
- 正则表达式
- 余弦相似度匹配
- 人脸识别 :
- 研究方法
- 攻击树
-
- 远程过程调用
- 半监督学习
- 半监督学习
- TextRank算法
- 软件工程
-
- 需要哪些文档
- 软件测试
- 测试不充分
- 需求确认
- 数据库
- 大数据
-
- 大数据前景
-
- 1、海量日志数据,提取出某日访问百度次数最多的那个IP。
- 1、序列化和反序列化
- 2、 为什么要序列化?
- 3、为什么Hadoop不用Java的序列化?
- Hadoop
-
- HDFS
-
-
- 在10G的字符串中要求返回一个具体单词的位置。
-
- 机器学习
- 算法
-
- 什么是算法
- 特性
- 决策树算法:
- 朴素贝叶斯:
-
-
- 对比
-
- Java基础
-
- 三大特征
-
- 抽象类:
- 接口:
- 数据类型
- 反射机制
-
-
- 作用:
-
- 犯错
- 三大集合
-
- HashMap
- 红黑树
- 解决Hash冲突的方法有哪些?
- List和Set的区别?
- 数据结构分类
-
- 静态变量
- 虚拟机内存
-
- 方法区
- 堆内存
- 虚拟机栈
- 本地方法栈
- 程序计数器
- 内存分配与垃圾回收:
-
- root根搜索方法:
- 拷贝
- 内存泄漏
- 垃圾回收GC Garbage Collector
-
- 标记-清除算法
- 复制算法:
- 标记-整理算法:
- JVM中的垃圾收集器
-
- CMS收集器
-
- 在不申请新内存空间条件下交换两个数的值
计算机网络
OSI七层模型
基本介绍
物理层
- 定义:在物理媒体上实现比特流的透明传输
- 传输单位:比特
- 协议:IEE
- 中继器、集线器
数据链路层
- 节点A把封装好的帧通过物理层发送到节点B
- 传输单位:帧
- 协议:PPP
- 网桥、交换机、局域网 可隔离冲突域
网络层
- 定义:把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务
- 传输单位:数据报
- 协议:ARP IP RARP ICMP
- IP路由器 可隔离广播域
传输层:
- 定义:负责主机中两个进程的通信,提供端到端的可靠保温传递和错误恢复
- 传输单位:报文段 网关
- 协议:TCP UDP
会话层
- 定义:允许不同主机上的各个进程之间 建立、管理、终止会话。有序地传输数据
- 协议:ADSP,ASP
表示层
- 功能:对数据进行翻译、加密解密和压缩解压缩
- 协议:JPEG ASCII
应用层
- 功能:所有能产生网络流量的应用程序
- 协议:文件传输FTP:21 HTTP:80 HTTPS:443
物理层
功能:
- 定义接口特性:机械特性
- 电气特性、功能特性、规程特性
- 定义传输模式:单工、半双工、双工
- 定义传输速率
- 比特同步
信息交互方式
- 单工通信
- 半双工通信
- 全双工通信
信道复用
- 频分复用
- 应在各子信道之间设立隔离带,这样就保证了各路信号互不干扰
- 时分复用
- 时间片 时隙
- 波分复用
- 码分复用
虚电路
数据报服务 | 虚电路服务 |
---|---|
无连接 | 有物理连接 |
分组独立,都带地址 | 同一虚电路分组按同一个路由 |
无序 | 有序 |
由主机保证 | 由网络保证 |
经过故障节点不能工作 | |
永久临时 |
- 电路交换是以独占的方式使用物理电路
- 虚电路是在一条物理电路上实现复用,是一条逻辑的电路,可以建立许多虚电路。
数据链路层 局域网
功能:
- 封装成帧:定义帧的开始SOH和结束EOT
- 透明传输:防止传输文本出现开始或结束,造成错误开始或错误结束
- 差错控制:帧错、位错;用CRC循环冗余检测
CSMA/CD
每个节点都共享网络传输信道,在每个站要发送数据之前,
- 先检测信道是否空闲,空闲则发送,否则就等待;
- 在发送出信息后,检测当发现冲突时,取消发送。
交换机
PPP协议
点对点 支持全双工链路 特点: 简单 不需要纠错,不需要序号,不需要流量控制
下一跳(网关)
1、pc1的的网关指向R1 LAN
2、pc2的网关指向R2的LAN口
3、R2的WAN口网关指向R1 LAN口
4、在R1上指定一条静态路由,使目的ip为192.168.1.x网段的ip转发到R2
网络层
功能:
- 路由选择
- 流量控制
- 差错控制
- 拥塞控制
路由器
接收来自一个网络接口的数据包,根据 其中所含的目的地址,决定转发到下一个目的地址。因此,路由器首先去掉数据包的二层头,取出目的 IP 地址,在转发路由表中查找它对应的下一跳地址,若找到,就在数据包的帧格前添加下一个 MAC 地 址,同时 IP 数据包头的 TTL(Time To Live)域也减一,并重新计算校验和。当数据包被送到输出端口 时,它需要按顺序等待,以便被传送到输出链路上。
IPv4 IPv6
- 双协议栈
- 隧道技术
- 将IPv6的分组作为无结构意义的数据,封装在IPv4数据报中
- 网关转换
MAC地址、IP地址、子网掩码、网关
A: 1 B: 128 C: 192 D: 224 E: 240
ARP协议
通过IP获取MAC地址 过伪造IP地址和MAC地址对实现ARP欺骗的,清空缓存,添加路由过滤
RARP
反过来
Ip协议
从一个网段发送到另一个网段
ICMP协议
确定IP包是否到达目的地 通知被丢弃原因
传输层
功能:
- 可靠传输、不可靠传输
- 流量控制
- 复用分用
- 差错控制
UDP协议
定义:用户数据报协议 特点:
- 一个数据包就能完成数据通信
- 不分段不连接不控制
- 面向报文
- 支持一对一一对多多对多
- 伪装首部:让UDP两次检查数据是否已经到达目的地 仅为了计算校验和使用。
TCP协议
文件传输
序列号 确认应答 超时重传 流量控制 拥塞控制
socket socket bind connect listen read,write accept close read,write close
\ | UDP | TCP |
---|---|---|
连接性 | 面向无连接 | 面向有连接 |
可靠性 | 可靠性低,丢包不会重发 | 可靠性高,丢包会重发 |
效率 | 效率高 | 效率低 |
双工性 | 一对一、一对多、多对多通信 | 点对点通信(全双工) |
报文 | 面向报文 | 面向字节流 |
流量控制 | 无 | 有 |
阻塞控制 | 无 | 有 |
主动打开 被动打开 连接建立 主动关闭 被动关闭 等待关闭 最后关闭
第一个连接请求报文段并没有丢失,就误认为是client再次发出的一个新的连接请求,所以不能两次握手
IP 32 128
划分成若干时间片(简称时隙)
HTTP请求
HTTP是面向网页的,而FTP是面向文件的。
- 1XX:临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1XX响应
- 2XX:服务器成功的接收了客户端请求
- 3XX:客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同页面,或者通过代理服务器重复该请求
- 4XX:客户端似乎有问题。例如:客户端请求不存在的页面,客户端为提供有效的身份验证信息
- 5XX:服务器遇到错误而不能完成该请求
- 客户端连接到Web
- 发送HTTP请求
- 接受并响应
- 释放Tcp
- 浏览器解析HTML
每次请求都需要服务器回送响应,在请求结束后,会主动释放连接
无状态:
-
同一个url请求没有上下文关系
-
协议对于事务处理没有记忆能力
-
每次的请求都是独立的
-
服务器中没有保存客户端的状态
-
不包括cookies,session,application的http协议
TLS传输层安全协议 SSL (Secure Sockets Layer) 安全套接层,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。数字证书、加密算法、非对称密钥等技术
ssh
设计模式
设计原则
- 单一职责
- 里氏替换 father =new son
- 依赖倒置:面向接口
- 接口隔离
- 迪米特法则:降低依赖耦合
- 开闭原则:对扩展开放,对修改关闭
单例模式
一个类只有一个实例
工厂模式
- 定义一个创建对象的接口
- 抽象类具体类
- 工厂类
interface Phone
class MiPhone implements Phone
class Iphone implements Phone
class PhoneFactory{
public Phone make(string){
if("mi"){
return new Miphone();
}else{
return new Iphone();
}
}
}
适配器模式(Adapter Pattern)
通过类继承实现适配,继承Target的接口,继承Adaptee的实现 Target target = new Adapter(); 类适配 Adaptee作为一个数据成员组合到类定义中,对象适配
计算机组成原理
.c 预处理 .cpp 编译器—汇编程序—生成可重定位目标程序--------库-链接器-------可执行文件
Q:TLB与cache与内存的区别
A:TLB与cache都是按内容访问的存储器,因为采用SRAM构成,这使得它们的访存速度大大快于使用DRAM组成的内存。但正因为采用SRAM使得它们的功耗高于内存,集成度低于内存。因此在计算机系统中,它们通常都是位于cpu内部,作为cpu与内存之间的高速缓存,用于解决高速cpu与慢速内存访问速度之间的矛盾。 不同点:按内容访问存储器(SRAM构成),按地址访问存储器(DRAM构成)。
操作系统
进程和程序
- 进程是动态的,进程是程序的执行,程序是有序代码的集合
- 进程是暂时的,程序是永久的
- 进程包括程序,数据和进程控制块
- 进程可以创建其他进程,但是程序不能形成新的程序
进程和线程
进程与线程区别
- 进程是系统资源调度和分配的基本单位,可引起线程切换
- 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发
- 可以多线程实现同一进程内并发
- 线程创建开销小
- 线程依赖于进程
- 进程拥有独立的内存单元,多个线程共享进程内存
通信:
- 进程间:管道、消息队列、信号量、共享内存、套接字socket
- 线程间:临界区、互斥量、信号量、信号5
多线程和多进程的区别
(重点 面试官最最关心的一个问题,必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催)
多进程编程简单,不会互相影响,可用增加机器方式扩展 多线程创建简单,切换简单,内存占用少,共享数据,同步复杂 线程私有寄存器
微内核
有效支持多处理机运行,适合分布式系统
- 内核是OS最基本的部分
- 基于C/S模式,操作系统的绝大部分功能放在外面的一组服务器
- 采用面向对象
- 实现进程管理,低级存储器管理,中断陷入
DMA和中断
- DMA:完全硬件,主存与I/O设备直通,dma向cpu发出总线控制请求,cpu把总线控制下发给DMA控制器
- 中断:外设向cpu发出中断请求,cpu响应中断后进行数据传输。
区别
- DMA方式是硬件方式。中断是软件方式。
- 优先级:DMA方式比中断方式高。
- DMA只占用cpu少部分时间,但是中断方式全程占有cpu。
- 中断方式能处理异常事件,但是DMA方式只能够传输数据。
硬中断和软中断
软中断
- 编程异常
- 是进程间一种信号通讯方式
- 软件实现的,执行中断指令
- 不可屏蔽
硬中断
- 外部事件引起的,随机性突发性、
- 可屏蔽
操作系统是什么
管理控制计算机硬件与软件的计算机程序,是其他软件运行的基础
组成
- 进程管理:死锁、信号量
- 存储管理
- 文件管理
- 设备管理
- 系统调用
用到的数据结构
- 链表
- 外存分配
- 队列
- 消息队列,任务就绪队列,循环队列
- 栈
- LRU置换
- 树
- 进程管理家族树
- 散列表
- 文件管理,hash文件
系统调用过程
用户程序和操作系统之间的接口
- 首先,将处理机状态由用户态转为系统态
- 保护被中断进程的 CPU 环境,处理机状态字 PSW、程序计数器 PC、系统调用号、用户栈指针以及通用寄 存器内容,压入堆栈
- 再然后将用户定义的参数传送到指定的地址保存起来。
- 转入相应的系统调用处理子程序。
- 执行完后,应恢复被中断的货设置新进程的 CPU 现场
在cpu指令集中有一部分指令为特权指令,这些指令只能让操作系统使用
虚拟存储器
基于局部性原理,仅将那些当前要运行的少数页面或段先装入内存
,时间局部性原理和空间局部性原理。为了实现虚拟内存,需要硬件上的支持和软件上的支持。硬件上需要缺页中断机构,地址翻译机构。软件上需要制定页面置换算法。因为虚拟内存为用户虚拟出一个用户地址空间,这简化了编译器和连接器的设计。
存储器管理
为多道程序的运行提供良好的环境 内存的分配和回收: 地址变换:提供地址变换功能,将逻辑地址转换成物理地址 扩充内存:借助于虚拟存储技术活其他自动覆盖技术 存储保护:保
解释分段与分页的区别
分页要对物理内存进行分块,然后再将逻辑页映射到物理块上,
分段系统将进程的逻辑地址空间,最突出的优点就是易于实现数据的共享
什么是 TLB
快表,加速地址转换,高速缓冲存储器,存放映射关系
程序装入方式
- 绝对装入,编译器含有物理地址
- 可重定位装入,静态重定位,分配连续地址,逻辑地址
- 动态运行装入,允许运行时移动位置
程序链接
- 静态链接:运行前链接库
- 装入时动态链接:装入内存时边装入边链接
- 运行时动态链接:运行中需要时链接
- JAVA 编译时将依赖的Jar包或Class文件放到ClassPath下即可
- C中可执行文件依赖的所有共享库会在启动时完成加载
交换技术,覆盖技术
- 覆盖技术:按逻辑把程序分,然后运行时只把需要的程序装入,要求知名
- 交换技术:把内存里的某些进程腾出内存空间,再换进某些进程
- 覆盖是在间的,交换是在的进程或作业之间的
- 覆盖技术打破了程才能运行的。而交换技术打破了。
内存连续分配管理方式
① 单一连续分配(静态分配) ② 固定分区分配(分区大小可以不等,但事先必须确定,运行时不能改变) ③ 动态分区分配
拼接技术
是解决碎片问题的
原子操作
要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。
常用的存储保护方法
(1)界限寄存器 上下界寄存器方法 基址、限长寄存器方法
(2)存储保护键:给每个存储块分配一个单独的存储键,它相当于一把锁。
续分区分配(会产生碎片)
非连续分区分配() 缺点:不连续,设计复杂,间接寻址,效率低。优点:内存利用效率高,无外部碎片。
页表
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页面映射表。
段寄存器
(Segment 段)
CS(Code Segment) 代码段寄存器 代码段寄存器,指定当前代码段,代码段中存放当前正在运行的程序段。
DS(Data Segment) 数据段寄存器 数据段寄存器,指定当前运行程序所使用的数据段。
SS(Stack Segment) 堆栈段寄存器
ES(extra Segment) 附加段寄存器
作业和进程
进程是一个程序对某个数据集的执行过程,是分配资源的基本单位
作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合。一个作业可由多个进程组成。
分段和分页
-
分段的目的是为了更好地满足用户的需要
-
分页是为实现离散分配方式
-
分页有内部碎片无外部碎片
分段有外部碎片无内部碎片
FCB文件控制块
文件目录中新增一条记录 特殊的文件,是有结构的文件,如上图的表格,用于记录各个文件的属性
数据结构
快排性能综合最好,因为其空间复杂度为O(1),平均时间复杂度为O(log2n)
哈希
哈希表,Hash table,也称为散列表,它是可以根据关键字的值,直接进行查询与访问的数据结构。我们通常通过映射函数将关键字直接对应到表中的某个位置,从而加快查找速度
堆排序
待排序列构造成一个堆,选出所以记录最大者做对堆顶元素,输出堆顶元素后,将堆底元素送入堆顶,性质破坏,向下调整,最后输出堆顶
C的结构体
只是把数据变量给包裹起来了,并不涉及算法;而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。 比如简易模拟学生成绩管理系统,就可以定义一个学生类数组来代替学生类
哈夫曼树,
哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度
将哈夫曼树从根节点到叶子节点的路径上分支字符组成的字符串作为叶子节点字符的编码,这便是赫夫曼编码。
非连通图
非连通图的遍历 对策:从每个连通分量中选择初始点,分别进行遍历,才能够访问到图中的所有顶点
B树B+树
B树
- n个关键字n+1棵子树
- 叶节点不包含信息
- 随即检索
- 叶节点关键字与非叶节点关键字不重复
B+树
- n个关键字n棵树
- 叶节点包含信息
- 随即检索、顺序检索(叶节点相连)
- 叶节点包含全部关键字,重复
最短路径
迪杰斯特拉算法
Floyd算法
A当前最短路径 path记录最短路径的中间顶点 每个作为中间点,Aij > ? Aic+ Acj
排序算法
冒泡排序
- :冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
- 算法思想:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
- 特点:
- 最坏时间复杂度:
O(n^2)O(n2)
,,需要进行n-1次排序,比较次数=1+2+...+(n-1)= \cfrac{n(n-1)}{2}比较次数=1+2+...+(n−1)=2n(n−1)
- 最好时间复杂度:
O(n)O(n)
,,比较次数n-1 - 空间复杂度:
O(1)O(1)
- 稳定的算法
- 排序的趟数与序列原始状态有关(flag的作用)。
- 最坏时间复杂度:
选择排序
- :选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
- 算法思想:
- 初始状态:无序区为R[1…n],有序区为空;
- 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
- 特点:
- 时间复杂度:
O(n^2)O(n2)
- 空间复杂度:
O(1)O(1)
- 不稳定
- 每趟排序确定一个元素位置。
- n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。
- 元素间比较次数与序列初始状态无关。比较
\cfrac{n(n-1)}{2}2n(n−1)
次 - 用到它的时候,数据规模越小越好。
- 时间复杂度:
插入排序
- :插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
- 算法思想:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
- 特点:
- 最好时间复杂度:
O(n)O(n)
, ,只需要比较,不用移动,最少比较次数为n-1 - 最坏时间复杂度:
O(n^2)O(n2)
, ,最多比较次数=1+2+...+(n-1)= \cfrac{n(n-1)}{2}最多比较次数=1+2+...+(n−1)=2n(n−1)
- 空间复杂度:
O(1)O(1)
- 稳定
- 。
- 最好时间复杂度:
希尔排序
- :第一个突破
O(n^2)O(n2)
的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
-
算法思想:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列个数k,对序列进行k 趟排序;
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
-
特点:
- 最坏时间复杂度:
O(n^2)O(n2)
- 最好时间复杂度:
O(n^{1.3})O(n1.3)
- 空间复杂度:
O(1)O(1)
- 不稳定
- 最坏时间复杂度:
归并算法
- :归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
- 算法思想:
- 把长度为n的输入序列分成两个长度为n/2的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
- 特点:
- 时间复杂度:
O(n\log{n})O(nlogn)
- 空间复杂度:
O(n)O(n)
- 稳定
- 每趟归并的时间复杂度
O(n)O(n)
,共\log{n}logn
趟 - 具有外部排序的特征
- 时间复杂度:
快速排序
- :通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
-
算法思想:快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
-
特点:
- 最坏时间复杂度:
O(n^2)O(n2)
,基本有序或逆序时,即划分区域分为n-1个元素和0个元素。 - 平均时间复杂度:
n\log{n}nlogn
,当划分区域对称时最快 - 最坏空间复杂度:
O(n)O(n)
,基本有序或逆序时(递归,使用了栈) - 平均空间复杂度:
O(\log{n})O(logn)
,栈深度 - 不稳定
- 每一趟定一个位置(基准元素)
- 内部排序算法中平均性能最优的排序算法。
快排为o(n^2)? A:
- 最坏时间复杂度:
堆排序
- :堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
- 算法思想:
- 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
- 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
- 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
- 特点:
- 建堆时间复杂度:
O(n)O(n)
- 调整时间复杂度:
O(\log{n})O(logn)
- 整体时间复杂度:
n\log{n}nlogn
- 空间复杂度:
O(1)O(1)
- 不稳定
- 每趟定一个位置
- 重建堆时注意两个子树都会比较
- 建堆时间复杂度:
基数排序
- :基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
- 算法思想:
- 取得数组中的最大数,并取得位数;
- arr为原始数组,从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点);
- 特点:
- 时间复杂度:
O(d(n+r))O(d(n+r))
, d趟分配和收集, 分配O(n), 收集O® - 空间复杂度:
O(r)O(r)
, r个队列 - 不基于比较进行排序
- 与序列初始状态无关
- 稳定
- 时间复杂度:
计数排序
- :计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
- 算法思想:
- 找出待排序的数组中最大和最小的元素;
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
- 特点:
- 时间复杂度:
O(Max(A))O(Max(A))
- 空间复杂度:
O(Max(A))O(Max(A))
- 不基于比较的排序算法
- 不稳定
- 时间复杂度:
时间复杂度
时间复杂度是指执行算法所需要的计算工作量,一般情况下,按照基本操作次数最多的输入来计算时间复杂度
循环队列
要空一个位置,区分队满、队空
二叉排序树的查找过程
若根结点的关键字值等于查找的关键字,成功。否则,若小于根结点的关键字值,递归查左子树。若大于根结点的关键字值,递归查右子树。 若子树为空,查找不成功。
哈夫曼树
给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二 叉树,也称为哈夫曼树(Huffman tree)。
深度优先搜索遍历
首先访问出发点 V,并将其标记为已访问;然后选取与 V 邻接的未被访问的邻接顶点 W,访问 W;再选取与 W 邻接的未被访问的顶点访问,当一个顶点所有的邻接顶点都被访问过时,则依 次退回最近被访问过的顶点,
生成森林
广度优先搜索遍历
依次访问v未访问过的邻接顶点
迪杰斯特拉算法
从a走到其他村的最短
Prim 为N个村修路
链表查找元素
顺序存储,(1+n)/2
图的存储方式
图
- 有穷顶点和边集合
- 有向图 最多n(n-1)完全有向图
- 完全无向图n(n-1)/2
- 简单路径:序列中的顶点和路径不重复出现的路径
- 最小生成树:Prim包含原图中的所有 n 个结点,并且有保持 图联通的最少的边。添加一条边,必定成一个环。
二叉树
- 完全二叉树特点: 叶子结点只可能在最大的两层上出现, 对任意结点, 若其右分支下的子孙最大层次为 L,则其左分支下的 子孙的最大层次必为 L 或 L+1;度为1只可能是最后一个分支节点
- 节点的度:孩子结点个数
堆
可看作完全二叉树
循环队列
克服顺序队列“假溢出”
拓扑排序
有向无环图,没有前驱
非连通图
从每个连通分量中选择初始点,分别进行遍历,才能够访问图中的所有顶点。
专业课面试问题
闭式:没有自由出现的个体变元,不是闭式就不是命题
信息安全
网络安全有哪些方面
,攻击,
- 可靠性、完整性、保密性、有效性、不可篡改
包括密码学、身份认证、
区块链安全,但是这个更偏向应用层
密码学
渗透测试
模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法 nmap 端口 AVWS扫描漏洞 Metasploit
Web安全
**XSS (Cross-Site Scripting)**跨站脚本攻击是一种常见的安全漏洞,恶意攻击者在用户提交的数据中加入一些代码,alert,转义字符
,伪装成了正常用户,登陆状态的cookie 悄悄访问某个网站的接口,完成某些操作,cookie中的参数取出来,加入到请求参数
网络信息安全
- 机密性:防止未授权用户非法获得保密信息。
- 完整性:在未经许可的情况下,保证数据不会被他人删除或修改(至少能发现被修改过)。
- 身份认证:为了防止非法用户访问系统和网络资源。
- 访问控制:限制主体对访问客体的访问权限,从而使计算机系统在合法范围内使用。
- 不可否认:通信方必须对自己行为负责,而不能也无法事后否认,其他人也无法假冒通信方成功。
- 可用性:计算机或网络能够在我们期望它以我们所期望的方式运行的时候运行。
可靠性、完整性、保密性、有效性、不可篡改
身份认证
- IC卡
- 生物特征
- 用户名/密码方式
- 动态口令
编译原理
- AH&AL=AX(accumulator):累加寄存器
- BH&BL=BX(base):基址寄存器
- CH&CL=CX(count):计数寄存器
- DH&DL=DX(data):数据寄存器
堆和栈的区别
栈
- 由操作系统自动分配
- 一级缓存 静态RAM:SRAM
- 先进后出的线性表
- 适合存储变量
- 被调用时处于存储空间,调用完毕立即释放
- 由高地址向低地址
堆
- 由程序员分配释放
- 二级缓存 动态RAM:DRAM
- 一棵树,可取出任意位置
- 适合存储对象
- 由虚拟机垃圾回收算法决定
- 由低地址向高地址
Docker和KVM
docker 秒级实现一台主机上可以同时运行数千个 Docker 容器。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
java和c++
- java指针放在虚拟机内部
- c++支持多重继