计算机基础知识复习

数据结构

二叉查找树

  • 左、根、右 从小到大。

平衡二叉树

  • AVL:LL、LR、RL、RR。
  • 任意节点的两个子树高度最大差1。
  • 可以保证最坏情况下的单次操作,但删除操作后可能需要O(logN)次旋转。

伸展树

  • 访问过程中,动态的调整树的结构。
  • 类比链表在访问时,把被访问的节点调整到队首。
  • 伸展树针对频繁访问集中区域的情境更优。不适用于单次访问敏感的情况。

红黑树

  • 一种自平衡二叉查找树。
  • O(logn)时间内做查找、插入、删除。
  • 2-3-4树。
  • 根(黑),叶(黑)NIL空节点,节点是红或者黑,每个红色节点的两个子节点都是黑色。
  • 从每个叶子节点到根的所有路径上不能有两个连续的红色节点。
  • 从任一个节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。即:长度小于2倍。任一节点左、右子树的高度相差不过两倍。
  • 放宽了平衡条件,使得删除操作后全树的拓扑结构更新在常数级别。

B树与B+树

B树
  • 由于B树包含每一个key和value,因此经常访问的元素可能离根节点更近,进而可能导致访问也更迅速。
  • B树提高了磁盘IO性能(减少磁盘IO操作),但没有解决遍历元素效率低下的问题。
B+树
  • 非叶子节点只包含导航信息,不包含实际的值,因此页面中能够存放更多的key,数据存放的更加紧密,具有更好的空间局部性。
  • 由于非叶子节点不包含value,所以每次查找都要从root走到leaf,查找效率基本稳定。
  • B+树的叶子结点都是相链接的,因此对整个树的遍历只需要一次线性遍历叶子结点即可。而且数据顺序排列并且相连,便于区间查找和搜索(Mysql常用操作)。而B树则需要进行每一层的递归遍历。
  • B树相邻的元素可能在内存中不相邻,所以缓存命中率没有B+树好。

贪心算法与动态规划

  • 总是做出在当前看来是最好的选择。
  • 局部最优到整体最优。一步一步,从顶向下,以迭代的方法做出相继的选择。
  • 贪心使用前提:选择的贪心策略必须具备无后效性。即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
  • 动态规划问题使用前提:具有最优子结构性质(当一个问题的最优解包含其子问题的最优解时)、子问题重叠、问题存在边界、子问题相互独立。
  • 贪心算法,一般是一维的问题,对每个子问题的解决方案都做出选择,不能回退。其每一次操作都会对结果产生直接的影响,而动态规划则不是。动态规划则会根据以前的选择结果对当前问题进行选择,有回退功能。主要运用于二维或三维的问题。
  • 0-1背包问题:dp,贪心不一定能使用。
  • 完全背包。
  • 多重背包。
  • 贪婪算法或者启发式算法:8-puzzles,马踏棋盘,优先选择‘出口’最小的进行搜索,把更多的选择机会留到最后,效率更高,只求出一个解时无需回溯。
  • 最小生成树算法。prim(添点)。kruskal(添边,相同权值边时也有效。)dijkstra单源最短路径。

bitmap

  • 一个int,4bytes,32bits。
  • 数据比较密集时,效率高。
  • 排序(遍历一遍打印,bit[3]=1),去重(01一次,00不在,11多次),快查(%32,状态位为1则存在。)
  • 40亿个数,int[] 16GB,bit,0.5GB。
  • bmap[val/BitLen]|=(1<<(val%BitLen));判:bmap[val/BitLen]&(1<<(Val%BitLen));

并查集

  • 数组下标为子节点,数组值为父节点。
  • parent[p]=root.
  • 判别根节点parent[root]=root.
  • 路径压缩。

冒泡排序优化

  • flay设定。
  • 记录上一次最后一次交换位置。
  • 正反优化扫描。

加密

  • base64:38到46到4*(6+2)到base64对照表。明文到密文,可破解。
  • 非对称加密:无需事先传递密钥和规约,而对称加密需要传递加密值。
  • MD5,信息摘要算法,密码散列函数128位散列值。作用,存储用户密码(密文)、电子签名(检验源文件是否被改动)。缺点:碰撞算法,不同的字符可能得到相同的密文。
  • 数字签名:发送方生成的一串标识。
  • 数字摘要:hash算法提取信息唯一指纹,128bits密文。
  • cookie:小甜品,少量信息。由web服务器创建,将信息存储在用户计算机上的文件。作用,网站辨别用户身份,进行session跟踪而存储的加密处理。
  • HttpHeader:1.请求方法post、get。2.host。3.user-agent。4.accept。5.accept-language。6.content-type。7.connection:keep-live。8.cookie。9.refer

JVM

内存模型

  • Method Area:常量、类信息、静态变量。共享。
  • Heap:类实例。共享。
  • VM Stack:局部变量、操作数栈、动态链接。线程独享。
  • Native Method Stack:针对本地方法,Java调用非Java代码的接口。
  • Program Counter Register:字节码行号。
  • 执行引擎。
  • 本地库接口:共享。

垃圾回收

  • 引用计数算法:相互循环引用问题。
  • GC Roots:引用链。

对象不可达回收对象

  • VM Stack(栈中本地变量表)。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中引用的对象。

无用类回收判别

  • 所有实例都已被回收。
  • 加载该类的classLoader已被回收。
  • 该类对应的java.lang.class对象没有在任何地方被引用。

引用类型

  • strong:在则不收。
  • soft:可回收,非必须。以防内存溢出。
  • weak:可回收,非必须。下一次回收。
  • phantom:唯一目的:收集器回收时收到一个系统通知。重要对象回收监听、进行日志统计、判别GC回收频率、进而判别内存使用可能存在问题。
  • F-Queue:队列,即将回收。
  • Java中不推荐使用finalize()。

垃圾收集算法

  • 标记-清除:内存碎片。(老)
  • 标记-整理:针对老年代,让所有存活的对象都向一边移动,然后直接清理掉边界以外的内存。(老)
  • 复制算法:空间代价大。(新:朝生夕死新生代)
  • hotspot虚拟机:朝生夕死新生代。一大两小,8:1.
  • 分代收集算法:根据不同情况对应不同方法。如:新生代,大批量死亡,所以采用复制算法(需要复制的少),老年代,则采用标记-清理,标记-整理。

Java基础

  • transient,声明的变量不能被序列化。
  • Java是静态类型语言,但是有大量的动态类型机制。
  • set-hashSet-treeSet-linkedHashSet.map键值对,put和get方法.hashCode明显基于String类型的.
  • 静态多分派,动态单分派。
  • 类加载器过程,责任链模式。
  • Java加载class文件:loading->verification->preparation->resolution->Initialization(or dynamic binding)->using->unloading.
  • 编译期间的常量折叠 int a = 1+2;热点探测,热点代码栈上替换。方法内联。常量传播。逃逸分析。栈上分配。
  • Java Memory Model:屏蔽了各种硬件和操作系统的内存访问差异,每个线程有工作内存,主内存同步。
  • java线程对应工作区间,再一同同步到主存。
  • volatile只保证可见性。写操作慢,本地代码插入许多内存屏障指令,禁止指令重排序优化,后提交的覆盖前一个。
  • 原子性:基本数据类型的访问读写具备原子性。
  • 可见性:对一个变量执行unlock之前,同步回主内存。
  • 有序性:不同线程之间观察,无序。
  • 乐观:先试一试,不行再重试。CAS,ABA。
  • Java静态块先于main方法。
  • HashMap无序、无索引,不能存储重复元素。线程不安全。
  • HashTable,线程安全,synchronized,可能阻塞和轮询状态。
  • ConcurrentHashMap,锁分段技术,默认每段16个segment,ReEntrantLock,AQS,CAS,ABA,修改计数器或者版本号。
  • StringBuffer线程安全,StringBuilder线程不安全。
  • +通过StringBuilder走中间过程,通过Append方法实现。每趟循环都会创建StringBuilder对象,内存浪费,循环中不推荐使用。
  • currentThread,静态方法,可以获取当前线程正在被哪个线程调用的信息、返回正在执行线程的引用。
  • List有ArrayList,底层数组,查询快,增删慢,非线程安全,效率高。LinkedList链表,查询慢、增删快、线程不安全,效率高。Vector,线程安全,效率低。
  • Java静态块先于main方法。

Linux

软链接与硬链接

  • 软链接:链接数不增加,一个文件里存放另一个文件的路径。类比windows下快捷方式。
  • 硬链接:类似别名,不能跨分区做硬链接,因为每个分区都存在inode文件,不可以对目录做硬链接,硬链接不可以删除干净。

进程通信

  • 管道,有名管道和无名管道。读文件,共享资源。
  • 消息队列,已淘汰。
  • 共享内存:同一台机器上进程间通信最快方式(数据存储的同步)。
  • 信号量:记录资源的存取情况。
  • 套接口:socket编程。

操作系统

操作系统如何管理内存?

内存管理
  • 内存资源是宝贵的,稀缺的。
  • 由于内存空间限制,程序数据无法全部放到内存中去运行。
  • 幸运的是,程序只需要部分数据去运行当下。
  • 引出:交换技术和虚拟内存。
交换技术:碎片化问题,分页处理,4k,缺页中断,页面置换算法
  • 内存中有当下需要的一部分数据就可以保证程序当下运行,所以程序在运行过程中需要不断的进行内存数据的更新加载,也就是交换技术
  • 内存中数据的交换会导致内存碎片化的问题,为了避免碎片化内存导致的浪费,提出了分页处理
  • 分页大小为4k,在程序运行过程中,对应需要的页面不断的被加载到内存中,而内存的加载是需要时间的,加载次数越少越好。如果一个被需要的页面无法及时被加载到内存,就会造成缺页中断
  • 为了保证页面加载的高效执行,衍生出页面置换算法
  • FIFO:类比链表。
  • 二次机会:设置访问位,给予二次机会。访问位清零,进入内存时间为当下。
  • 时钟算法:替换访问位为零的页面(索引)。
  • not recently used:最近未被使用。时间维度判别。设置页面访问位修改位,替换最长时间未被使用的页面(00,01,10,11)。
  • least recently used:最近最少使用或最近最不常使用。频率维度判别。背后思想:一段时间上,程序使用的页面将局限在一组页面集合上。实现成本高。
  • 工作集时钟算法(NRU):时钟算法+NRU。时针组织的页面只是在内存里的页面。局部性原理:最近被使用过的可能还被使用
虚拟内存:逻辑地址、虚拟内存、页面号+页内偏移量
  • 实际内存通过MMU mapping 到虚拟内存。
  • 操作系统为每个进程维护一个页表,页表本身占用内存空间。
  • 缓存,内存管理,内存保护。
  • 让系统感知到连续的内存,连续的内存可能底层由物理内存碎片拼接。

网络

一次HTTP请求

  • 域名,DNS缓存,浏览器,os,本地域名服务器递归查询,IP。
  • http请求网络层,IP ARP解析 MAC,链路层封装成帧,tcp链接,物理层传输bits,解包,服务器应答,前端渲染。

滑动窗口机制

  • 接收端接收能力。

拥塞窗口机制

  • 发送方发送控制。试探。
  • 某一源端数据流在一个RTT内可以最多发送的数据包,防止路由过载。
  • TCP,慢开始,拥塞避免,加法增大,乘法减小。一旦丢包,立即减半。收到3个相同ACK来判别数据包丢失,快速重传。快恢复。

三次握手、四次挥手

  • 三次握手:防止已失效连接请求报文ACK突然又传到服务端,因而产生错误。
  • 四次挥手:全双工模式。A不传,B可能还传。FIN_WAIT后,等2MSL(最大报文段生成时间)。

HTTPS

  • HTTP+SSL/TLS(安全层)
  • seo(search engine optimization)优势
  • 加密,防止流量劫持
  • URL企业组织名称,防止用户钓鱼网站欺骗。

Java多线程与锁机制

Runnable与Callable
  • 相同点:都是接口,都可以用来编写多线程程序,调用Thread.start()启动线程。
  • 不同点:call方法可以返回结果,FutureTask.get()方法实现,阻塞线程直到获取将来结果。其call方法可以上抛异常。run方法只能内部消化异常,且不能返回结果。
锁常识
  • 原子性、一致性、有序性。
  • 自旋锁:自旋等待不能代替阻塞。不挂起阻塞,而是原地忙等。是非阻塞锁。
  • 锁粗化:避免细粒度锁的频繁切换,甚至循环体中的锁。
  • 偏向锁:偏向第一个获得它的线程。
  • 可重入锁即递归锁:基于线程的分配,而非方法,使用场景为当同一线程需要多次进入临界区代码时。
  • 乐观锁,适合读多,可能长时间不成功,CAS、ABA问题、版本号计数。悲观锁,适合写多,认为并发时数据总会更新。
  • 公平锁先到先得。非公平锁后到先得,饥饿现象。
  • 可中断锁:lock是,synchronized不是。使得在等待期间的线程自我中断或者被中断去干别的事情。
  • 读写锁:将资源分为两个锁,一个读锁,一个写锁。
  • 独享锁/共享锁(广义):互斥锁/读写锁
synchronized、lock、volatile
  • synchronized 关键字,内置特性,不是可中断,不可中断所以等。异常自动放锁。可重入锁。非公平锁。
  • lock,控制性更强,需要解锁。提高多个线程读操作,竞争激烈时,使用lock。
  • volatile不能实现计数器,其保证可见性而非原子性。当读远大于写,可选用volatile代替锁。内存屏障,写后读前加,确保特定操作执行顺序。CAS+版本号+volatile。
  • currentHashMap使用分段锁机制。是reentrantLock可重入锁。
  • reentrantLock父类是AQS(AbstractQuenedSynchronizer):volatile int state(CAS、ABA、版本号)+等待线程队列(clh,虚拟双向链表)

数据库

4个特性

  • Atomic原子性
  • Consistency一致性
  • Isolation隔离性
  • Durability持久性

4个隔离级别

  • 未提交读:导致脏读
  • 读已提交:不可重复读
  • 可重复读:幻读
  • 串行化:性能

3个范式

  • 1NF:字段原子性,不可再分。
  • 2NF:消除对主键的部分依赖。新增业务无关ID。
  • 3NF:消除对主键的传递依赖。独立数据独立建表,避免冗余。

MySql优化

  • 字段设计:整形表示字符串,例如:INET_ATON(str)存储IP
  • 定长与非定长选择:短好
  • 字段注释:单表注释不宜过多(二三十个)
  • 索引:复合索引有最左原则、即只是对第一列构建了索引(B+树),其余的都是对各列按序排列。id + 1无法使用索引。like %+…无法使用索引。前缀索引(前十个能区分,不用整体)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值