![](https://img-blog.csdnimg.cn/20210401235457969.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
计算机科学基础
文章平均质量分 91
操作系统、计算机网络、概率论等计算机基础
BoringError
字节跳动后端工程师 | 持续学习,保持敬畏
展开
-
计算机组成原理核心总结
冯·诺依曼体系结构(Von Neumann architecture),也叫存储程序计算机结构。计算机组成原理围绕着该体系结构展开,介绍了运算器、控制器及存储器原理。原创 2022-03-20 16:41:27 · 3818 阅读 · 0 评论 -
编译原理:词法分析、语法分析、语义分析、有限自动机、上下文无关文法、BNF范式、语法分析树等核心内容总结
最近在学习编译原理相关知识,主要看的是编译器前端分析技术,主要学习的有词法分析、语法分析、语义分析、有限自动机、上下文无关文法、BNF范式、语法分析树等相关前端概念内容,后续可能使用Anltr或Peg对特定的DSL代码进行解析,学习相关内容更加有助于理解解析过程和原理。原创 2021-05-12 23:31:43 · 8612 阅读 · 2 评论 -
MySQL基础笔记(1)-深入理解索引
目录一.B树介绍1.B树是什么2.B-树介绍3.B+树介绍二.索引介绍1.索引为什么能加快查询2.MySQL索引有哪些3.为什么不在每列都创建一个索引4.什么地方建立索引5.聚簇索引和非聚簇索引(都通过B+树实现)1.聚簇索引和非聚簇索引有什么区别2.聚簇索引中主键索引和辅助索引的关系3.聚簇索引为什么要避免使用UUID作为主键6....原创 2018-05-16 21:28:47 · 5362 阅读 · 0 评论 -
LeetCode(6)-树:递归问题
一、递归 二、LeetCode相关题目 2.1、LeetCode 226. 翻转二叉树 2.2、LeetCode 104. 二叉树的最大深度 2.3、LeetCode 112. 路径总和 2.4、LeetCode 111. 二叉树的最小深度 二叉树和多叉树是一种天然的递归结构,每一个节点下的左子树或右子树(针对二叉...原创 2018-09-09 14:08:45 · 496 阅读 · 0 评论 -
设计模式(2)-观察者模式
文章目录一、什么是观察者模式二、通过设计气象站模块来说明观察者模式2.1、观察者模式设计的一般类图2.2、观察者模式带来的松耦合2.3、气象站模块需求2.4、使用观察者模式实现气象站模块观察者模式是Java标准库的开发中常用的一种设计模式,它完美的将观察者和被观察的对象分离开。当被观察者(主题)改变时,所有观察者(订阅者)都将受到改变的情况,而无论观察者处于什么样的状态。一、什么是观察...原创 2018-11-22 13:28:05 · 401 阅读 · 0 评论 -
设计模式(3)-装饰者模式
文章目录一、装饰者模式的特点二、装饰者模式的使用情景三、装饰者模式的一般关系图四、装饰者模式的代码实现五、装饰者模式使用的设计原则六、I/O流-典型的装饰者模式七、装饰者模式的弊端更多关于设计模式的文章请点击:设计模式之禅(0)-目录页装饰者模式是23种设计模式之中的一种常用的设计模式,英文叫Decorator Pattern。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一...原创 2018-11-25 11:42:35 · 608 阅读 · 0 评论 -
设计模式(4)-工厂模式
文章目录一、简单工厂模式1.1、单一new方式1.2、简单工厂模式二、抽象工厂及工厂方法2.1、将简单工厂改造成抽象工厂2.2、为抽象工厂中添加工厂方法三、工厂模式总结更多关于设计模式的文章请点击:设计模式之禅(0)-目录页工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一、简单工厂模式...原创 2018-11-26 21:50:49 · 354 阅读 · 0 评论 -
设计模式(5)-适配器模式
文章目录一、适配器模式是什么二、把鸭子“适配”为狗三、把枚举接口适配为迭代器接口更多关于设计模式的文章请点击:设计模式之禅(0)-目录页适配器模式是面向对象设计模式中常用的一种模式,它能将一个类的接口转换成用户希望的另一个接口,让原本不兼容的程序接口能够相互协作。一、适配器模式是什么**适配器模式(Adapter Pattern)**的定义是: 将一个类的接口适配成用户所期待的。...原创 2018-11-28 23:33:32 · 312 阅读 · 0 评论 -
设计模式(6)-单例模式
文章目录一、单件模式的实现二、在并发下单件模式的改进2.1、使用闭锁测试单件模式的正确性2.2、使用同步锁改进单件模式2.3、使用二重检查加锁来改进单件模式单件模式是面向对象设计模式中常用的一种设计模式,它主要的作用是使得某个对象在全局程序中只有唯一的一个实例,并且在全局中只有一个创建实例的访问点。这种模式通常采用在线程池、连接池、单一记录器等的使用和实现中。一、单件模式的实现单件模...原创 2018-11-29 11:36:37 · 293 阅读 · 0 评论 -
设计模式(7)-模板方法模式
文章目录一、模板方法模式的定义二、模板方法模式的使用更多关于设计模式的文章请点击:设计模式之禅(0)-目录页模板方法模式是23种设计模式中的一种,与其说它是一种设计模式,我更加偏向于认为它是一种设计的思想。一、模板方法模式的定义模板方法模式(Template Pattern),一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式...原创 2018-11-30 20:54:31 · 238 阅读 · 0 评论 -
设计模式(8)-迭代器模式
文章目录一、迭代器模式的相关表示1.1、迭代器角色(`Iterator`)1.2、具体迭代器角色(`Concrete Iterator`)1.3、容器角色(`Aggregate`)1.4、具体容器角色(`ConcreteAggregate`)二、List中关于迭代器的实现迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。一、迭代器...原创 2018-12-03 22:36:33 · 231 阅读 · 0 评论 -
设计模式(1)-策略模式
文章目录一、进一步的改进二、用策略模式组织类关系实例更多关于设计模式的文章请点击:设计模式之禅(0)-目录页一、进一步的改进上面的动物园例子似乎已经足够地完善了,但是仔细想想并不是这样:当另一个SmallDog被创建时,它实现了BarkBehavior接口,但是它需要在自身的代码中去重写这个bark()方法,这个bark()方法的具体实现暴露在了SmallDog类中,当我们需要修改Sma...原创 2018-11-18 14:47:53 · 691 阅读 · 0 评论 -
Java基础(5)-散列表与HashMap那点事
文章目录一. 散列表概述1.1 散列表是什么1.2 散列表的实现形式二. 散列函数三. 哈希冲突与解决方案3.1.拉链法3.2. 开放定址法四. 载荷因子五. HashMap 概述5.1.HashMap的简介5.2.HashMap的继承关系5.3 HashMap API六. 底层基本实现6.1 数组 + 链表6.2 两个重要参数:初始容量和加载因子6.3 hash(Object ...原创 2019-08-22 21:49:19 · 377 阅读 · 0 评论 -
数据结构(10)-TrieTree(字典树)的实现
Let’s Look Look What’s TrieTree!1.1 什么是TrieTreeTrieTree又被称为字典树/单词查找树/前缀树,常用来做大量的词频分析以及排序大量字符串,是哈希树的一种变种形式,它最大的特点就是每一个节点中只存放字符串的一个字符,而树的一条边即该字符串或者是其前缀,这样的特性使得字典树被广泛地应用于海量字符串处理程序中.1.2 TrieTree的实现...原创 2019-09-05 22:43:21 · 414 阅读 · 0 评论 -
LeetCode(8)-回溯:组合排列问题
文章目录1.1 LeetCode 46.全排列1.2 LeetCode 47. 全排列 II1.3 LeetCode 77. 组合 今天来总结下LeetCode上关于回溯的应用之排列组合相关的问题 - ( ゜- ゜)つロ1.1 LeetCode 46.全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,...原创 2019-09-07 21:34:30 · 288 阅读 · 0 评论 -
剑指Offer(9)-位运算问题
文章目录1.0 位运算相关1.1 二进制中1出现的次数1.2 判断一个整数是否为2的幂1.3 A改变多少次才能变为B1.0 位运算相关1.1 二进制中1出现的次数第一个做法是将n和1做与运算,若这个数的最低位为1,那么结果为1;若最低位为0,则结果为0,所以在这里可以直接累加来获取末尾1的个数。之后需要将n无符号右移1位消去最低位的1或0,继续重复上述过程,直到n为0;。(为什么不使用有符...原创 2019-10-07 16:22:45 · 225 阅读 · 0 评论 -
设计模式(9)-题外话:UML图介绍
UML图普遍用于编程中的流程表达,方便我们梳理类自身的关系或者类与类,类与接口的依赖关系等,也是学习设计模式、看懂类关系的基础。可以在实际编码前先画UML图用来表达流程,方便自己和他人理解代码。 一、UML图用来表示类与接口 1、Student类public class Student { private Long id; private Strin...原创 2020-01-29 15:20:05 · 1250 阅读 · 0 评论 -
分布式基础-大型网站架构演进过程
文章目录一.大型网站系统的特点1.大流量2.高并发3.高可用4.海量数据5.用户分布广泛6.网络情况复杂7.敏捷开发和快速迭代8.安全环境恶劣二.大型网站架构演进过程1.单机时代2.多机时代3.缓存时代4.集群时代5.读写分离时代6.反向代理与内容分发网络7.底层服务集群化8.搜索引擎技术与NoSQL9.服务拆分与微服务化本文主要参考自《大型网站技术架构:核心原理与案例分析》一书第一章节和其他...原创 2020-03-13 15:10:03 · 612 阅读 · 0 评论 -
深入理解远程过程调用
文章目录一、什么是远程过程调用1.1、一体化调用1.2、远程过程调用二、用Java实现简单RPC2.1、业务侵入型Socket2.2、无业务侵入型Socket2.3、动态代理无业务侵入型Socket2.4、Hession序列化协议2.5、RMI远程方法调用协议2.6、Dubbo服务治理框架本文主要参考自相关书籍和网络文章,并附上自身的一些理解,如有遗漏或错误,还望海涵并指出。谢谢!一、什么...原创 2020-04-30 15:14:55 · 4367 阅读 · 2 评论 -
算法学习笔记(1)-冒泡排序
简介:冒泡排序(Bubble Sort)是最为直观和易懂的排序算法之一,它的思想是前后比较,若前者大于后者就把前者和后者交换位置,就像一个重量大的泡泡一样,慢慢地浮至其他轻的泡泡之下。 Java代码: //冒泡排序,普通版本,平均时间复杂度n^2,在数组排完前面几轮已经有序后仍会继续 //排序,故在数组有序时时间复杂度仍为n^2 public static v...原创 2018-06-24 20:29:08 · 799 阅读 · 0 评论 -
算法学习笔记(2)-选择排序
选择排序(Select Sort)的思想是,在比较开始前将最小值假定为第一个数,在每轮循环的比较中找出最小的那个数,将其放到数组的前面。Java代码:public class SelectSort { public static void main(String[] args) { int[] array = {7,5,3,8,4,1,3,61,13,31,11,3};...原创 2018-06-24 21:34:27 · 247 阅读 · 0 评论 -
算法学习笔记(3)-二分查找
二分查找法(binary search)是一种思想,当需要在一段有序的数据中(升序或者降序)中查找某个数据时,如在一个形如1,2,3,4,···,99,100的数组中判断60是否存在,最简单的方式就是遍历判断原创 2018-10-04 21:25:25 · 369 阅读 · 0 评论 -
数据结构(1)-栈
栈(`stack`),是一种常见的数据结构;大部分的微处理器运用了栈的基本体系结构,当调用一个方法时,把它的返回地址和参数压入栈,当方法结束返回时,那些数据就出栈。这里涉及到的栈的特性,即`先进后出`的特性。原创 2018-10-06 00:23:26 · 308 阅读 · 0 评论 -
数据结构(2)-队列
队列结构的特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。原创 2018-10-06 14:48:42 · 327 阅读 · 0 评论 -
算法学习笔记(4)-快速排序
快速排序是图灵奖得主 C. R. A. Hoare 于 1960 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。原创 2018-10-09 00:00:50 · 2499 阅读 · 0 评论 -
数据结构(4)-链表(2)
上文讲到了链表基础构造以及链表的insertFirst和deleteFirst方法,但是这两个方法只能查询到链头和删除链头,而不能针对链表中的某个节点进行操作,所以本文主要讲解操作链表LinkList的其他两个重要的方法:find方法和delete方法。原创 2018-10-09 16:22:17 · 322 阅读 · 0 评论 -
数据结构(5)-双端链表
双端链表是一种特殊的链表,它和普通链表的差别在于,双端列表的链头不止含有对下一个结点的引用,还含有对链尾结点的引用, 所以双端链表可以对链头和链尾进行插入查找。由于前面已经详细地写过链表常用方法的实现,这里就不在赘述。原创 2018-10-10 20:02:42 · 396 阅读 · 0 评论 -
算法学习笔记(5)-堆排序
希尔排序算法(ShellSort)由计算机科学家Donald L.Shell与1959年发现,该算法基于插入排序,但是增加了一个特殊的实现机制,使得希尔排序算法能大大地优于插入排序算法。依赖于这个特殊的实现机制,使得希尔排序对多达几千的数据项的排序来说性能良好,其时间复杂度为O(N(logN)^2)。原创 2018-10-13 19:02:12 · 363 阅读 · 0 评论 -
数据结构(6)-二叉搜索树
二叉树和队列、链表等一样,都是常用的数据结构。前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。但是二叉树的出现很好地解决了这些问题。原创 2018-10-17 22:32:25 · 413 阅读 · 0 评论 -
数据结构(7)-红黑树
红黑树Red-Black Tree(简称R-B Tree)是一种二叉树类的数据结构,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。原创 2018-10-19 22:15:01 · 294 阅读 · 0 评论 -
算法学习笔记(6)-希尔排序
希尔排序的是一种改进版的插入排序,它的思想是确定一个大的步长h,以此步长为间隔通过插入排序去制造一个间隔h的有序数组,并且在每轮之后减少步长,当步长为1时完成普通的插入排序时间复杂度: 不同的序列时间复杂度会不一样代码实现public class ShellSort { public static void main(String[] args) { S...原创 2019-03-30 22:59:57 · 1123 阅读 · 0 评论 -
数据结构(3)-链表(1)
代码实现public class QuickSort extends BaseUtil { public static void quickSort(String[] array, int left, int right) { //判断是否满足递归的条件 if (left >= right) { return; ...原创 2019-03-30 23:02:17 · 261 阅读 · 0 评论 -
算法学习笔记(7)-桶排序
文章目录一、推荐阅读二、Java实现三、桶排序的优缺点桶排序是一种简单快速的排序,它在小数据范围内的排序速度可以堪比快排,它的缺点是需要产生额外的空间复杂度(或许这是常用的排序算法里空间复杂度最高的一个排序算法了),用空间来换取时间。一、推荐阅读这里推荐两篇文章,感觉蛮好的,特别是的第二篇文章最简单的排序-桶排序桶排序Java实现它的实现思路大致如下:二、Java实...原创 2019-04-01 18:00:41 · 1116 阅读 · 0 评论 -
计算机组成原理-原码、反码、补码和基本类型长度的计算
文章目录一、什么是原码、反码和补码二、基本类型所占空间推算在汇编的学习中,一开始就介绍了原码、反码和补码的关系;计算机只能识别01001这样的机器码,而汇编本质上来说是一种助记符,能够将人能读懂的助记符转化为机器才明白的机器码。而机器读取二进制是最高效的。一、什么是原码、反码和补码原码原码是带符号位的二进制数,符号位即二进制数的最高位,用0表示该二进制数为正数,用1表示该二进制数为...原创 2019-04-11 22:40:49 · 1028 阅读 · 0 评论 -
算法学习笔记(8)-归并排序
文章目录一、分治法思想二、Java代码实现2.1、自顶向下的归并排序2.2、自底向上的归并排序三、改进3.1、数据量小3.2、左右数组已经完全排好序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"...原创 2019-05-15 13:41:39 · 304 阅读 · 0 评论 -
数据结构(8)-二叉堆
文章目录一、基本概念二、二叉堆表示法2.1、确定节点位置2.2、计算堆高度三、大顶堆的算法3.1、由下至上的堆有序化3.2、由上至下的堆有序化3.3、如何理解大顶堆的上浮和下沉四、算法具体实现二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。...原创 2019-05-18 15:41:32 · 812 阅读 · 0 评论 -
数据结构(9)-优先队列
文章目录一、基本操作二、Java代码实现本文的优先队列基于大顶堆实现:数据结构(8)-二叉堆优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以...原创 2019-05-18 15:55:00 · 384 阅读 · 0 评论 -
LeetCode(7)-树:DFS/BFS类问题
文章目录1. LeetCode 144. 二叉树的前序遍历2. LeetCode 589. N叉树的前序遍历3. LeetCode 94. 二叉树的中序遍历4. LeetCode 145.二叉树的后序遍历5. LeetCode 590. N叉树的后序遍历6. LeetCode 102. 二叉树的层次遍历7. LeetCode 102. N叉树的层序遍历8. LeetCode 102. N叉树的层序...原创 2019-08-23 17:31:53 · 432 阅读 · 0 评论 -
算法学习笔记(9)-回溯算法与八皇后问题
回溯算法也叫试探搜索算法,它是一种类似于暴力枚举的搜索方法, 但是不同的是在回溯的过程中存在剪枝和状态的自转化,所以对于暴力枚举类问题,往往选择使用回溯算法,以达到优化时间和空间的目的一.用回溯算法解决问题的一般步骤1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。3 、以深度优先的方式搜索解空...原创 2019-08-24 16:25:31 · 488 阅读 · 0 评论 -
算法学习笔记(10)-缓存淘汰算法LRU
文章目录1.1 何谓LRU算法1.2 如何实现1.3 为何不直接使用HashMap作为LRU底层结构今日心情美丽,让咱们看看传说中的LRU算法是怎么一回事1.1 何谓LRU算法LRU算法指的是Least Recently Used,即最近最少使用算法,也被称作缓存淘汰算法/页面置换算法,LRU算法的基本原则是如果一个数据最近很少被访问到,那么之后也应该很少被访问到;如果一个数据最近经常被...原创 2019-09-05 13:05:33 · 342 阅读 · 0 评论