热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法/思维优化笔记

1.判断循环链表:取两个对象,一个往前有一格,一个走两格,如果是循环链表,两数会有相等的时候。2.求最大公约

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

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

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

        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 : 索引范围扫描&#xff0c;出现在in(), between, >, <, >&#61;等操作符中

                index&#xff1a; 扫描全表索引&#xff0c;将索引树从头到尾扫描一遍

                all&#xff1a; 全表扫描&#xff0c;未使用索引

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

        6. key &#xff1a;显示查询实际用到的索引

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

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

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

        10. extra &#xff1a; 展示重要的额外信息

                 

暂停~ 明天收藏夹学习

7.* 其他扩展命令

扩展命令&#xff1a;

explain extended: 提供一些额外的信息&#xff0c;执行后通过show warnings 得到优化后的查询语句&#xff08;一会儿验证&#xff09;

explain partitions&#xff1a; 分析使用了分区的表&#xff0c;会显示出可能用到的分区。&#xff08;感觉用到的机会不多&#xff09;


8. 什么是mysql索引&#xff1f;

mysql的索引结构&#xff1a;B&#43;Tree<&#61;&#61;BTree<&#61;&#61;Tree

Tree:传统二叉树&#xff08;二叉搜索&#xff09;&#xff0c;每个节点只能储存一个记录&#xff0c;不适合作索引存储。

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

B&#43;Tree&#xff1a;非叶子节点不在存储数据&#xff0c;而是存储数据的记录&#xff08;Key,通过key指向具体数据&#xff09;

Cardinality 索引基数

索引基数越大&#xff08;每一行数据之间的区分度&#xff09;&#xff0c;索引执行更高效

索引类型&#xff1a;

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

在什么字段上创建索引比较好&#xff1f;

​    区分度高&#xff0c;暂用资源少的字段

什么时候不走索引&#xff1f;

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

复合索引什么时候不走索引&#xff1f;

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

9. 单例模式

1. 普通单例模式&#xff1a;

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

2. 用静态实现单例模式&#xff1a;

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

3. 用枚举实现单例模式&#xff08;解决能被映射的问题&#xff09;&#xff1a;

java
public enum SingletonEnum {INSTANCE;
}

4. 利用反射打破规则&#xff1a;

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

10. 策略模式

适用场景&#xff1a;类比较多&#xff0c;用于替换if-else&#xff0c;待续...

11.服务熔断

雪崩&#xff1a;蝴蝶效应下的连锁故障

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

熔断恢复&#xff1a;恢复后&#xff0c;如果还有时间&#xff0c;再次接受调用方的远程调用

实现服务熔断的框架&#xff1a;Spring Cloud Hystrix

12.jvm回收机制

引用计数算法&#xff1a;引用的计数加一&#xff0c;删除引用对象&#xff0c;计数减一&#xff0c;为0时会被回收

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

        哪些能作为跟对象&#xff1f;

        1. 虚拟机栈中引用的对象&#xff08;正在运行的方法使用到的变量、参数等&#xff09;

        2. 方法区中类静态属性引用的对象&#xff08;static关键字声明的字段&#xff09;

        3. 方发区中常量引用的对象&#xff08;final关键字声明的字段&#xff09;

        4. 本地方法栈中引用的对象&#xff08;native方法&#xff09;

        5. java虚拟机内部的引用&#xff08;系统内部的东西&#xff09;

标记清除算法&#xff1a;

1.标记需要清除的区别

2. 清除&#xff08;把起始结束地址放入空闲列表里&#xff09;

优点&#xff1a;速度快

缺点&#xff1a;执行效率不稳定&#xff1b;涉及内存碎片化问题&#xff08;标记清除算法最大问题&#xff09;

标记移动算法&#xff1a;

优点&#xff1a;解决内存碎片化问题

缺点&#xff1a;涉及到了对象移动的问题&#xff0c;在整理阶段需要更新引用&#xff0c;效率低

标记复制算法&#xff1a;

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

2.清理&#xff1a;清理内存块中所有对象

3.易位

优点&#xff1a;不需要标记&#xff0c;提升效率&#xff0c;也不会有内存碎片化问题

缺点&#xff1a;double空间

分代垃圾回收机制&#xff1a;

新生代 &#xff1a;伊甸园、幸存区from、幸存区to

老年代

过程&#xff1a;

伊甸园区满了&#61;&#61;>

触发一次垃圾回收&#xff08;MinorGC&#xff09;&#61;&#61;>

进行可达性分析&#61;&#61;>利用标记复制算法&#61;&#61;>

将伊甸园和幸存区from中有用的对象复制到幸存区to&#xff0c;并清空&#61;&#61;>

from区和to区的逻辑位置交换&#xff08;保证to区永远是空的&#xff09;&#61;&#61;>

存活下来的对象记录一次幸存值&#xff0c;达到15后移入老年区&#61;&#61;>

如果老年代内存也满了&#61;&#61;>触发Full GC&#xff0c;执行新生代&#xff0c;老年代的大清理

垃圾回收器&#xff1a;

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

13.原型模型

保护性拷贝&#xff1a;通过实现Cloneable()接口&#xff08;标识接口&#xff0c;标识这个类是可拷贝的&#xff09;&#xff0c;并且调用clone()方法&#xff08;Object类中的常用方法&#xff0c;用于拷贝&#xff09;&#xff0c;实现保护性拷贝

浅拷贝&#xff1a;只拷贝某个需要的类

深拷贝&#xff1a;对于有多层对象的&#xff0c;每个对象都需要实现Cloneable并重写clone&#xff08;&#xff09;方法&#xff0c;才可以实现了对象的串行层层拷贝。

特点&#xff1a;牺牲开发效率提升性能的设计模式

原型模型的核心用途&#xff1a;

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

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

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

clone()&#xff1a;拷贝类

getClass&#xff08;&#xff09;&#xff1a;获取一个类的运行时类&#xff0c;进而通过该类返回的Class对象&#xff0c;获取该类的相关信息&#xff08;不同VM针对Class做了不同优化&#xff0c;所以getClass&#xff08;&#xff09;的实现也并不相同&#xff09;。

finalize&#xff08;&#xff09;&#xff1a;是Object的protected方法&#xff0c;在发生GC时触发该方法。 主要思路判断该对象不可达就回收对象&#xff0c;否则执行finalize&#xff08;&#xff09;之后再次判断。

toString()&#xff1a;除了基本功能外&#xff0c;还可实现equals&#xff08;&#xff09;重写&#xff0c;hashcode&#xff08;&#xff09;重写

15. HTTP协议和HTTPS协议

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

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

对称加密方式&#xff1a;

非对称加密方式&#xff1a;

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

最新推出的TLS协议&#xff0c;是SSL 3.0协议的升级版



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
君君-你好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有