首页天道酬勤()

()

admin 12-05 01:24 265次浏览

几乎所有的顶级互联网和软件公司都使用算法和数据结构来调查软件工程师。但是,iOS开发培训并不是为了讨论算法的重要性以及算法是否对实际工作有用(我认为这是一个优秀程序员不可或缺的基本技能),也不是为了讨论“谷歌式”算法面试和“白板编程”的有效性和合理性,而只是作为一个非“竞争性编程”背景的工程师分享一点。

结合我自己的学习经验和作为“信息学奥林匹克”教练的教学实践,我通常认为以下三件事对学习算法至关重要:

首先,练习你的“表达能力”

经常遇到有考研的同学问,“课本上的算法我都懂”,选择题或者人工推导过程中的题我都能做对,但就是写不出来是“码”还是“伪码”,所以对于算法题就更加不知所措了。在我看来,首先是缺乏“表达能力”。

除非你是一个经验丰富的程序员,否则我认为学习编程语言的语法最重要的是学习如何“表达”逻辑和流程。在很多算法竞赛书籍中,有一种方法叫做“模拟法”。说白了,这种方法就是“直接”和“程序化”我们处理问题的自然步骤。比如求最大数的过程,矩阵运算的过程,十进制转换或求最大公约数时使用的轮流除法,模拟垂直运算的大整数相加等。我们可以直接通过程序“模拟”这个过程。大多数编程书籍在介绍语法的时候,都会提供类似这些问题的练习,有助于我们增强语言表达能力。如果你用Python作为主要语言,《以硬道理学Python》包含了大量练习表达技巧的主题,学完整门课程肯定会收获很多。在“hackerrank”上有一个专门的“域”练习“程序表达”,A哥给出的问题大部分都不差。

开发一些简单的面向应用的“演示”也可以学习一些语言表达,但是它的逻辑往往过于简单,不利于这种实践。

2.先读这本书,然后刷题

其实看完《算法导论》,做了以上练习的人并不多。我经常查阅它作为参考书,只是断断续续地精读一些章节。我也建议算法基础差的初学者选择罗伯特塞奇威克的《算法》,这是一本比较简单易懂的书。了解算法的原理和执行过程,然后学会手动模拟过程,再尝试自己实现。配合一些练习,不断加强对算法的理解。

作业本中的练习通常比自己从“OJ”中发现问题更有效,尤其是一些证明和分析问题不是你直接写代码的,可以促进对算法本质的理解。比如“快速排序”的最坏情况和最好情况是怎么产生的,用随机和固定策略划分优劣分析,为什么这种排序算法“不稳定”。在此基础上,做“OJ”上的刷题训练,提高“Coding”的实现能力,加深对算法的理解,更有效。

通过这种训练,至少可以针对算法清晰的问题正确编写代码,然后通过“调试”解决细节问题。

三.问题的简化和转化

有时候我明确告诉一些同学,你可以写一个“二叉树的层次遍历”,他可能就能写出来。然而,当iOS开发培训让他在“无动力图”上寻找“最短路径”时,他却不知所措。有时,即使“图”不是我们在“数据结构”中学到的“邻接矩阵”或“邻接表”的表示,我们也不知道如何将问题转发给“图”。他们不明白这里的“图”可以是一个看不见的图。我们需要找出某个“节点”所有相连的“节点”。寻找的过程可以是指针指向的“有形的边”,也可以是经过某种数学运算或变换后得到的值。就像“八皇后”问题一样,我们在深度优先遍历整个状态图时,不断检查一个状态到另一个状态的合理性,从而得到正确的解。我们的计算机本质上是一个“状态机”,动态规划或搜索就是从状态转移中找到正确的解决方案。关于每一个具体算法的含义,比如动态规划、贪婪和递归,“quora”和“Zhihu”都有很多高质量的解答和分析,学习过程中的阅读也可以帮助我们解决疑惑。

问题的减少和转化需要不断的练习。所以除了前面提到的《算法》,找本书带着练习刷题也是很有必要的。我在自己的学习过程中使用了Akiba Takuya翻译的《挑战程序设计竞赛》和ddddw翻译的《挑战编程:程序设计竞赛训练手册》。基础差的同学可以选择ddddw的《算法竞赛入门经典(第2版)》。

我们的目的是学习算法,而不是刷题,培养成为一个“有竞争力的程序员”,所以我认为我们只需要选择经典的习题。我自己也不是一个“争强好胜的程序员”,但是通过学习和实践,除非有特别“刁钻”的问题,像“Leetcode”或者“CC150”或者考研这样的难题都可以轻松应对。当然,我们学习算法的目的绝不是为了面试,这对我们的工作也有很大的帮助,这里就不讨论了。

滑板爱好者一旦充满信心,就可以尝试在“Leetcode”上解答经典的面试问题。美帝大厂的面试问题一遍又一遍的充斥着这些问题,真的没有创意。或者你可以去“黑客银行”参加企业“招聘目的”的竞争,也许你可以翻墙去美帝。iOS开发培训认为这根本不是梦。

c语言小例子(c语言经典实例) 什么是调度员(调度员好做吗)