柿子先生的博客

我有半亩良田,种有柿子两棵

将多个字段组合成一个索引,这个索引就是联合索引。联合索引会按照「最左匹配」原则,进行索引匹配。

联合索引的范围查询中,遇到 >、< 会停止匹配,范围查询的字段可以使用联合索引,但是范围查询字段后面的字段就无法使用了,而对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配。

MySQL 5.6 引入了索引下推优化,可以在联合索引遍历过程中,对联合索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

在建立联合索引时,要把区分度大的字段排在前面,效率更高。MySQL 有查询优化器,如果字段在表的数据行中占比超过界限(30%),会忽略索引,进行全表扫描。

索引的最大好处就是能够提高查询速度,但是创建索引和维护索引不仅耗时,索引还会占用空间,并且因为要动态维护索引而降低增删改的效率。

推荐对唯一字段、用于 WHERE、GROUP BY、ORDER BY 的字段建立索引,不推荐对数据量很小的表、存在大量重复数据的字段以及经常更新的字段建立索引。

阅读全文 »

对外一般使用 HTTP 协议,内部集群和微服务之间采用 RPC 协议。HTTP 和 RPC 的服务发现方式基本一致;HTTP1.1 和 RPC 都会建立 TCP 长连接,RPC 还会建个连接池,而一些编程语言的网络库也会给 HTTP 加个连接池;HTTP1.1 采用 Json 来序列化结构体,而 RPC 会使用 Protobuf 等体积更小的序列化协议,并且无需考虑复杂的浏览器行为,性能更高。当然 HTTP2 的性能更好,比如 gRPC 的底层就直接使用 HTTP2。

阅读全文 »

在上一篇,我们知道了 Java IO 的基本使用,从本篇开始,我们一起来探究设计模式是如何在 Java IO 中应用的。首先,我们先要学习的是装饰器模式。

我相信,友好的讨论交流会让彼此快速进步!文章难免有疏漏之处,十分欢迎大家在评论区中批评指正。

阅读全文 »

引言

Donald E.Knuth 在《计算机程序设计艺术》的第 3 卷《排序和查找》中说到:“尽管第一个二分查找算法于 1946 年出现,然而第一个完全正确的二分查找算法实现直到 1962 年才出现。”

二分查找算法的最基础应用场景:在无重复元素有序数组中,查找目标值的元素。这种场景的代码实现确实比较简单。但是,二分查找算法的变形问题可就不那么简单了。

比如,在有重复元素有序数组中,查找第一个值等于目标值的元素、查找最后一个值等于目标值的元素查找第一个大于等于目标值的元素查找最后一个小于等于目标值的元素。你可以先自己试试看能否解决这些问题。

二分查找算法经常出现在大厂面试中的手撕环节,考察过该题目的公司有:拼多多、美团、腾讯、阿里巴巴、百度、华为等大厂。

我相信,友好的讨论交流会让彼此快速进步!文章难免有疏漏之处,十分欢迎大家在评论区中批评指正。

读完本篇文章,你将能轻松解决如下问题:

为了照顾完全不了解二分查找算法的新同学,文章将从最基本的二分查找算法讲起,探讨四种变体问题,给出两个实际应用问题,最后给出几个难易程度不同的算法问题用于练习。

阅读全文 »

Java IO 一直以来是大厂面试题中的高频考点,本文将从 Java IO 基础使用说起,以案例 + 源码的方式讲解文件、字节流、字符流、缓冲流、打印流、随机访问流等基础内容,再深入到 Java IO 模型与设计模式,从而构建起对 Java IO 的全面认知。

文章不仅适合完全不了解 Java IO 的新同学,也适合具备一定知识储备的老同学。文中的所有案例代码强烈推荐手写复现一遍,以更好地掌握 Java IO 编程基础。

文章的结尾处给出了更新日志,每次新更新的内容都会写明,便于同学们快速了解更新的内容是否是自己所需要的知识点。

我相信,友好的讨论交流会让彼此快速进步!文章难免有疏漏之处,十分欢迎大家在评论区中批评指正。

阅读全文 »

本文介绍了双指针技巧在链表、数组以及字符串中的使用,给出了大量大厂常见面试手撕题目的思路及代码,不仅适合完全不了解双指针技巧的读者,也适合老司机复习拓展。

考察过该技巧的公司有阿里巴巴、腾讯、美团、拼多多、百度、华为等大厂。

我相信,友好的讨论交流会让彼此快速进步!文章难免有疏漏之处,十分欢迎大家在评论区中批评指正。

食用指南: ⭐️为一刷必做题,便于快速理解双指针技巧;无星题目可在刷完⭐️题目后再做,用于拓展学习双指针技巧如何与其他算法知识结合使用。

日志更新:文章底部给出了更新日志,帮助小伙伴们快速知晓最近优化了哪些技巧,更新了哪些题目。

我相信,友好的讨论交流会让彼此快速进步!文章难免有疏漏之处,十分欢迎大家在评论区中批评指正。

阅读全文 »

Trie 树,又名字典树、前缀树、单词查找树,是一种二叉树衍生出来的高级数据结构,主要应用场景是处理字符串前缀相关的操作。

本文在《算法(4th)》的单词查找树的基础上,参考《labuladong 的算法小抄》与《程序员代码指南》对其进行改进。

阅读全文 »

二叉树解题思维分两类:

  1. 是否可以通过遍历一遍二叉树得到答案?

    如果可以,用一个 traverse 函数配合外部变量来实现,这叫 「遍历」的思维模式。

  2. 是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?

    如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。

无论哪种思维模式,我们都需要思考:

如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。

本文解决了如下题目:

力扣第 104 题「二叉树的最大深度」

力扣第 144 题「二叉树的前序遍历」

力扣第 543 题「二叉树的直径」

剑指 Offer 第 55 题 「二叉树的深度」

阅读全文 »

相似解法题目多元组

  • 双指针:< BM5 合并 k 个已排序的链表,BM6 判断链表中是否有环, BM7 链表中环的入口点,BM8 链表中倒数最后 k 个节点,BM9 删除链表的倒数第 n 个节点,BM10 两个链表的第一个公共节点,BM13 判断一个链表是否为回文结构,BM14 链表的奇偶重排>

  • 环:< BM6 判断链表中是否有环, BM7 链表中环的入口点 >

  • 双指针定位倒数节点:< BM8 链表中倒数最后 k 个节点, BM9 删除链表的倒数第 n 个节点 >

  • 反转链表:< BM1 反转链表, BM11 链表相加(二)>

  • 归并排序:< BM5 合并 k 个已排序的链表,BM12 单链表的排序,BM20 数组中的逆序对 >

阅读全文 »

本文是 二叉树与递归的框架思维「详解版」的关键知识总结。

二叉树解题思维分两类:

  1. 是否可以通过遍历一遍二叉树得到答案?

    如果可以,用一个 traverse 函数配合外部变量来实现,这叫 「遍历」的思维模式。

  2. 是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?

    如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。

无论哪种思维模式,我们都需要思考:

如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。

二叉树的所有问题,就是让你在前中后序位置注入巧妙的代码逻辑,去达到自己的目的,你只需要单独思考每一个节点应该做什么,其他的不用你管,抛给二叉树遍历框架,递归会在所有节点上做相同的操作。

阅读全文 »