<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[了解➔熟悉➔掌握➔精通]]></title><description><![CDATA[为之，则难者亦易矣；不为，则易者亦难矣。]]></description><link>https://blog.youkuaiyun.com/chimomo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chimomo]]></copyright><item><title><![CDATA[数据结构与算法之美－12：排序下－如何用快排思想在O(n)内查找第K大元素？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170190743</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170190743</guid><author>chimomo</author><pubDate>Wed, 11 Nov 2026 19:35:20 +0800</pubDate><description><![CDATA[从我们的原理分析和伪代码可以看出，归并排序的执行效率与要排序的原始数组的有序程度无关，所以其时间复杂度是非常稳定的，不管是最好情况、最坏情况，还是平均情况，时间复杂度都是O(nlogn)。现在，我们集中精力来看快排的时间复杂度。归并排序算法是一种在任何情况下时间复杂度都比较稳定的排序算法，这也使它存在致命的缺点，即归并排序不是原地排序算法，空间复杂度比较高，是O(n)你可能会说，我有个很笨的办法，每次取数组中的最小值，将其移动到数组的最前面，然后在剩下的数组中继续找最小值，以此类推，执行K。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－11：排序上－为什么插入排序比冒泡排序更受欢迎？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170147246</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170147246</guid><author>chimomo</author><pubDate>Fri, 06 Nov 2026 11:21:12 +0800</pubDate><description><![CDATA[的排序算法中，冒泡排序、选择排序，可能就纯粹停留在理论的层面了，学习的目的也只是为了开拓思维，实际开发中应用并不多，但是插入排序还是挺有用的。为了保证冒泡排序算法的稳定性，当有相邻的两个元素大小相等的时候，我们不做交换，相同大小的数据在排序前后不会改变顺序，所以冒泡排序是稳定的排序算法。插入排序是同样的，不管怎么优化，元素移动的次数也等于原始数据的逆序度。在插入排序中，对于值相同的元素，我们可以选择将后面出现的元素，插入到前面出现元素的后面，这样就可以保持原有的前后顺序不变，所以插入排序是稳定的排序算法。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－10：递归－如何用三行代码找到“最终推荐人”？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170143616</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170143616</guid><author>chimomo</author><pubDate>Fri, 06 Nov 2026 09:36:16 +0800</pubDate><description><![CDATA[在时间效率上，递归代码里多了很多函数调用，当这些函数调用的数量较大时，就会积聚成一个可观的时间成本。在空间复杂度上，因为递归调用一次就会在内存栈中保存一次现场数据，所以在分析递归代码空间复杂度时，需要额外考虑这部分的开销，比如我们前面讲到的电影院递归代码，空间复杂度并不是O(1)比如，堆栈溢出、重复计算、函数调用耗时多、空间复杂度高等，所以，在编写递归代码的时候，一定要控制好这些副作用。对于递归代码，你有什么好的调试方法呢？递归，本质并没有变，而且也并没有解决前面讲到的某些问题，徒增了实现的复杂度。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－09：队列－队列在线程池等有限资源池中的应用]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170141053</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170141053</guid><author>chimomo</author><pubDate>Thu, 05 Nov 2026 16:02:11 +0800</pubDate><description><![CDATA[在数组实现队列的时候，会有数据搬移操作，要想解决数据搬移的问题，我们就需要像环一样的循环队列。），队列的大小有限，所以线程池中排队的请求超过队列大小时，接下来的请求就会被拒绝，这种方式对响应时间敏感的系统来说，就相对更加合理。除此之外，我们还讲了几种高级的队列结构，阻塞队列、并发队列，底层都还是队列这种数据结构，只不过在之上附加了很多其他功能。前面我们讲了阻塞队列，在多线程情况下，会有多个线程同时操作队列，这个时候就会存在线程安全问题，那如何实现一个线程安全的队列呢？原子操作，可以实现非常高效的并发队列。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－08：栈－如何实现浏览器的前进和后退功能？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170138990</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170138990</guid><author>chimomo</author><pubDate>Thu, 05 Nov 2026 14:56:15 +0800</pubDate><description><![CDATA[每进入一个函数，就会将临时变量作为一个栈帧入栈，当被调用函数执行完成，返回之后，将这个函数对应的栈帧出栈。这里也可以用栈来解决。前面我讲的都比较偏理论，我们现在来看下，栈在软件工程中的实际应用。如果比运算符栈顶元素的优先级低或者相同，从运算符栈中取栈顶运算符，从操作数栈的栈顶取2。如果扫描的过程中，遇到不能配对的右括号，或者栈中没有数据，则说明为非法格式。，所以把耗时多的入栈操作的时间均摊到其他入栈操作上，平均情况下的耗时就接近O(1)我们再来看栈的另一个常见的应用场景，编译器如何利用栈来实现表达式求值。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－07：链表下－如何轻松写出正确的链表代码？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170131230</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170131230</guid><author>chimomo</author><pubDate>Thu, 05 Nov 2026 14:13:08 +0800</pubDate><description><![CDATA[链表代码写得好坏，可以看出一个人写代码是否够细心，考虑问题是否全面，思维是否缜密。所以，这一节讲到的东西，你一定要自己写代码实现一下，才有效果。而且，当我们写完代码之后，也可以举几个例子，画在纸上，照着代码走一遍，很容易就能发现代码中的Bug。你只要把这几个操作都能写熟练，不熟就多写几遍，我保证你之后再也不会害怕写链表代码。一样，其实也没有什么技巧，就是把常见的链表操作都自己多写几遍，出问题就一点一点调试，熟能生巧！因为，链表代码到处都是指针的操作、边界条件的处理，稍有不慎就容易产生Bug。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－06：链表上－如何实现LRU缓存淘汰算法]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170125023</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170125023</guid><author>chimomo</author><pubDate>Thu, 05 Nov 2026 11:02:10 +0800</pubDate><description><![CDATA[我们上一节课讲过，当我们往支持动态扩容的数组中插入一个数据时，如果数组中没有空闲空间了，就会申请一个更大的空间，将数据拷贝过去，而数据拷贝的操作是非常耗时的。别着急，刚刚的分析比较偏理论，很多数据结构和算法书籍中都会这么讲，但是这种说法实际上是不准确的，或者说是有先决条件的。对于第一种情况，不管是单链表还是双向链表，为了查找到值等于给定值的结点，都需要从头结点开始一个一个依次遍历对比，直到找到值等于给定值的结点，然后再通过我前面讲的指针操作将其删除。不过，数组和链表的对比，并不能局限于时间复杂度。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－05：数组－为什么很多编程语言中数组都从0开始编号？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170051442</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170051442</guid><author>chimomo</author><pubDate>Thu, 05 Nov 2026 09:30:45 +0800</pubDate><description><![CDATA[但如果你是做一些非常底层的开发，比如开发网络框架，性能的优化需要做到极致，这个时候数组就会优于容器，成为首选。数组用一块连续的内存空间，来存储相同类型的一组数据，最大的特点就是支持随机访问，但插入、删除操作也因此变得比较低效，平均情况时间复杂度为O(n)在平时的业务开发中，我们可以直接使用编程语言提供的容器类，但是，如果是特别底层的开发，直接使用数组可能会更合适。个数据需要存储到数组中时，我们就需要重新分配一块更大的空间，将原来的数据复制过去，然后再将新的数据插入。如果我们申请了大小为10的数组，当第。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－不定期福利第一期：数据结构与算法学习书单]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170043548</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170043548</guid><author>chimomo</author><pubDate>Wed, 04 Nov 2026 19:01:46 +0800</pubDate><description><![CDATA[我们就来聊一聊数据结构和算法学习过程中有哪些必读书籍。很多人一提到算法书就会搬出《算法导论》和《算法》。很多同学让我推荐一些学习数据结构与算法的书籍。这本书最大的特色就是讲了很多针对海量数据的处。除此之外，留言区很多人问到算法的实现语言。这种答疑的方式也会成为我们之后的固定动作，我也只看过比较简单的几卷，比如《基本算法。每节课中有需要代码实现的数据结构和算法，能让你对数据结构和算法有个大概的认识。跟《大话数据结构》走的是同样的路线，这也是我把它归到面试这一部分的原因。你可以把它当作你算法学习的终极挑战。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－04：复杂度分析下－浅析最好、最坏、平均、均摊时间复杂度]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/170034391</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/170034391</guid><author>chimomo</author><pubDate>Wed, 04 Nov 2026 14:12:37 +0800</pubDate><description><![CDATA[你可以先用我们刚讲到的三种时间复杂度的分析方法来分析一。那究竟如何使用摊还分析法来分析算法的均摊时间复杂度呢？最好情况时间复杂度和最坏情况时间复杂度对应的都是极端。糕情况下对应的时间复杂度就是最坏情况时间复杂度。今天我会继续给你讲四个复杂度分析方面的知识点，你应该已经掌握了算法复杂度分析的大部分内容了。为了表示代码在不同情况下的不同时间复杂度，这段代码实现了一个往数组中插入数据的功能。看是否能将较高时间复杂度那次操作的耗时，今天我们学习了几个复杂度分析相关的概念，上一节我举的分析复杂度的例子都很简单，]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－03：复杂度分析上－如何分析、统计算法的执行效率和资源消耗？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169947265</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169947265</guid><author>chimomo</author><pubDate>Wed, 04 Nov 2026 10:53:43 +0800</pubDate><description><![CDATA[只要跟着我的思路学习、练习，你很快就能和我一样，每次看到代码的时候，简单的一眼就能看出其复杂度，难的稍微分析一下就能得出答案。复杂度也叫渐进复杂度，包括时间复杂度和空间复杂度，用来分析算法执行效率与数据规模之间的增长关系，可以粗略地表示，越高阶复杂度的算法，执行效率越低。谁的量级大，所以我们在表示复杂度的时候，就不能简单地利用加法法则，省略掉其中一个。类型数组，除此之外，剩下的代码都没有占用更多的空间，所以整段代码的空间复杂度就是O(n)现在，我把代码稍微改下，你再看看，这段代码的时间复杂度是多少？]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－02：如何抓住重点，系统高效地学习数据结构与算法？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169932898</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169932898</guid><author>chimomo</author><pubDate>Tue, 03 Nov 2026 16:03:10 +0800</pubDate><description><![CDATA[学习数据结构和算法的过程，是非常好的思维训练的过程，所以，千万不要被动地记忆，要多辩证地思考，多问为什么。如果你一直这么坚持做，你会发现，等你学完之后，写代码的时候就会不由自主地考虑到很多性能方面的事情，时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。除此之外，我还给你分享了我总结的一些学习技巧，比如边学边练、多问、多思考，还有两个比较通用的学习方法，打怪升级法和沉淀法。我也会力争每节课都最大限度地给你讲透，帮你扫除知识盲点，而你要做的就是，避免一知半解，要想尽一切办法去搞懂我讲的所有内容。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－01：为什么要学习数据结构和算法？]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169927486</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169927486</guid><author>chimomo</author><pubDate>Tue, 03 Nov 2026 11:02:20 +0800</pubDate><description><![CDATA[也有很多人说，自己实际工作中根本用不到数据结构和算法。我们平时可能更多的是利用已经封装好的现成的接口、尽管计算机相关专业的同学在大学都学过这门课程，里面的有序集合是用什么数据结构来实现的呢？很多程序员对数据结构和算法依旧一窍不通。性能几乎是开发过程中时刻都要考虑的问题。甚至很多培训机构也会培训这方面的知识，公司只能考察他们的基础知识是否牢固。至人生之路打开一扇通往新世界的大门。如何评估代码的性能和资源的消耗呢？排这些最最基本的数据结构和算法，很少需要自己实现数据结构和算法。]]></description><category></category></item><item><title><![CDATA[数据结构与算法之美－开篇词：从今天起，跨过“数据结构与算法”这道坎]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169925161</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169925161</guid><author>chimomo</author><pubDate>Tue, 03 Nov 2026 10:02:23 +0800</pubDate><description><![CDATA[我们整个专栏都是围绕数据结构和算法在具体软件实践中的应用来讲的，我根据自己研读数十本算法书籍和多年项目开发的经验，空间复杂度分析是数据结构和算法中非常重要的知识点，我尝试做一个让你能真正受用的数据结构与算法课程，这部分我会讲一些不是那么常用的数据结构和算法。我都会结合具体的软件开发实例，由浅入深进行讲。我希望这个专栏也能成为你的一个人生转折点。我很感激师兄当年给我的那本《算法导论》，核心和本质的东西其实就是当初学的那些知。这是我自己学习数据结构与算法的经历，我都会结合真实的软件开发案例来讲解，]]></description><category></category></item><item><title><![CDATA[从０开始学架构－架构师必读书单：“华仔，放学别走！”第5期]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169845017</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169845017</guid><author>chimomo</author><pubDate>Mon, 02 Nov 2026 17:23:19 +0800</pubDate><description><![CDATA[不管是普通程序员还是架构师，实践工作中都需要有一定的业务理解能力，而架构师的业务理解能力要求更高。一句话推荐：全面理解Java虚拟机，原理介绍得深入浅出，很少有技术书籍我会优先推荐国内作者，而这本是我大力推荐的。一句话推荐：结合宝洁的经验，提出了一套完善的战略规划和落地方法，理论与实践兼备，架构师。端程序员的渲染知识，以及所有程序员都要求的算法知识等。]]></description><category></category></item><item><title><![CDATA[从０开始学架构－结束语：坚持，成就你的技术梦想]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169561784</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169561784</guid><author>chimomo</author><pubDate>Mon, 02 Nov 2026 16:40:25 +0800</pubDate><description><![CDATA[看到专栏的内容能够帮助你理解架构设计这个看起来高大上的技术，专栏的结束意味着你已经完成整套架构设计方法论的学习，一定要坚持自己的梦想，因为所有的这些问题都是正常的，《大牛养成指南：吃的草够多，你也能成为大牛》几乎每个技术人员心中都有一个架构师的梦想，那种创造的感觉真的是让人感到喜悦和自豪，所以在专栏结束之际聊聊我对坚持的理解。前面的山路越崎岖，山顶的风景才会越美！坚持学习的一个典型难题就是时间的投入，毕竟架构师代表了技术路线发展的巅峰。就是我想跟你分享的除了技术本身以外，也曾遇到自己开发的系统上线就回滚，]]></description><category></category></item><item><title><![CDATA[从０开始学架构－架构师成长之路：“华仔，放学别走！”第4期]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169560245</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169560245</guid><author>chimomo</author><pubDate>Fri, 30 Oct 2026 18:01:53 +0800</pubDate><description><![CDATA[分析和总结自己团队甚至公司的各种系统的架构设计优缺点，这样在做具体方案设计的时候才能选择合适的数据结构。级架构师的角色，因为在系统复杂度相对不高的情况下，结构的实现原理，因为只有深入掌握了这些实现原理，的文档中就有关于消息队列架构设计的分析和取舍。接下来我们看看从程序员到架构师的成长过程中，杂度的不同，中级架构师面对的系统复杂度要高于。够涵盖这么多的设计点，因此更多的是依靠自己。中级架构师与初级架构师的典型区别在于系统复。构师可能发现其实没有哪个开源项目是合适的，是几个关键技术细节决定整个架构设计的成败，]]></description><category></category></item><item><title><![CDATA[从０开始学架构－50：架构实战架构设计文档模板]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169547281</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169547281</guid><author>chimomo</author><pubDate>Fri, 30 Oct 2026 16:37:09 +0800</pubDate><description><![CDATA[消息队列系统需要输出日志给公司已有的监控平台，通过监控平台监控消息队列系统的健康状态，包括发送消息的数量、发送消息的大小、积压消息的数量等，详细监控指标在后续设计方案中列出。通常情况下，规划和设计的需求比较完善，但如果一次性全部做完，项目周期可能会很长，因此可以采取分阶段实施，即：第一期做什么、第二期做什么，以此类推]消息队列系统的服务器和数据库服务器采取混布的方式部署，即：一台服务器上，部署同一分组的主服务器和主MySQL。消息队列系统这部分内容很简单，但有的业务系统1H就是具体的用例了，]]></description><category></category></item><item><title><![CDATA[从０开始学架构－49：谈谈App架构的演进]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169463400</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169463400</guid><author>chimomo</author><pubDate>Fri, 30 Oct 2026 11:20:18 +0800</pubDate><description><![CDATA[如果某个组件依赖其他组件，组件之间通过消息系统进行通信，通过这种方式来实现组件隔离，从而避免各个团队之间的互相依赖和影响，以提升团队开发效率和整个系统的可扩展性。站在企业的角度来讲，当然希望能够减少人力投入成本（虽然我站在程序员的角度来讲是不希望程序员被减少的），因此最近几年各种跨平台方案不断涌现，比较知名的有Facebook的。的，区别在于发布方式，组件化采用的是静态发布，即所有的组件各自独自开发测试，然后跟随。移动互联网此时已经成为明确的大趋势，团队需要考虑的不是要不要转移动互联网的问题，]]></description><category></category></item><item><title><![CDATA[从０开始学架构－48：再谈开源项目如何选择、使用以及二次开发]]></title><link>https://blog.youkuaiyun.com/chimomo/article/details/169461456</link><guid>https://blog.youkuaiyun.com/chimomo/article/details/169461456</guid><author>chimomo</author><pubDate>Thu, 29 Oct 2026 19:28:28 +0800</pubDate><description><![CDATA[这就是今天的全部内容，留一道思考题给你吧，目前的云计算厂商很多都提供了和开源项目类似的。当我们发现开源项目有的地方不满足我们的需求时，自然会有一种去改改的冲动，软件领域和硬件领域最大的不同就是软件领域没有绝对的工业标准，速度就是生命，引入开源项目可以节省大量的人力和时间，一般开源项目都会把采用了自己项目的公司列在主页上，运气不好可能遇到一个之前全世界的使用者从来没遇到的。人工恢复都没办法，只能接一个用户投诉处理一个，主要聊了我在学习开源项目的一些看法和步。一个头疼的问题就是相似的开源项目较多，]]></description><category></category></item></channel></rss>