后端研究所

其他

图解|工作6年多,我还是没有搞懂什么是协程的道与术

前言大家好,我的朋友们!大白干了6年多后端,写过C/C++、Python、Go,每次说到协程的时候,脑海里就只能浮现一些关键字yeild、async、go等等。但是对于协程这个知识点,我理解的一直比较模糊,于是决定搞清楚。全文阅读预计耗时10分钟,少刷几个小视频的时间,多学点知识,想想就很划算噻!协程概念的诞生先抛一个粗浅的结论:协程从广义来说是一种设计理念,我们常说的只是具体的实现。理解好思想,技术点就很简单了,关于协程道与术的区别:上古神器COBOL协程概念的出现比线程更早,甚至可以追溯到20世纪50年代,提协程就必须要说到一门生命力极强的最早的高级编程语言COBOL。最开始我以为COBOL这门语言早就消失在历史长河中,但是我错了。COBOL语言,是一种面向过程的高级程序设计语言,主要用于数据处理,是国际上应用最广泛的一种高级语言。COBOL是英文Common
2021年10月31日
其他

图解|30张图,带你深入理解CPU流水线和分支预测的那些事儿

大家好,我的朋友们。今天来聊一个硬核的话题,本文大约需要15min,认真读完一定会有收获,走起!通过本文你将了解以下内容:stackoverflow的有趣问题CPU流水线机制和内部数据流转CPU流水线的三大冒险CPU分支预测大揭秘有趣的问题前几天摸鱼的时候,我在stackoverflow发现一个有趣的问题:https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-processing-an-unsorted-array提问者用C++写了一个数组求和的函数,把数组排序后求和和无序求和的计算性能竟然相差6倍,十分诡异。我们来看下代码:#include
2021年10月24日
其他

图解|什么是TCP拥塞控制及谷歌的BBR算法

。范·雅各布森于2012年4月入选第一批计算机名人堂,计算机名人堂简介:https://www.internethalloffame.org/inductees/van-jacobson如图为Van
2021年10月11日
其他

图解|高性能服务器的CPU是如何布局的?

今天和大家一起聊聊--服务器的多处理器架构,什么意思呢?试想一下,假如一台高性能的服务器有4个CPU,64g的内存,还有一些总线、IO等资源,服务器内部这些资源是如何布局的呢?本文并不会从逻辑电路、芯片设计、cpu历史等等角度去阐述,水平有限实战第一,通过本文你将了解到以下内容:物理核心
2021年9月14日
其他

微信支付二面:你知道什么是内容分发网络吗?

CDN的商业简史镜头拉回到20世纪90年代,当时全球范围内网络基础设施还很薄弱,尤其在骨干网接入用户越来越多,数据的长距离传输效果很差,已经阻碍了新兴网络科学的发展。4.1
2021年9月10日
其他

微信事业群二面:聊聊Cookie、Session、Token背后的故事

大家好,我是所长大白(●—●)。今天和大家聊一下关于cookie、session、token的那些事儿。这是我的一个读者朋友面试微信的实习岗位时遇到的,在此和大家分享一下。话不多说,直接开车。1.
2021年9月5日
其他

工作6年了,聊聊这些年我剁手的书

入行一年之后,内部转岗开始做通信软件开发,需要写很多shell脚本,并且用gitlab,那一年写过的脚本比近3年总和都多,《shell脚本攻略》算是第一本被我翻坏的书,真是满满的回忆啊。转服务端了
2021年8月21日
其他

图解|高性能服务器设计之缓存系统一致性

Miss后会产生回写,假如这个回写动作是在T4时刻完成,那么写入的还是老数据,如图:这种情况确实有问题,但是真是好巧不巧:事件A:更新MySQL前出现一个读请求,且缓存中无数据出现cache
2021年8月9日
其他

小黑 提桶跑路啦!

大家好,我是后端研究所大白所长!今天和大家聊一个有趣的话题:假如MySQL建表时主键ID是int32且自增的,谁也没想到业务发展这么快,今天忽然发现ID耗尽了,各种报警要炸锅了,请求作为后端owner的你该如何处理?话不多说,看看我的好兄弟小黑是如何处理的,开车!1方案一:怒刷简历
2021年8月4日
其他

图解|深入理解跳表及其在Redis中的应用

跳跃链表及其应用是非常热门的问题,深入了解其中奥秘大有裨益,不吹了,快开始品尝这美味的知识吧!跳跃链表的基本概念初识跳表跳跃列表是一种数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log
2021年6月30日
其他

如何科学破解慢SQL?

今天和大家聊一个常见的问题:慢SQL。通过本文你将了解到以下内容:慢SQL的危害SQL语句的执行过程存储引擎和索引的那些事儿慢SQL解决之道后续均以MySQL默认存储引擎InnoDB为例进行展开,话不多说,开搞!1.慢SQL的危害慢SQL,就是跑得很慢的SQL语句,你可能会问慢SQL会有啥问题吗?试想一个场景:大白和小黑端午出去玩,机票太贵于是买了高铁,火车站的人真是乌央乌央的。马上检票了,大白和小黑准备去厕所清理下库存,坑位不多,排队的人还真不少。小黑发现其中有3个坑的乘客贼慢,其他2个坑位换了好几波人,这3位坑主就是不出来。等在外面的大伙,心里很是不爽,长期占用公共资源,后面的人没法用。小黑苦笑道:这不就是厕所版的慢SQL嘛!这是实际生活中的例子,换到MySQL服务器也是一样的,毕竟科技源自生活嘛。MySQL服务器的资源(CPU、IO、内存等)是有限的,尤其在高并发场景下需要快速处理掉请求,否则一旦出现慢SQL就会阻塞掉很多正常的请求,造成大面积的失败/超时等。2.SQL语句执行过程客户端和MySQL服务端的交互过程简介:客户端发送一条SQL语句给服务端,服务端的连接器先进行账号/密码、权限等环节验证,有异常直接拒绝请求。服务端查询缓存,如果SQL语句命中了缓存,则返回缓存中的结果,否则继续处理。服务端对SQL语句进行词法解析、语法解析、预处理来检查SQL语句的合法性。服务端通过优化器对之前生成的解析树进行优化处理,生成最优的物理执行计划。将生成的物理执行计划调用存储引擎的相关接口,进行数据查询和处理。处理完成后将结果返回客户端。客户端和MySQL服务端的交互过程简图:俗话说"条条大路通罗马",优化器的作用就是找到这么多路中最优的那一条。存储引擎更是决定SQL执行的核心组件,适当了解其中原理十分有益。3.
2021年6月14日
其他

Go语言内存逃逸之谜

我们在高中学过一些天体物理的知识,比如常见的三个宇宙速度:第一宇宙速度:航天器逃离地面围绕地球做圆周运动的最小速度:7.9km/s第二宇宙速度:航天器逃离地球的最小速度:11.18km/s第三宇宙速度:航天器逃离太阳系的最小速度:16.64km/s了解了航天器的逃逸行为,我们今天来点特别的:内存逃逸。通过本文你将了解到以下内容:C/C++的内存布局和堆栈Go的内存逃逸和逃逸分析内存逃逸的小结Part1C/C++的内存布局和堆栈这应该是一道出现频率极高的面试题。C/C++作为静态强类型语言,编译成二进制文件后,运行时整个程序的内存空间分为:内核空间
2021年5月30日
其他

Redis 6.0多线程探秘(上)

1老牌八股面试题想必我们经常听到一个烂大街面试题:Redis为什么选择单线程?这种问法其实并不严谨,为啥这么说呢:Redis的版本很多3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问这种问题,是不是有点耍流氓。限定版本之后
2021年4月24日
自由知乎 自由微博
其他

【乘风破浪的Redis】可能是史上第二强面试题解攻略

金三银四的跳槽季,又翻出了一年前写的3万字的Redis面试总结,还是忍不住推荐一下,希望对大家有所帮助。0x00.前言众所周知数据结构和算法是面试重点,我们持续发力是十分明智的,要不然最后肯定是要吃亏的,少打打游戏刷刷微博可以改变我们的生活水平哦。不过本文不是要讲述数据结构和算法的,而是另外一个面试重点Redis,因为Redis也是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点。笔者是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在公司大一些都完全是运维来实现的,我们使用者只需要在web页面进行相关申请即可,很多细节都被屏蔽了,这样当然很方便啦,不过我们还是要深入理解一下的。在工作几年中笔者接触过Redis、类Redis的SSDB和Pika、谷歌的Key-Value存储引擎LevelDB、FackBook的Key-Value存储引擎RocksDB等NoSQL,其中Redis是基于标准C语言开发的,是工程中和学习上都非常优秀的开源项目。之前笔者写过几篇左右Redis的文章,但是知识点都分散着不利于阅读,所以本次就把之前的文章进行汇总补充,来形成一个全一些的集合,希望对关注我的读者有所帮助就足够啦。文中列出来的考点较多并且累计达3w+字
2021年4月19日
其他

大白说|聊聊我来字节跳动的这326天

最后打一波广告,组内目前在招人,感兴趣的小伙伴快来看看,欢迎添加我的微信baymax9901,进行咨询,大白等你来!
2021年1月23日
其他

图解|深入理解Linux高性能网络架构的那些事

系统的异步I/O还不完善,比如Linux中的boost.asio模块就是异步IO的支持,但是目前Linux系统还是以基于Reactor模式的非阻塞同步IO为主。6.
2020年12月4日
其他

图解|打工人看腾讯这道多线程面试题

使用了全局变量Count,并对其进行递增1操作,但是没有进行加锁同步处理,因此结果是不确定的,为线程不安全函数;公共函数C
2020年11月15日
其他

图解|为什么Python多线程无法利用多核

在1989年发布的,那个时候计算机的主频还没有达到1G,程序全部都是运行在单核计算机上面,直到2005年多核处理器才被Intel开发出来。Python各版本发布时间轴:4.1
2020年10月28日
其他

图解|零拷贝Zero-Copy技术大揭秘

1.前言像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了。想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy。Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。废话不多说,马上开大车,走起!2.
2020年10月11日
其他

图解|什么是HTTP简史

首部压缩A.Header冗余传输我们都知道http请求都有header部分,每个包都有并且相对于一条链接而言大部分的包的header部分都是相同的,这样的话每次传输相同的部分确实非常浪费。
2020年9月27日
其他

图解|为什么HTTP3.0使用UDP协议

p计算出密钥K。如果一直使用这个密钥进行加解密,那么就可以用K解密所有历史消息,因此后续又生成了新密钥,使用其进行加解密,当时完成交互时则销毁,从而实现了前向安全。3.5
2020年9月12日
其他

图解|什么是RSA算法

加密算法的一点历史我们知道常见的加密算法有:对称加密和非对称加密,非对称加密是我们今天的主角。非对称加密不是一蹴而就的,它是1976年之后才出现的,可以说非对称加密是对称加密的优化。2.1
2020年8月30日
其他

图解|通用搜索引擎背后的技术点

网页反作弊和SEO搜索引擎也存在二八原则,头部的网页占据了大量的点击流量,也意味着巨大的商业价值。这里就要提到SEO,先看下百度百科对SEO的定义:搜索引擎优化又称为SEO,即Search
2020年8月10日
其他

图解|什么是蒙提霍尔问题

贝叶斯公式我们综合计算得到一个公式:P(b|a)P(a)=P(a|b)P(b)这个公式做一个变形可以得到:P(a|b)=P(b|a)P(a)/P(b)没错,这就是大名鼎鼎的贝叶斯公式。5.3
2020年7月25日
其他

图解什么是一致性哈希算法

救兵来了由于S3宕机了,因此管理员增加了一台机器S5,代理层再次调整N=4,此时又将出现类似于阶段二的数据迁移,仍然会出现CacheMiss的情况。5.一致性哈希算法先来看看维基百科的英文定义:in
2020年7月18日
其他

图解|什么是缓存系统三座大山

1.无处不在的缓存缓存在计算机系统是无处不在,在CPU层面有L1-L3的Cache,在Linux中有TLB加速虚拟地址和物理地址的转换,在浏览器有本地缓存、手机有本地缓存等。可见,缓存在计算机系统中有非常重要的地位,其主要作用是提高响应速度、减少磁盘访问等,本文主要讨论在高并发系统中的缓存系统。一句话概括缓存系统在高并发系统中的地位的话:如果高并发系统是烤羊肉串,那么缓存系统就是那一撮孜然。2.高并发系统中的缓存2.1
2020年7月11日
其他

图解|什么是缺页错误Page Fault

1.号外号外各位老铁,大家好!上周大白有事停更1次,最近在想如何让大家在10分钟中有所收获,于是准备搞一个"什么是xxx"系列,写一些精悍的知识点。先抛一道阿里面试题给大家热热身,引出今天的主角-缺页异常Page
2020年7月4日
其他

Linux服务端最大并发数是多少?

五元组做过通信的盆友们一定听过五元组这个概念,一个五元组可以唯一标记一个网络连接,所以要理解和分析最大并发数,就必须理解五元组:这样的话,就可以基本认为:理论最大并发数
2020年6月13日
其他

深入理解快速排序和STL的sort算法

快速的递归实现和迭代实现快速排序一般大家写递归的时候更多,但是递归往往也会写出不同风格的版本,所以我们一起来看下多个风格的递归版本和迭代版本的实现,多种代码对比会让我们理解更深刻。3.1
2020年4月18日
其他

高并发基石|深入理解IO复用技术之epoll

1.写在前面又到周六了,不过这周有点忙新文章还没有写,为了不跳票,就想着把早期还不错的文章,重新排版修改发一下,因为当时读者很少,现在而言完全可以当作一篇新文章(有种狡辩的意思)...今天一起来学习一下高并发实现的的重要基础:I/O复用技术
2020年4月11日
其他

什么是P=NP问题?

于2000年5月24日公布的数学难题。根据克雷数学研究所订定的规则,所有难题的解答必须发表在数学期刊上,并经过各方验证,只要通过两年验证期,每解破一题的解答者,会颁发奖金100万美元。
2020年3月28日
其他

漫谈gRPC

为了能让这个开源项目在自己业务中真正run起来,要走的路还是很多,所以找一个通用完善的开源轮子是非常重要的,像阿里的dubbo和腾讯的tars对完整性和易用性都下了很多功夫,是很优秀的开源项目。
2020年3月21日
其他

LeetCode43题-字符串相乘[C++实现]

不过很有用一起看下:这个优化法是把计算过程中的值的坐标都提前知道了,所以就相当于一步到位,不过我还没来得及实验可以快多少,等下试试。最后依然是,感谢各位的观摩!
2020年3月7日
其他

面试热点|二叉树那点事儿(一)

0x00.前言和鸡汤前面写了很多篇工程相关的文章,今天准备写个数据结构和算法相关的文章。最近发现LeetCode的题目已经1500+了,记得去年夏天的时候信誓旦旦说每天刷一道一年也得几百道了,果然没过一星期这个flag就倒了,并且我看到了也没有扶起来...说到底笔者还是个比较懒惰的人,毕竟人都是自然向下的,坐着不如倒着,舒适区虽然内心惭愧但是要想走出来还是很难的,也算是应了那句话:逃避虽可耻但很有用!但是总有那么一个时刻无法忍受自己,那就勇敢地走出去,别回头那种。举个栗子:回看笔者从15年毕业到之后的4年时间,存款没有增长多少,体重增速倒是很给力,终于那个点来了,自己不愿意做个胖子,那就跑步吧!就这样从19年5月份开始,经历了1km到3km到5km到10km到21km的过程,累计跑了1100km,心肺功能变强体重变轻,状态也不一样了,再回头看看所谓的舒适区大概跟个狗窝差不多,所以无限风光在险峰
2020年2月19日
其他

嗨!请查收这道有趣的面试题

凑合一下吧):由于微信显示代码效果不好,因此改为贴图片了,大白是VIM&Notepad++党,所以其他的IDE统统不常用,看下代码吧:写好之后开始编译,不开任何优化后执行bin文件:g++
2020年1月16日
其他

大白说:一则消息

和大家聊聊诸位亲爱的读者朋友,你们好:1.回顾过往我是大白,毕业参加工作也马上5年了,关于笔者的一些情况可以在公众号戳作者简介查看哦。写公众号差不多快3个月了,这期间不断摸索和尝试共写了42篇文章,最开始不懂原创标记,后来才发现这个东西,所以公众号只显示了30多篇原创。得益于许多号主的指点和帮助,在不到2个月的时间里本号的读者关注数也有了很大的突破,超出了我的预期。2.坚持的力量写文章一直都是原创,可能一篇文章要写好几天,笔者也尽量每张图都自己去画,不怕真理无穷,进一寸有一寸的欢喜。写文章并不是一件轻松的事情,自从开始写文章以来熬夜就多了,但是总体还是开心多一些,不过新的一年计划调整时间尽量不熬夜写。有时候我也会想,要学的东西太多了而倍感焦虑,但是实际数一数穿过繁杂的业务看基础重点,其实并没有那么多,假如每周学习1个重要的知识点,就这样坚持发力,不出一年就有非常明显的变化。善始者实繁
2020年1月12日
其他

理解TCP/IP协议栈之HTTP2.0

简单说就是客户端和服务端共同维护了一个key-value的结构,发生变化时则更新传输,否则就不传输,这样相当于首次全量传输之后增量更新传输即可,这个思想在日常开发中也非常普遍,不用想的太复杂。
2020年1月11日
其他

基于Redis的分布式锁和Redlock算法

2.依次尝试从5个实例,使用相同的key和具有唯一性的value获取锁当向Redis请求获取锁时,客户端应该设置一个网络连接和响应超时时间,这个超时时间应该小于锁的失效时间,这样可以避免客户端死等
2020年1月6日
其他

走过2019 展望2020

阅祖国壮美河山2019年除了京冀之外哪里都没有去,可能是太忙对于出游兴趣不大,所以这个Flag毫无疑问倒了。我的大学好友一直邀请我去云南,开着他新买的座驾在洱海兜风,我想2020应该可以成行。2.
2020年1月3日
其他

从生日悖论谈哈希碰撞

99%。从引起逻辑矛盾的角度来说,生日悖论并不是一种
2019年12月31日
其他

浅谈基于simhash的文本去重原理

题外话最近更新文章的频率比较低,所以抓紧抽时间更新一波,要不然有人取关了,啊哈哈。近日比较开心的一件事情是偶然的机会在开发者头条分享了一篇文章,然后这篇文章目前排在7日热度文章第二,看了下点赞近40、收藏数近200、阅读量近2w,所以更坚定了要写下去和大家一起分享学习的想法。之前一直在系列输出Redis面试热点相关的文章,本来准备的部分还没看完无法成文,因此本次就暂且跳过了。今天结合笔者日常工作和大家一起来学习一些偏工程的算法,都是大家很熟悉的场景,想必会有共鸣,开始今天的学习吧!,通过本文你将了解到以下内容:信息爆炸的日常生活网页去重和局部敏感哈希算法simhash算法基本原理和过程分析工程中的去重和聚类实现建议信息爆炸从2010年之后移动互联网如火如荼,笔者在2011年的时候还在用只能打电话发短信的那种手机,然而现在几乎每个人手机里的app起码有10-20款,以至于经常有种信息爆炸到头晕的感觉,回顾一下匆匆十年手机里的变化:以笔者目前正在从事的信息流领域来说,有今日头条、百度App、搜狗搜索app、一点资讯、趣头条等feed软件。很多时候都是自媒体作者会同时在多个平台发布相同的文章,然后会出现非常多的洗稿文章、抄袭文章等,我们无法杜绝和制止这种行为,但是很多时候需要我们使用技术手段来进行识别并处理,让用户看到最好的形式的文章和资讯。信息爆炸时代,我们需要一个好的文本去重算法。网页去重前面是以信息流为例来说的,但是更早的文本去重场景是网页去重,像谷歌、百度、搜狗这种大型的搜索引擎,必须有一套高效的去重算法,要不然网络蜘蛛将做非常多的无用功,时效性等都无法得到保证,更重要的是用户体验也不好。研究表明:互联网上近似重复的网页的数量占网页总数量的比例高达29%,完全相同的网页大约占网页总数量的22%。实际中搜索引擎的去重和排序都非常复杂,本文本着简化的思路来阐述其中的一些要点,无法全面深入,对此表示歉意。谷歌出品,必属精品,我们来看看地表最强搜索引擎是如果做网页去重呢?这里就引出了今天要讲的主要内容simhash算法,本质上文本去重算法有很多种,每种算法都有各自的优劣势,本文并不做横向对比,而是直接引出simhash算法进行阐述,对于横向对比感兴趣的读者可以自行查阅相关资料。局部性敏感哈希说到hash可能我们第一个想到的是md5这种信息摘要算法,可能两篇文本只有一个标点符号的差距,但是两篇文本A和B的md5值差异就非常大,感兴趣的可以试验一下看看,Linux环境下直接md5sum即可计算。有时候我们希望的是原本相同的文章做了微小改动之后的哈希值也是相似的,这种哈希算法称为局部敏感哈希LSH(Locality
2019年12月26日
其他

【决战西二旗】|Redis面试热点之工程架构篇[2]

主节点对A的快照已经完成并且现在正在进行缓冲区同步,那么只能等A完成之后,再对B和C进行和A一样的操作过程,来实现新节点的全量同步,所以主节点并没有偷懒而是重复了这个过程,虽然繁琐但是保证了正确性。
2019年12月20日
其他

【决战西二旗】|Redis面试热点之工程架构篇

为了保证Redis的安全稳定运行,设置了一个max-memory的阈值,那么当内存用量到达阈值,新写入的键值对无法写入,此时就需要内存淘汰机制,在Redis的配置中有几种淘汰策略可以选择,详细如下:
2019年12月17日
其他

【决战西二旗】|Redis面试热点之底层实现篇(续)

你可能会抱有疑问:我只是使用Redis的功能并且公司的运维同事都已经搭建好了平台,只需要在线申请一下配置和获取连接的地址就可以愉快地使用了,为啥还要这么深入的理解底层的数据结构呢?有啥用呢?
2019年12月13日
其他

【决战西二旗】|Redis面试热点之底层实现篇

深入理解和熟练使用Redis需要时间锤炼,要做到信手拈来着实不易,想在短时间内突破只能从热点题目入手,虽然这样感觉有些功利,不过也算无可厚非吧,为了吃饭我们还是倾向于原谅懒惰的自己,要不然吃土喝风?
2019年12月12日
其他

一些思考和阶段小结

看看就好互联网是个快速迭代的行业,大鱼不一定能吃掉小鱼,但是快鱼很可能吃掉慢鱼。然而快鱼不一定就是胜利者,快而繁的试错也必然有成本,每次都推不出好用的产品,后面真的出来好产品了,可能用户也迟疑了,慢不代表懈怠,认真用心打造一个东西更能获得口碑。公司中每个岗位的人都有自己的KPI,虽然我们希望大家都是比较自律和自省且负责的伙伴,但是很多时候会出现很多让人沮丧的事情。这里提到一个所谓的团队协作能力,每个候选人都会说自己有良好的团队协作能力,但是可以称作良好团队协作能力的人并不是比比皆是,相反是难能可贵。所谓的团队协作并不是这个项目太大好几个人一起写个东西,那算哪门子团队协作,充其量就是搭伴干活而已,不用想了身边的例子多如牛毛。私以为团队协作能力首先最重要的一点就是对自己的代码负责、对项目成员负责,只有这样你的产出才不拖后腿,要不然你写个玩具怎么让别人用?代码如脸面,口碑很重要。其次一点就是相互影响,所谓一人计短,作为项目成员需要可以给其他人以启发,这种相互碰撞的思想无论在核物理学还是生物进化都有深远的影响,时髦一点说法就是脑暴,这种碰撞效果绝对不是与人员规模成正比的。如图为碰撞的核聚变过程:(图片源自网络)某天如果你遇到一个成员能力强悍、自律自省、态度端正、可以相互积极影响、又不是奋斗逼的Team,那确实很难得。不过很多时候即使有这样的Team,我们的能力也需要配得上人家才行呀,所谓伯乐不少见但千里马不常有,如果遇到这样的Team,但是由于自己的能力不够,未收到对方的橄榄枝,也十分让人遗憾,不科学的频繁跳槽而不是确定方向默默提高自己,只能是从A坑到B坑,这是个恶性循环。明确知道什么是自己想要的,并且树立目标朝着正确的方向奋力前进,最后很必然收获满满,所以希望亲爱的读者都是千里马!基础的就是最重要的求木之长者,必固其根本;欲流之远者,必浚其泉源;思国之安者,必积其德义。源不深而望流之远,根不固而求木之长,德不厚而思国之安,臣虽下愚,知其不可,而况于明哲乎?----
2019年12月7日
其他

【决战西二旗】|理解Sort算法

前言前面两篇文章介绍了快速排序的基础知识和优化方向,今天来看一下STL中的sort算法的底层实现和代码技巧。众所周知STL是借助于模板化来支撑数据结构和算法的通用化,通用化对于C++使用者来说已经很惊喜了,但是如果你看看STL开发者强大的阵容就意识到STL给我们带来的惊喜绝不会止步于通用化,强悍的性能和效率是STL的更让人惊艳的地方。STL极致表现的背后是大牛们炉火纯青的编程技艺和追求极致的工匠精神的切实体现。笔者能力所限,只能踏着前人的肩膀来和大家一起看看STL中sort算法的背后究竟隐藏着什么,是不是有种《走进科学》的既视感,让我们开始今天的sort算法旅程吧!内省式哲学在了解sort算法的实现之前先来看一个概念:内省式排序,说实话笔者的语文水平确实一般,对于这个词语用在排序算法上总觉得不通透,那就研究一下吧!内省式排序英文是Introspective
2019年12月5日
其他

【决战西二旗】|快速排序的优化

前言前面的一篇文章【决战西二旗】|你真的懂快速排序?讲了快速排序的基本概念、核心思想、基础版本代码实现等,让我们对快速排序有了一个充分的认识,但还无法达到面试中对快速排序灵活应对的程度。快速排序是图领奖得主发明的算法,被誉为20世纪最重要的十大算法之一,快速排序为了可以在多种数据集都有出色的表现,进行了非常多的优化,因此对我们来说要深入理解一种算法的最有效的手段就是不断优化提高性能。如果面试中遇到快速排序的问题,那就要小心了,面试官出快排的题目基本上都是鸡贼地给你挖好坑等着你,所以我们要做到逢山开路遇水搭桥,要不然等着我们的大概就只有这个场景了:废话不说直接上车
2019年12月2日
其他

【决战西二旗】|理解STL list原理

五种。(1)正向迭代器假设p是一个正向迭代器,则p支持以下操作:++p,p++,*p,两个迭代器可以进行相互赋值,以及==,!=比较(2)双向迭代器双向迭代器具有正向迭代器的所有功能,并且可以进行
2019年11月29日
其他

【决战西二旗】|理解STL vector原理

Vector概述STL中的Vector是最为常用的顺序容器之一,与C/C++中的数组Array很相似,最重要的区别在于对连续内存空间运用的灵活性。数组真叫人为难我们在使用数组Array时要指定数组的大小,而后由系统来分配连续的内存空间,Array是静态空间必须指定大小且指定之后自动无法扩缩容,因此为了避免元素装不下,一般都把数组设置的比预期要大,但是往往导致空间的浪费。另外往往很多时候需装载元素的数量无法预期,这样设置怎样的大小就取决于使用者了。如果最初数组设计比较小,那么就面临着开辟新的更大空间、将旧空间元素复制到新空间、释放旧空间三个大步骤,这一切都是需要使用者自己来维护实现的。使用数组太大浪费空间、太小浪费效率,真的很希望有个助手帮我们做了这些事情,专业的人做专业的事情,让我们只关心业务逻辑即可,那该多好!它来了,踏着七彩祥云就这样盼望着
2019年11月28日