算法/思维优化笔记

1. 判断循环链表:

取两个对象,一个往前有一格,一个走两格,如果是循环链表,两数会有相等的时候。

2. 求最大公约数:

更相减损术+位运算

3. 判断是否为偶数:

a&1是否等于1或者0即可(最快)

4. 红黑树:

红黑树是二叉树的改进版,除了需要满了二叉树的特性,还需要满足五条规则,不满足时需要变色来解决,变色也无法解决时需要旋转

五条规则如下:

1. 节点是红色或黑色
2. 根节点是黑色
3. 每个叶子节点都是黑色的空节点(NIL节点)
4. 每个红色节点的两个子节点都是黑色(从每个叶子到跟的所有路径上不能有两个连续的红色节点)
5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

红黑树在哪里被应用到呢?

在JDK的集合类TreeMap和TreeSet底层就是红黑树实现的,在java8中,HashMap也用到了红黑树。

5. 动态规划:

三个核心元素:最优子结构、边界、状态转移方程式

6. 什么是中台?

业务技术等通过下层,得到的基本通用底层,可以支援更多的业务技术等情况,称为中台。相当于java里面的jar包

按照不同的功能和角色,中台可以划分成四个维度:

业务中台、技术中台、数据中台、算法中台

7. mysql执行计划(explain关键字)

1 什么是explain? 

通过在sql语句前增加explain关键字,返回执行计划的信息。(结果与mysql版本有关系)

注意:如果from中包含子查询,仍会执行该子查询,并将结果放入临时表中

2 explain的作用?

        1. 分析sql语句和表结构的性能瓶颈

        2. 了解数据表的查询顺序,表的操作类型,索引命中等

3 结果字段详解

        1. id : 数值多大,执行优先级越高,同优先级执行顺序从上至下

        2. select_type列: 标明查询类型

                simple: 表明对应的select是简单查询,不包含子查询和union

                primary: 复杂查询最外层的select

                subquery: 包含在select中的子查询(不在from中)

                derived: 包含在from中的子查询

                union: 若第二个select出现在union之后,则被标记为union;若union包含在from子句的                             子查询中,外层select将被标记为derived

                union result : 从union表获取结果的select

        3. table : 表示正在访问哪个表

                如果是别名就显示别名,

                如果不涉及对数据表的操作,就显示null

                如果显示为<union N>,表示是个临时表,N表示执行计划的id

                如果显示为<union M,N>,表示是个临时表,结果来自执行计划的结果集中

        4. type : 决定mysql如何去查询数据表中的行,优劣顺序为:

null > system > const > eq_ref > ref >range > index > all 

,一般来说,需要保证查询达到range , 最好能达到ref

                null : mysql在分解查询阶段即可得到结果,就不在访问表或索引,如:

explain select min(user_id) from t_user;

                system : 表中只有一行数据(等于系统表),这是const类型的特例

                const :使用唯一索引或者主键,表示通过索引一次就找到了, const用于比较primary key 或者unique索引。 如果将主键置于where中,查询就会变成const类型。

                eq_ref : 唯一性索引扫描,表中只有一行数据与之匹配。

                ref :非唯一性索引扫描(比如普通索引)

                range : 索引范围扫描,出现在in(), between, >, <, >=等操作符中

                index: 扫描全表索引,将索引树从头到尾扫描一遍

                all: 全表扫描,未使用索引

        5. possible_keys : 给出可能用到的索引

        6. key :显示查询实际用到的索引

        7. key_len :用于处理查询的索引长度,表示索引中使用到的字节数(估算),可以估算一个多列索引中实际使用了哪一部分

        8. ref : 表示和key一起被使用的字段、常量、函数等

        9. rows : 表示mysql根据表统计及索引选用情况,大致估算找到所需目标需要的行数

        10. extra : 展示重要的额外信息

                 

暂停~ 明天收藏夹学习

7.* 其他扩展命令

扩展命令:

explain extended: 提供一些额外的信息,执行后通过show warnings 得到优化后的查询语句(一会儿验证)

explain partitions: 分析使用了分区的表,会显示出可能用到的分区。(感觉用到的机会不多)

8. 什么是mysql索引?

mysql的索引结构:B+Tree<==BTree<==Tree

Tree:传统二叉树(二叉搜索),每个节点只能储存一个记录,不适合作索引存储。

BTree: N叉搜索,高度降低,查询快。叶子节点和非叶子节点都可以存储多个数据。通过中序遍历,可以访问树上所有节点。

B+Tree:非叶子节点不在存储数据,而是存储数据的记录(Key,通过key指向具体数据)

Cardinality 索引基数

索引基数越大(每一行数据之间的区分度),索引执行更高效

索引类型:

1. 主键索引
2. 唯一性索引
3. 普通索引
4. 全文索引:然并卵(效率不高),建议使用Luence,Solr,ES等方案,专业且强大

在什么字段上创建索引比较好?

​    区分度高,暂用资源少的字段

什么时候不走索引?

1. 有索引参与计算(包括函数计算):
   1. SELECT sname FROM stu WHERE age+10=30; 
   2. SELECT sname FROM stu WHERE LEFT(`date`,4) <1990;
2. 左模糊:
   1. SELECT * FROM table WHERE uname LIKE "%关键字%"
3. 字符类型不一致(a为char类型,1为整数类型):
   1. SELECT * FROM table WHERE a=1
4. 如果有or,有一个字段没有索引就全部不走索引:
   1. SELECT * FROM table WHEREdname='xxx' or loc='xx' or deptno=45
5. 正则表达式,regexp不走索引
6. 表中数据不多,只有几十几百条,MySQL评估使用全表扫描要比使用索引快,也不使用索引(不要大惊小怪)

复合索引什么时候不走索引?

1. 查询条件不包含复合索引的第一个字段

9. 单例模式

1. 普通单例模式:

java
public class Singleton {
    private Singleton() {}  //私有构造函数
    private volatile static Singleton instance = null;  //单例对象
    //静态工厂方法
    public static Singleton getInstance() {
          if (instance == null) {      //双重检测机制
         synchronized (Singleton.class){  //同步锁
           if (instance == null) {     //双重检测机制
             instance = new Singleton();
                }
             }
          }
          return instance;
      }
}

2. 用静态实现单例模式:

java
public class Singleton {
    private static class LazyHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}

3. 用枚举实现单例模式(解决能被映射的问题):

java
public enum SingletonEnum {
    INSTANCE;
}

4. 利用反射打破规则:

java
   //获得构造器
   Constructor con = Singleton.class.getDeclaredConstructor();
   //设置为可访问
   con.setAccessible(true);
   //构造两个不同的对象
   Singleton singleton1 = (Singleton)con.newInstance();
   Singleton singleton2 = (Singleton)con.newInstance();
   //验证是否是不同对象
   System.out.println(singleton1.equals(singleton2));

10. 策略模式

适用场景:类比较多,用于替换if-else,待续...

11.服务熔断

雪崩:蝴蝶效应下的连锁故障

开启熔断:开启后,后续对该服务的调用不再经过网络,直接执行本地默认方法。

熔断恢复:恢复后,如果还有时间,再次接受调用方的远程调用

实现服务熔断的框架:Spring Cloud Hystrix

12.jvm回收机制

引用计数算法:引用的计数加一,删除引用对象,计数减一,为0时会被回收

可达性分析算法:确定一系列根对象,然后生成引用链,不在引用链的对象会被认为可回收

        哪些能作为跟对象?

        1. 虚拟机栈中引用的对象(正在运行的方法使用到的变量、参数等)

        2. 方法区中类静态属性引用的对象(static关键字声明的字段)

        3. 方发区中常量引用的对象(final关键字声明的字段)

        4. 本地方法栈中引用的对象(native方法)

        5. java虚拟机内部的引用(系统内部的东西)

标记清除算法:

1.标记需要清除的区别

2. 清除(把起始结束地址放入空闲列表里)

优点:速度快

缺点:执行效率不稳定;涉及内存碎片化问题(标记清除算法最大问题)

标记移动算法:

优点:解决内存碎片化问题

缺点:涉及到了对象移动的问题,在整理阶段需要更新引用,效率低

标记复制算法:

1.复制:把正在使用的内存块中的存活对象复制到未被使用的内存块中

2.清理:清理内存块中所有对象

3.易位

优点:不需要标记,提升效率,也不会有内存碎片化问题

缺点:double空间

分代垃圾回收机制:

新生代 :伊甸园、幸存区from、幸存区to

老年代

过程:

伊甸园区满了==>

触发一次垃圾回收(MinorGC)==>

进行可达性分析==>利用标记复制算法==>

将伊甸园和幸存区from中有用的对象复制到幸存区to,并清空==>

from区和to区的逻辑位置交换(保证to区永远是空的)==>

存活下来的对象记录一次幸存值,达到15后移入老年区==>

如果老年代内存也满了==>触发Full GC,执行新生代,老年代的大清理

垃圾回收器:

进行内存回收的工具: Serial,Paraller Scavenge, CMS, G1等等......

13.原型模型

保护性拷贝:通过实现Cloneable()接口(标识接口,标识这个类是可拷贝的),并且调用clone()方法(Object类中的常用方法,用于拷贝),实现保护性拷贝

浅拷贝:只拷贝某个需要的类

深拷贝:对于有多层对象的,每个对象都需要实现Cloneable并重写clone()方法,才可以实现了对象的串行层层拷贝。

特点:牺牲开发效率提升性能的设计模式

原型模型的核心用途:

        1. 解决复杂对象的资源消耗问题,提升创建对象的效率。

        2. 保护性拷贝,防止外部对只读对象进行修改。

14.Object类Object类是所有类的基类,是核心中的核心,具体包含了九大常用方法,分别是clone(),getClass(),finalize(),toString(),equals(),hashcode(),wait(),notify(),notifyAll()

clone():拷贝类

getClass():获取一个类的运行时类,进而通过该类返回的Class对象,获取该类的相关信息(不同VM针对Class做了不同优化,所以getClass()的实现也并不相同)。

finalize():是Object的protected方法,在发生GC时触发该方法。 主要思路判断该对象不可达就回收对象,否则执行finalize()之后再次判断。

toString():除了基本功能外,还可实现equals()重写,hashcode()重写

15. HTTP协议和HTTPS协议

HTTP协议:Hyper Text Transfer Protocol(超文本传输协议),位于TCP/IP四层模型当中的应用层。

这种模式采用明文方式传输信息,显然是不够安全的,不过别担心,我们可以加密,加密方式:

对称加密方式:

非对称加密方式:

HTTPS协议在http协议的基础上增加SSL安全层,证书认证等相关操作就是在SSL层完成的。

最新推出的TLS协议,是SSL 3.0协议的升级版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值