IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:算法

共 86 篇相关文章

IT 累计浏览 49

除法的意义

作者发现三年级女儿可可在掌握除法计算后仍无法理解其意义,表现为面对实际问题时无法将“装盒”场景与除法运算关联。通过实物操作(用token和碗模拟装鸡蛋)和逐步抽象化的引导,作者帮助孩子从具体行为中推导出除法的本质:连续减法的次数记录。例如通过“30个鸡蛋每10个装一盒”的实物操作过渡到用减法计算30-10-10-10=0并数次数,使孩子领悟除法符号的简化作用。进一步通过矩形图示解释乘除法的交换关系(8×10与10×8对应图形旋转),并拆解96÷8为80÷8+16÷8的分步计算,最终让孩子将除法竖式与实际分组过程对应起来。整个过程强调数学符号的具象化意义——符号是帮助思维的工具,但需先理解其代表的实际逻辑。通过一小时的具体演绎,孩子初步建立起除法作为“重复减法”的操作意义与乘除法间的互逆关联认知。

IT 累计浏览 55

对数和自然对数的底

对数概念的发明源于天文学中对大数乘除法的简化需求,特别是在通过三角视差法测量天文距离时。由于日地距离已很遥远,测量更远的恒星需要极高的精度,计算误差会显著影响结果。约翰·纳皮尔在没有幂概念的情况下,通过三角公式的启发,从几何意义出发发明了对数。其核心思路是构造一个等比数列,使真数的乘法运算转换为对应等差数列的加减运算。他选择了一个非常接近1的公比(约为0.9999999),这使得等比数列的递推可以通过简单的移位和减法实现,极大方便了手算。在当时以十的七次方为半径的三角函数表背景下,这个选择使得对数表的底数近似为(1+1/10^7)^(10^7),其极限即为自然常数e。因此,以e为底的对数之所以被称为自然对数,并非源于纳皮尔的本意,而是因为e是通过对数运算的自然数学构造过程(令公比的指数趋于无穷)而产生的必然结果。

IT 累计浏览 2,784

一篇写给从未编程过的人的入门教程

这篇讲的是编程入门的“心理障碍”有多不必要。作者开篇就破除了“外行/内行”的标签,认为编程本质是每个人都熟悉的逻辑表达,他以自己半天学会PlantUML为例,强调学习曲线比想象中平缓。 为了让抽象概念落地,作者巧妙地用“17点回家如何在18点30分前让家人吃上饭”这个日常场景,类比了编程中的算法(解决步骤)、数据结构(书架/柜子的存储逻辑)和程序实体(做饭)。这种类比让“编程=算法+数据结构”的公式瞬间变得亲切可感。 文章的核心观点是,区分编程小白与专家的,并非代码本身,而是思考问题的周全性。作者通过对比两段“做饭”的伪代码——一个临时发现没油才去买,另一个提前检查缺漏并携带清单——生动说明了后者如何通过“检查”步骤让流程更可靠、高效。这引出了编程中“抽象”思维的关键价值:将重复步骤(洗菜、切菜、炒菜)封装成方法,使得程序能通过扩展“菜单”而非重复代码来处理复杂任务。 最终,作者将编程的复杂性落回到现实:入门简单,但写出考虑周全、高效且能应对需求变化的“好程序”却极具挑战。结尾那句关于“程序员最苦恼的是需求变化”的调侃,也让这篇技术入门文多了一份共鸣和幽默。

IT 累计浏览 1,704

面试的艺术 - 如何面试别人

这篇讲的是,作者如何面对自己并非专家的岗位,去面试候选人。他坦言,面试是一门不完美的艺术,很难在短短几十分钟内准确判断一个人。我们能做的,是在有限时间内提高判断的正确率与召回率。 具体怎么做呢?作者的核心方法是“进行有区分度的考查”。他反对那种所有人都能答对或答错的问题。比如用算法题考察工程师的逻辑与智力,就是一种有效的区分手段。同时,面对光鲜的简历,要围绕一个项目深挖细节:问目标、问流程、问数据、问挑战。通过追问“为什么做”、“谁配合”、“最终结果如何”,能有效判断候选人是否真负责、做得好不好。 除了具体的专业技能,作者强调要关注一些基础素质,比如表达沟通能力(注意信息的“密度”)、工作热情、团队精神和学习习惯。最后,他建议将面试问题与经验标准化,形成可共享的“方法论”,并定期复盘迭代,以适应变化。 总的来说,面试不是一次性的考核,而是一个需要持续打磨和反思的技能。作者从实践出发,提供了一套可操作的框架,帮助面试官在不确定中做出更可靠的判断。

IT 累计浏览 1,529

程序员应该怎样提高自己

这篇文章是一位拥有近30年经验的资深程序员,对“程序员如何提高自己”这一高频问题的系统性回应。作者认为,成长始于对代码优化的乐趣——正是“写出更高效代码”的追求,驱动着程序员自发去理解操作系统、内存模型等底层原理。 精通一门语言是基石,但这意味着要了解其所有特性的代价与惯用法。作者指出,设计模式本质上是语言特定惯用法的总结。而要突破瓶颈,则必须掌握第二门语言,通过对比不同范式来拓宽解决问题的思路。 在掌握具体技能之外,更高阶的能力在于分解问题、保持简洁的架构设计思维。作者强调,真正的简洁源于对优化与代价的深刻理解,而非一味追求技巧。同时,他呼吁重视工具链掌握、脚本编写等“软能力”,并积极参与开源协作,将沟通与理解能力视为与编码同等重要的核心素养。 这些源于长期实践的经验,为年轻程序员勾勒出一条从兴趣驱动到工程思维的成长路径。

IT 累计浏览 2,396

一些不常见但是很重要的数据结构

这篇源自Stack Overflow高赞讨论的整理,系统梳理了那些在日常编程中不常被提及、却在特定领域发挥关键作用的数据结构。文章并非泛泛而谈,而是紧扣具体应用:比如Bloom filter如何在BigTable、Cassandra中用于快速存在性检查,Skip list作为Redis有序集合的底层实现原理,以及Rope数据结构如何通过高效的字符串拼接操作,在Java等语言中胜任繁重的文本处理任务。 作者将这些结构与经典方案对比着介绍,突出了各自的核心价值:Splay tree的简洁与良好性能,Suffix tree用于字符串搜索的O(n)构建优势,以及Cuckoo Hashing利用多哈希函数提升空间利用率的巧妙思路。同时,文章也涵盖了并查集、Merkle tree、无锁数据结构等并发与特定场景下的利器,甚至提及了缓存参数无关、左偏红黑树等更前沿的方向。 整篇文章更像一份精心挑选的“数据结构工具箱”清单,它不仅扩充了开发者的知识库,更揭示了在解决特定性能或规模问题时,超越常规选择的可能性。对于想夯实基础、或寻找更优解方案的技术读者,这份清单提供了明确的索引和深入探索的起点。

IT 累计浏览 1,899

美团面试经历,贡献出来一起学习

这篇讲的是一位程序媛分享她应聘美团大数据研发实习生的四轮技术面试经历。文章按时间顺序,详细还原了从简历筛选到最终HR面的完整过程,像一份真实的面试笔记。 面试内容覆盖面非常广。一面由部门主管在会议间隙进行,侧重项目架构与设计模式;二面长达一小时,深入考察了Spring机制、多线程、JVM内存与GC、MySQL优化等核心知识;三面是交叉面试,增加了在线编码环节;最后的HR面则异常“硬核”,面试官对项目细节和科研经历进行了深度追问。 作者在应对面试时有不少值得借鉴的思路。例如,面对不熟悉的问题(如服务器配置)坦诚相告;在解释Spring IOC/AOP时,用项目实例来证明理解;遇到不确定的技术点(如Java异步IO)时,坦然说明并向面试官展示自己的推理过程。文章也记录了面试官“边面试边给反馈”这类有助于候选人调整状态的细节。 文末,作者总结了对此次面试的反思:技术基础(算法、框架原理)需要扎实,面试中要主动引导节奏展示自己的知识体系,而对于高并发、分布式等工程经验,在校生只能通过理论学习先行铺垫。这为准备技术面试的读者提供了切实的参考。

IT 累计浏览 1,449

彪悍的职业不惧阿尔法狗

这篇文章从阿尔法狗与李世石的对弈讲起,引出了一个更值得深思的现实问题:在机器学习浪潮下,哪些人的职业未来会受到冲击?作者先以戏谑的方式提出了一个关于AI文明发展的宏大猜想,随后将话题拉回地面——Google为机器学习专家开出超200万美元年薪,正是因为资本正在押注这项技术的盈利潜力。 核心观点很明确:机器学习将首先替代那些重复性强、无需创造性思考的岗位。例如,机械搬运网络段子的小编辑,其工作可能很快被推荐算法取代。相反,那些需要灵感与创造性的职业,比如段子手、艺术家、导演,以及最重要的软件工程师,则拥有更长的“安全期”。作者甚至断言,当机器能完全替代程序员时,那可能已是AI文明终结地球之时。 因此,文章最终将“程序员”定义为地球上最后一个消失的职业,并建议有志者不妨从Python开始,踏入这个面向未来的领域。

IT 累计浏览 4,362

Cuckoo Filter:设计与实现

这篇讲的是如何设计和实现一种名为 Cuckoo Filter 的高效过滤器。作者从实际业务中海量数据快速查询的需求出发,指出经典的 Bloom Filter 虽然空间利用率高,但存在无法删除元素的硬伤,一旦删除就会导致漏报。 为了解决这个问题,文章引入了布谷鸟哈希(Cuckoo Hashing)的设计思想。每个元素有两个哈希位置,发生冲突时,新元素会“踢走”原有元素,并利用其备用位置重新安置,就像布谷鸟侵占别的鸟巢一样。通过使用包含多个槽位的桶结构,可以大幅缓冲碰撞几率,实现高达 80% 以上的空间占用率(论文数据超过 90%),同时支持可靠的插入、查询和删除操作。 作者随后展示了自己用不到 500 行 C 代码实现的完整案例。核心思路是在内存中维护一个轻量级的哈希表,仅存储元素的部分摘要(tag)来快速过滤,将完整数据存放在后端存储(如 Flash)。这样查询时能最大程度避免不必要的磁盘读取。代码清晰地定义了哈希表、槽位结构,并实现了查询、插入等关键操作,验证了该方案在正确性和效率上的可行性。

IT 累计浏览 1,692

CSS 样式规则的匹配算法实现

这篇讲的是移动端开发中的一个具体问题:如何在自定义框架里,让CSS选择器像在浏览器中一样准确地匹配到UI控件。作者从自己开发的iOS CSS布局框架CocoaUI出发,拆解了其中CSS样式规则匹配算法的实现。 文章把核心放在了数据结构和匹配逻辑上。它定义了一个包含选择器数组的样式对象,并为其实现match方法。有趣的是,实现时并没有按照我们阅读CSS从左到右的习惯,而是采用了从右到左的顺序进行匹配。 这种倒序匹配有一个高效的关键点:先判断“关键元素”(即最右边的选择器)是否与目标节点匹配。如果不匹配,则整个规则立即失效,省去了不必要的遍历。匹配成功后,再依次向左,让目标节点的祖先节点与剩余选择器进行比对。整个过程在遇到节点树顶端或所有选择器都匹配完成时终止,清晰高效。 作者在讲解算法的同时,也点明了CSS“级联”特性与树结构的天然关联,并提供了完整的实现代码仓库链接,让读者不仅能理解思路,也能看到工程实践。

IT 累计浏览 6,067

如何教会非计算机专业的女友写代码

这篇讲的是一个计算机专业男生如何系统指导金融专业女友转行前端开发并成功就业的完整经历。 作者从自身背景出发,为女友选择了适合入门且“可进可退”的前端方向,并制定了清晰的学习路径:从《Head First》系列和《JavaScript语言精粹》等书籍掌握基础语法,再通过言传身教渗透HTTP协议、网络通信等原理知识。他强调“工欲善其事”,专门为女友购置MacBook Pro以便熟悉Vim、Git等开发工具。 实践环节是关键。作者引导女友在GitHub写博客、开发小作品,并报名参加了筛选制的百度IFE前端技术学院。当基础扎实后,便鼓励她投递简历,通过面试发现不足,最终顺利获得实习Offer。过程中遇到的JS异步、闭包等难点,也被一一攻克。 文章还直面了两个常见偏见:技术是否适合女性,以及互联网行业是否过于繁忙。作者以实例论证,技术岗位对女生同样有吸引力且并不枯燥,互联网公司也存在灵活的工作选择。最后,他用自己的支持与担当,为这段转行之路画上了有温度的句号。

IT 累计浏览 7,118

谈谈在校程序员技能培养

这是一篇关于在校程序员技能培养的经验分享,作者结合自身从北邮本科到研究生阶段的经历,给出了几条打破常规却很实用的建议。 文章的核心观点是,在校学习的目标不是“好好上课”,而是高效地掌握知识并投入实践。作者通过考前集中复习保证成绩,从而腾出大量时间用于编程实践,这让他在校招中具备明显优势。在技能培养上,他强调要“适度刷题”——算法基础虽重要,但忽视工程细节(如STL容器的内存管理、线程安全)会成为明显短板。对于实习,作者结合自己和身边人的案例,建议不要盲目追求大厂光环,早期进入能深度参与项目的初创公司,往往能获得更扎实的工程锻炼。此外,他提到要关注行业技术趋势,顺势而为比固守个人偏好更重要。 这篇文章源于作者帮助内推时对行业“人才青黄不接”现象的观察,所有建议都来自他一路走来的切身体会。虽然行业形势在变,但其中关于平衡应试与实践、在实习中追求实质成长的思路,对今天的在校生仍有参考意义。

IT 累计浏览 4,636

校园招聘的简单总结

这篇文章是一位技术面试官首次参与校园招聘后的心得分享。作者从一线视角出发,详细描述了从线上笔试到三轮面试的完整流程,并分享了在筛选测试开发与Ruby开发工程师候选人时的观察。 作者发现,比较聪明且做了充分准备的同学更受欢迎。这些准备不仅体现在扎实的技术知识上,还包括对公司的了解、清晰的职业规划以及强烈的入职意愿。文章中特别提到一个细节:一位同学在二面时带来了针对公司产品的测试报告,这给面试官留下了深刻印象。 文中也流露出一些个人感慨。作者对比自己多年前的求职经历,感叹如今对技术能力的要求确实更高了。同时,他也认为在实力相当时,校招能否成功有时也看缘分。最后,文章附带了两道面试题(计算阶乘末尾零的个数、啤酒瓶换购问题)的Python实现代码,为文章增添了一些技术趣味。

IT 累计浏览 3,097

我为什么要使用哈希

这篇讲的是如何用哈希技巧解决一个经典的算法问题:在二叉树中找出所有结构完全相同的子树。 文章从一道大厂面试题切入。问题要求给定一棵二叉树,找出所有彼此完全相等的子树对。作者分享了自己的通过面试的解法,核心思路正是借助哈希。通过后序遍历整棵树,为每个节点计算一个哈希值——叶子节点用一个固定值(比如 md5("")),非叶子节点则将其左右子树的哈希值拼接后再次哈希。这样,任何子树都能被映射为一个唯一的哈希指纹。 计算出所有子树的哈希后,将它们放入哈希表。哈希值相同的子树,其结构“有可能”完全相同,但需要二次验证以排除哈希冲突。验证过程是递归地同时遍历两棵树,检查所有节点的左右子树存在状态是否一致。文章还提到了一个关键的优化:通过记录子树深度,在验证前就能排除掉大量哈希值相同但深度不同的“伪匹配”,极大地减少了不必要的递归检查。 整个过程清晰地展示了哈希作为一种“指纹”技术,在加速查找与比对操作中的强大作用,将复杂问题的复杂度显著降低。

IT 累计浏览 1,753

在白板上写代码是有难度的

这篇讲的是技术面试中那个让不少人头疼的环节:白板编程。作者从自己作为微软团队面试官的经验出发,给出了一个核心观点——面试官真正在考察的,并不是你能否当场写出语法完美无误的代码。 他理解白板没有智能感知和语法高亮,因此不介意你出现参数顺序错误这类“小瑕疵”。真正看重的是你的问题解决过程:是急于动手,还是先理清思路?是否主动识别并澄清了需求中的模糊点?会优先攻克难点还是先处理简单的部分? 文章以几个经典面试题(如实现栈、打乱数组)为例,点明了关键:很多问题本身就暗藏陷阱,比如字符串处理需要考虑不同编码,数组随机化要区分安全场景与测试场景。忽略这些“真实世界”的考量,代码设计就无从谈起。 作者鼓励应聘者,在编写代码时就要像开发者一样思考:如何测试?如何处理异常输入?代码是否健壮、可维护?他认为,展现出这种工程思维,远比纠结于一时的语法记忆更能证明你的潜力。最后他也坦言,技术面试本就艰难,聪明如他也曾被拒,这本身就是一个值得准备的过程。

IT 累计浏览 4,274

校招经验——写给找工作的同学们

这篇文章里,一位招聘官分享了自己在北大、武大两场校招中,连续三天面试百余名同学后的直观观察。他指出,不少同学能力不错,却在一些关键环节“可惜”地折戟,问题往往出在准备与认知上。 作者将校招流程拆解为笔试、群面和一对一面试,并点出了每个环节的核心考察点。比如,笔试主观题的关键不是解题,而是先“定义问题”,认清出题人设的“局”;群面中,许多人执着于抢“主持”角色,却忽略了面试官在观察团队协作与人岗匹配,扮演好适合自己性格的贡献者同样重要。 尤其值得注意的是,他对比了京汉两地同学在知识面(如对团购业务理解深度)上的差异,并强调了环境不能成为借口,主动通过阅读拓宽见识是可行的。这些基于实战的细节建议,都指向一个核心:求职不仅是技巧比拼,更是对个人视野、应变能力和自我认知的一次综合检验。

IT 累计浏览 3,801

在2048里能够得到的最大的数是多少?

这篇讲的是2048游戏的一个数学极限问题。作者从Michael Brand的一个谜题出发,探讨了在这个著名的合并数字游戏中,理论上能得到的最大数字究竟是多少。 文章首先简明地解释了游戏规则,然后切入核心证明:为什么2¹⁸ (262144) 这个数字在4×4的棋盘上永远无法得到。作者通过一个巧妙的二进制分析指出,棋盘上所有数的总和的二进制表示中,“1”的个数不可能超过棋盘格子数16。而要产生一个2¹⁸,其总和的前一步必然是一个二进制“1”个数达到16的状态,这意味着棋盘恰好被2²到2¹⁷这16个不同数字块完全填满,无任何合并空间,游戏直接结束。 由此,131072 (2¹⁷) 成为理论上限。但作者进一步指出,这个数字本身能否达成仍是一个开放问题。尽管有玩家声称成功,但缺乏完整演示过程。文章留下了两种可能性:要么找到一种确定的构造方法来达成131072,要么给出一个更严密的证明来否定它。这使得一个看似简单的游戏,引向了一个关于数学构造与边界的有趣思考。

IT 累计浏览 2,457

和 geek 男谈恋爱的好处若干

这篇讲的是作者从观察身边geek男友出发,总结和这类“技术宅”恋爱的独特体验。文章以Geek Pride Day为契机,为之前一篇《和geek女谈恋爱的好处》写了姊妹篇,核心在于揭示geek男那些常被忽视的浪漫特质与恋爱优势。 作者提炼出五个具体亮点:他们对待热爱之事全情投入的专注极具魅力,恋爱中会将这份执着转移给你;他们追求独特的“极客式浪漫”,比如用代码或技术手段准备耗费心力的惊喜礼物;他们像“行走的谷歌”,拥有海量知识并总能执着地找出答案,成为伴侣身边的百科全书;他们内心往往简单纯粹,像孩子般容易满足,也像“小计算机程序”一样反应可预测;此外,他们还会用高精尖设备和DIY精神,共同打造一个充满智能元素的完美家。 文章最后也以FAQ形式幽默地回应了常见顾虑,指出geek男其实本质也是需要理解与呵护的普通男人,而他们的高智商与深情有时恰恰需要一颗温暖的心去呵护。整体而言,这篇文章并非单纯“安利”,而是透过技术爱好者的外壳,呈现其背后真实、可爱且值得珍惜的人格切面。

IT 累计浏览 3,576

用三段 140 字符以内的代码生成一张 1024×1024 的图片

这篇讲的是 StackExchange 上一个名为 “Tweetable Mathematical Art” 的硬核编程挑战。参赛者需要仅用三段不超过 140 字符(相当于一条推文长度)的 C++ 代码,生成一张 1024×1024 像素的彩色图片。规则是实现 RD、GR、BL 三个函数,分别对应红、绿、蓝三原色通道,通过数学计算为每个像素点赋值。 文章的核心亮点在于展示了极简代码如何创造出令人惊叹的视觉艺术。例如,Martin Büttner 的作品仅用寥寥几个三角函数就生成了绚丽的渐变图案;而排名第一的作品更是利用随机数和递归,在极短的代码内实现了类似分形的纹理效果。文章还列举了用极简代码绘制 Mandelbrot 分形集的实例,颠覆了人们对复杂图形生成代码量的认知。 这些参赛代码巧妙利用数学公式、随机种子甚至静态变量,在字符限制内实现了图像算法的核心逻辑。文章不仅分享了有趣的代码片段,更展现了在极限约束下编程的创造力和美学,对于理解图形学原理和代码压缩技巧都很有启发。

IT 累计浏览 1,040

文明上网,普及科学,传播价值

针对VPN连接不稳、频繁断开影响技术工作的痛点,作者从自身实践出发,分享了一套基于GRE隧道和策略路由的自建“科学上网”方案。核心思路是在国内服务器与海外服务器之间建立一条稳定的GRE隧道,并通过`iproute`策略路由,实现国内流量直接从国内网关出去、国际流量则经隧道从海外出去,从而在保障访问Google等资源速度的同时,避免了所有流量绕行海外的低效问题。 文章详细列出了从建立隧道、配置双向路由规则、通过APNIC数据自动生成中国IP路由表,到设置NAT和调整MTU以确保稳定的完整操作步骤。这套方案相比依赖第三方VPN,显著提升了连接的可靠性和上网速度,为有类似需求的读者提供了一套思路清晰、可落地的实现参考。