自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 收藏
  • 关注

原创 从 WebKit 看浏览器内核架构

从 WebKit 看浏览器内核架构

2023-05-24 23:55:30 1017

原创 CPU 如何访问内存

现在,我们已经清楚地知道了,CPU 把一个整数数据当成地址,放在地址总线上,由地址译码器选择该地址正确索引的设备或者内存进行访问。CPU 通过什么访问内存,以及地址的本质是什么,我们已经找到答案了,用一句话概括就是:CPU 通过地址访问内存,地址的本质是整数数据,而整数数据的本质是电子信号的组合。而这个整数代表了一个内存单元的索引号,CPU 访问内存的时候,硬件的地址译码器会负责把索引号,转换成相应的地址信号和片选信号,帮助 CPU“寻路”,找到特定的内存单元位置。《计算机基础实战课》

2023-05-23 23:35:59 1035

原创 为什么 RISC 的 CPU 能同时执行多条指令?

RISC——精简指令集计算机体系结构,RISC 设计方案非常简约,通常有 20 多条指令的简化指令集。每条指令长度固定,由专用的加载和储存指令用于访问内存,减少了内存寻址方式,大多数运算指令只能访问操作寄存器。而 CPU 中配有大量的寄存器,这些指令选取的都是工程中使用频率最高的指令。由于指令长度一致,功能单一,操作依赖于寄存器,这些特性使得 CPU 指令预取、分支预测、指令流水线等部件的效能大大发挥,几乎一个时钟周期能执行多条指令。为什么 RISC 的 CPU 能同时执行多条指令?《计算机基础实战课》

2023-05-22 23:49:28 318

原创 什么是芯片

在集成电路发展初期,这样的这样的性能是不可想像的。想实现具备一定功能的电路,离不开晶体管、电阻、电容等元件及它们之间的连接导线,把这些集成到硅片上,再经过测试、封装,就成了最终的产品——芯片。CPU 运行程序会循环执行上述五个阶段,它既是程序指令的执行者,又被程序中相关的指令所驱动,最后实现了相关的计算功能。芯片是所有半导体元器件的统称,它是把一定数量的常用电子元件(如电阻、电容、晶体管等),以及这些元件之间的连线,通过半导体工艺集成在一起的、具有特定功能的电路。《计算机基础实战课》

2023-05-21 23:40:33 699

原创 如何基于链表实现 LRU 缓存淘汰算法?

它的原则是,如果一个数据最近没有被访问到,那么它将来被访问的几率也很小,也就是说当限定的内存空间已没有其他空间可用时,应该把最久没有访问到的数据去除掉。1. 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。除了基于链表的实现思路,实际上还可以用数组来实现 LRU 缓存淘汰策略。如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。《数据结构与算法之美》

2023-05-20 23:50:11 89

原创 用空间换时间——缓存

用空间换时间——缓存

2023-05-19 23:45:58 141

原创 单链表和双向链表如何执行删除操作

对于第二种情况,我们已经找到了要删除的结点,但是删除某个结点 q 需要知道其前驱结点,而单链表并不支持直接获取前驱结点,所以,为了找到前驱结点,我们还是要从头结点开始遍历链表,直到 p->next=q,说明 p 是 q 的前驱结点。所以,针对第二种情况,单链表删除操作需要 O(n) 的时间复杂度,而双向链表只需要在 O(1) 的时间复杂度内就搞定了!删除操作时间复杂度是 O(1),但是遍历耗费的时间是O(n),根据时间复杂度分析中的加法法则,删除值等于给定值的结点对应的链表操作的总时间复杂度为 O(n)。

2023-05-18 23:53:21 634

原创 链表——循环链表和双向链表

而双向链表,顾名思义,它支持两个方向,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点。所以,如果存储同样多的数据,双向链表要比单链表占用更多的内存空间。从结构上来看,双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。比如著名的约瑟夫问题。单链表的尾结点指针指向空地址,表示这就是最后的结点了。而循环链表的尾结点指针是指向链表的头结点。《数据结构与算法之美》

2023-05-17 23:52:19 170

原创 链表之单链表

单链表

2023-05-16 23:53:27 64

原创 数组和链表的存储机制

数组和链表的存储机制

2023-05-15 23:51:00 102

原创 为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始

为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始

2023-05-12 23:55:32 322

原创 容器和数组的较量

容器和数组的较量

2023-05-11 23:49:07 316

原创 数组的访问越界问题

数组的访问越界

2023-05-10 23:19:00 199

原创 数组低效的“插入”和“删除”

数组低效的“插入”和“删除”

2023-05-09 22:55:20 908

原创 数组是如何实现根据下标随机访问数组元素

数组是如何实现根据下标随机访问数组元素

2023-05-08 23:51:09 273

原创 数组的特性

第二个是连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。

2023-05-07 23:31:25 84

原创 均摊时间复杂度

假设数组的长度是 n,根据数据插入的位置的不同,我们可以分为 n 种情况,每种情况的时间复杂度是 O(1)。当数组满了之后,也就是代码中的 count == array.length 时,我们用 for 循环遍历数组求和,并清空数组,将求和之后的 sum 值放到数组的第一个位置,然后再将新的数据插入。每一次 O(n) 的插入操作,都会跟着 n-1 次 O(1) 的插入操作,所以把耗时多的那次操作均摊到接下来的 n-1 次耗时少的操作上,均摊下来,这一组连续的操作的均摊时间复杂度就是 O(1)。

2023-05-06 23:49:25 542

原创 平均情况时间复杂度

要查找的变量 x,要么在数组里,要么就不在数组里。这两种情况对应的概率统计起来很麻烦,为了方便你理解,我们假设在数组中与不在数组中的概率都为 1/2。另外,要查找的数据出现在 0~n-1 这 n 个位置的概率也是一样的,为 1/n。所以,根据概率乘法法则,要查找的数据出现在 0~n-1 中任意位置的概率就是 1/(2n)。我们把每种情况下,查找需要遍历的元素个数累加起来,然后再除以 n+1,就可以得到需要遍历的元素个数的平均值。这个结论虽然是正确的,但是n+1 种情况,出现的概率并不是一样的。

2023-05-05 22:51:07 624

原创 浅析最好、最坏情况时间复杂度

最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度,我们需要引入另一个概念:平均情况时间复杂度,后面我简称为。为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念:最好情况时间复杂度、最坏情况时间复杂度和平均情况时间复杂度。就是,在最理想的情况下,执行这段代码的时间复杂度,例如上述的。,所以,不同的情况下,这段代码的时间复杂度是不一样的。就是,在最糟糕的情况下,执行这段代码的时间复杂度。最好、最坏情况时间复杂度。

2023-05-04 23:40:39 144

原创 空间复杂度分析

有人说,我们项目之前都会进行性能测试,再做代码的时间复杂度、空间复杂度分析,是不是多此一举呢?而且,每段代码都分析一下时间复杂度、空间复杂度,是不是很浪费时间呢?同理:空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。

2023-05-03 23:48:16 77

原创 几种常见时间复杂度实例分析

所以,上面代码的时间复杂度就是 O(m+n)。针对这种情况,原来的加法法则就不正确了,我们需要将加法规则改为:T1(m) + T2(n) = O(f(m) + g(n))。但是乘法法则继续有效:T1(m)*T2(n) = O(f(m) * f(n))。如果一段代码的时间复杂度是 O(logn),我们循环执行 n 遍,时间复杂度就是 O(nlogn) 了。比如这段代码,即便有 3 行,它的时间复杂度也是 O(1),而不是 O(3)。平方阶O(n2 ),立方阶O(n3 )...k次方阶O(nk)

2023-05-02 23:49:02 1150

原创 时间复杂度分析

总的时间复杂度就等于量级最大的那段代码的时间复杂度。那我们将这个规律抽象成公式就是:如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).那么 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)).因此分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。如何分析一段代码的时间复杂度?

2023-05-01 23:27:59 84

原创 数据结构与算法之大 O 复杂度

第一个例子中的 T(n) = O(2n+2),第二个例子中的 T(n) = O(2n2+2n+3)。大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。尽管我们不知道 unit_time 的具体值,但是通过这两段代码执行时间的推导过程,我们可以得到一个非常重要的规律,那就是,所有代码的执行时间 T(n) 与每行代码的执行次数 f(n) 成正比。

2023-04-30 23:21:53 50

原创 数据结构与算法之复杂度分析存在的意义

数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。执行效率是算法一个非常重要的考量指标,即时间、空间复杂度分析(在我初学的时候,我觉得挺难的,那经历了几年的项目经验,回过头来,我想看看是否很难)

2023-04-29 23:45:43 998

原创 如何学习数据结构和算法

首先我们了解数据结构和算法的定义:从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

2023-04-28 23:50:24 1173

原创 学习数据结构和算法的理由

我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。不管你是初入职场的初级工程师,还是工作多年的资深架构师,又或者是想转人工智能、区块链这些热门领域的程序员,数据结构与算法作为计算机的基础知识、核心知识,都是必须要掌握的。如果你在一家成熟的公司,或者 BAT 这样的大公司,面对的是千万级甚至亿级的用户,开发的是 TB、PB 级别数据的处理系统。这个时候,数据结构和算法的意义就完全凸显出来了。

2023-04-27 23:55:11 267

原创 为什么要学习算法

人生路上,我们会遇到很多的坎。跨过去,你就可以成长,跨不过去就是困难和停滞。对于我们技术人来说,更是这样。既然数据结构和算法这个坎,我们总归是要跨过去,为什么不是现在呢?所以基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。其实像区块链、人工智能这些看似很新的技术,其实一点儿都不“新”,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。其实这些大学的时候这些我都学过,苦于大学贪玩又不想沉下心学习,以至于现在很后悔。

2023-04-26 23:56:39 518

原创 练好基本功,优秀工程师成长第一步

想要成为优秀工程师,就需要你深入芯片、内存、语言、应用、IO 与文件等这些基础组件学习研究,甚至还要钻研语言指令的运转,搞懂芯片尤其是 CPU 的机制原理。这些基础,不仅仅是对计算机本身很重要,对从事计算机的任何细分行业的每个人都很重要。一个人的自我学习能力和态度决定着技术成就,不然只会陷入 CRUD Boy 或者 API Caller 的圈子里,终日忙忙碌碌却依旧原地踏步。IT 人就是要时刻保持学习,才能不会被淘汰。此文章为4月Day25学习笔记,内容来源于。计算机基础要怎么学?

2023-04-25 23:50:25 362

原创 接手了一个新项目, 怎么对前端合理规划

有了整体方案,到前端的一亩三分地上,技术选型、工程规范是绕不开的,有些公司有统一的前端团队,框架和工具都定好了,那么项目里面,就剩下分工和代码设计问题了,也有些公司有些项目具有特殊性,需要特别定制。再往下细说,一个完整的方案可能包括产品、运营、市场、技术,不同的项目,各个职能的难度不一样,有些项目可能干脆不需要某些方案——比如多数淘宝的产品,首页开个入口就有访问量了,不需要独立去做市场。背景和目标通常来自公司的业务,方案跟具体的技术相关,计划是项目管理的领域,最后根据这些来给出预期结果。

2023-04-24 23:14:42 152

原创 一些前端问题2

8.对于一个后端开发者来说,前端最困难的东西永远是 CSS 布局而不是 JavaScript,我们对 CSS 有很大畏惧和恐慌在于:CSS 没有很好的调试工具能解决问题,即使 chrome dev 这样的顶级 debug 工具,有时候也很难解释诸如“为什么页面上的这个盒子在这个地方”这样的问题。答:这一部分,首先你需要一个比较通用的日志服务,能接受前端用 HTTP 请求的方式打一些日志进去,一般公司都会有这样的系统,如果没有,就需要新建一个,这部分比较麻烦,需要一定的专业知识。如果缓存的是 CSS 呢?

2023-04-23 23:09:13 624

原创 一些前端问题

前端

2023-04-22 22:56:39 560

原创 前端交互的本质演变

前端交互

2023-04-21 23:14:42 39

原创 前端和图形学

前端和图形学

2023-04-20 23:57:20 87

原创 前端架构核心问题

前端架构核心问题

2023-04-19 23:56:24 446

原创 搭建系统。

搭建系统

2023-04-18 18:59:57 509

原创 前端团队协同工作,如何保证质量

前端团队协同工作

2023-04-17 22:50:42 381

原创 从工程的角度谈一谈工具体系的规划

从工程的角度谈一谈工具体系的规划

2023-04-16 23:50:29 164

原创 前端的性能对业务数据的影响

性能优化之前端的性能对业务数据的影响

2023-04-15 23:44:45 528

原创 浏览器事件:捕获过程和冒泡过程

捕获与冒泡,焦点,自定义事件

2023-04-14 23:38:52 415

原创 CSSOM和CSSOM View

CSSOM和CSSOM View

2023-04-13 23:42:17 367

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除