阅读文本大概需要 6.1 分钟。

算法的定义

算法(algorithm)在数学(算学)和计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。

算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。

上面是来自维基百科对于算法的定义,相信很多人看完以后应该是这样的表情。

本科 CS 算法的学习

一位程序员想要进阶到高级阶段,成为人们所说的编程大牛。那算法这门艺术是必须掌握。但国内大部分本科对于算法的教育可以用失败来形容,更不用说那些培训出身的程序员。普通 CS 本科的学生,算法是他们的必修课。但 95% 的科班生对于算法的理解仅限于知道有个时间复杂度、空间复杂度。稍微厉害点的可能还知道递归、二叉树、最小生成树、有向图、红黑二叉查找树。但要叫他们写一个最简单的排序算法,大部分人都写不出来。

我大学就读于某个普通二本,学的就是计算机专业。算法这门课是我大三上学期学习的课程。那时候教我们的老师,算法功力非常深厚,对于各种算法了如指掌,像插入排序、冒泡排序、希尔排序、快速排序、深度优先搜索、广度优先搜索等等这些算法,老师闭着眼睛都可以写的出来。但即使这样博学的老师,仍然不能把算法教好。我们班的学生经过一学期的算法学习,大部分人连最基础的排序都不会写。一学期的算法课,大家倒是了解很多算法的概念。

而导致这样的情况,本质是因为大学对于算法的教学是有很大的问题。算法这门课本身就是非常深奥的一门学科,很多人在没上大学之前根本就没接触过。大家都是算法小白。然后大学对小白的教育就是教一大堆难懂的概念。先来一波概念教学,教你什么是空间复杂度,什么是时间复杂度,什么是递归,什么是二叉树,什么是有向图、什么是 Dijkstra 算法、什么是递归懵逼。

各种让人头大的概念,先安排一波。这就像让一位小学生先去学习高中数学的内容,国内又能有几个小学生能学懂?有多少人在最开始学习算法就抱着一本《算法导论》苦啃。学习没几页就被里面各种难懂的概念所难倒,然后就放弃算法的学习。

计算机这门学科本身就是注重理论和实践相互结合。大部分的理论就是为了解决实际生活中的问题。而国内计算机的教育都只注重理论,却完全忽略实践。这样教出来的学生千篇一律,只懂一大堆理论知识,却连一个最简单的管理系统都做不出来。最可笑的是我本系的计算机同学,在大四临近毕业的时候,还要花上万的费用,去培训机构学习。这就是你们眼中的科班生。

生活中的算法思想

最开始算法学习的确非常的枯燥,记得自己最初为了记住「插入排序」这 9 行代码,我花上了两天的时间。就是下面这几行代码。

各种不能理解其中的门道。然而当你理解了其中的思想,其实算法是非常有趣的一门学科。利用算法的思想去解决生活中的问题,会产生许多非常有趣的事情。

比如在知乎上有这样的一个问题「你在生活中用过最高级的算法知识是什么?」

其中的一些问答:

1 二分找肉法

吃串串火锅,就是火锅里面煮肉串的。串非常长,一端串着肉。由于很多人吃,串放在锅里很多,所以大多数肉串都掉进汤里了。

我手里有近  30 个串,但是一看末端,只有一片肉。末端我是不愿意碰的,因为上面都是油。所以我只能从另一端来挑出来那片有肉的串。

那么在最坏情况下,我需要 O(n),也就是 30 次挑选才能选出来那根有肉的串。

于是我发明了二分找肉法,首先把手里的串分成等量的两份,看肉在哪一份。然后对有肉的那一份进行同样操作,直到 n = 1 为止。

复杂度从 O(n)降为 O(logn),只需要 5 次挑选。

在我发明算法并且找到肉的这段时间里,朋友已经把锅里的肉都吃完了。

2 打牌时的插入法

生活中打牌时用的就是插入排序。

3 按学号快速排作业法

老师让我把全班 60 本作业本按封面上的学号排好。于是我灵活运用了快速排序的知识,从本堆中随便抽出一本,把学号比它小的本子放在左边,学号比它大的本子放在右边,再从左边这一堆挑出一本……

如此一来我的排本子的时间复杂度就从普通人用的插入排序的  O(n²)  变成了 O(n log n)。周围的同学投来好奇的目光,我洋洋自得,心想学过算法的我就是不一样。快速排序效率果然很高,不一会儿,我的桌子就放不下了_(:з」∠)_。

兴趣是所有学习最好的老师

通过上面生活中的算法实例,虽然有些算法还有缺陷,但是不是觉得算法好像挺有趣的?算法还有这种操作?当然如果你没有学习过算法,对于二分查找法、插入排序法可能你不太明白。但通过这样生动有趣的生活实例,一下子就提高你对算法的好感度。紧接着你为了弄明白其中的算法思想,你会主动去查找相关的资料。

这样的兴趣驱动学习,是我一直想对大家强调的一点。不要在刚开始接触编程语言的时候,就陷入无止境的概念学习。有些概念真的非常难懂,但不要紧,你可以暂时的跳过。等你对编程学习的深入,在回头看看以前觉得很难的地方,就会有种海阔天空的感觉。这就好比你现在回头看看初中的数学一样,觉得以前的数学好简单。不要因为一些暂时不能理解的内容,就让你失去学习的信心,放弃了编程的学习。

在编程中找到乐趣是一个程序员的基本素养。

点赞、转发、点广告也是一个程序员的基本素养。

-来自 Koc 的瞎说

推荐阅读:

每天分享 Python 干货

一个程序员的素养:生活中的算法思想相关推荐

  1. 程序员如何快速准备面试中的算法 - 结构之法

    准备面试.学习算法,特别推荐最新出版的我的新书<编程之法:面试和算法心得>,已经上架京东等各大网店 前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作 ...

  2. 程序员如何快速准备面试中的算法

    程序员如何快速准备面试中的算法 准备面试.学习算法,特别推荐最新出版的 新书<编程之法:面试和算法心得>,已经上架 京东等各大网店 前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于 ...

  3. 如何“反脆弱”的过好一个程序员的低碳生活

    话说,过去两年多以来,世界发生了很大变化,对我们软件工程师来说影响尤甚:首先是疫情让大家禁足在家 - 长则数月.短则数天,都是说不准的哈:其次,元宇宙忽然火了,号称来了,例如据微软的观点和策略,沉浸式 ...

  4. 作为程序员,他们生活中的“悲哀”有哪些?来看看你中招了没。

    前言 作为程序员,我们天天都在敲代码,有钱没时间花,外出玩一趟心里都心心念这自己的代码. 而且程序员群体总觉得穿衣有品位生活有情调的,技术一定很菜,而且头发多怪我咯? 天天加班,天天熬夜改 bug,所 ...

  5. 一个程序员的真实生活感悟

    不是我真正经历的,但我一字不漏的看了,感悟很深,有些观点也正是我想的. 一.工作重要.生命更重要 刚入行程序员那会,老板是海归,有能力有资本,公司做的东西技术含量高,政府重视,一切都是蒸蒸日上.在我的 ...

  6. 一个程序员的真实生活状态。没错,是我!

    web前端教程 用大白话,来讲编程 热门文章 原创教程 原创教程: 附加习题: 趣味职场 行业困惑: 职业规划: 新手求职: 职场心得: 职场感悟: 新手学习: 职场感悟: 学习困惑: 职场焦虑: 感 ...

  7. 11张图揭露了程序员的日常生活,看完笑哭(泪奔)!

    (点击上方公众号,可快速关注) 程序员的日常生活中只有代码和电脑,做为一个程序员,我更了解程序员,下面带你走进程序员的神秘日常生活,程序员大佬们也看看,你的生活是否如我所说呢 1.程序员一般待遇优厚, ...

  8. 一个程序员的自我救赎

    为了找一个能清晰表达我在2017年的状态词语,我搜索了不下百个词语还是未能找到一个贴切的形容,可想我这一年的状态该有多么的糟糕.既然无法汇总,只好通过文字来聚焦我的思绪把这混乱一层一层地剥离.观察和思 ...

  9. 交了一个程序员男朋友后,我彻底变了……

    程序员,是一种职业,但由于网络上关于程序员的段子络绎不绝,导致这一职业在大家心中也有了不一样的颜色. 比如,很多人会认为和程序员交往一定是件特别的事情,相关话题也时常被提及,在知乎上,就有人提问&qu ...

最新文章

  1. 如何生成动态matlibplot动图?
  2. 大神们请看python日期是这样转换的
  3. dmalloc用法快速入门
  4. 解决OracleDBConsoleorcl不能启动【转】
  5. javaScript基础讲义第四天(1)
  6. Python随笔-切片
  7. ORA-00911:无效字符 错误及解决
  8. Tunnelling HTTP Traffic Through XSS Channels.pdf
  9. GJM:C# WinForm开发系列 - DataGridView 使用方法集锦 [转载]
  10. 第二百九十四节,Redis缓存-Redis安装
  11. csv 20位数据 如何打开可以预览完整数字_条码打印软件如何批量制作MSI Plessey码...
  12. LeetCode – Refresh – Exceel Sheet Column Number
  13. alien rpm deb,ubuntu下安装jdk过程及遇到的问题
  14. 科学计算机统计模式中中间数据输错怎么办,科学计算器在统计功能中如何清除以前不需要的数据?...
  15. 实践:VB创建Com组件 在Asp以及.Net中调用
  16. jQuery如何使用most()方法?代码示例和解析
  17. 双绞线的种类与选择:
  18. tasklist、taskkill、taskmgr
  19. 从java代码到网络编程
  20. python大数据分析标准库_大数据分析python库

热门文章

  1. SQL注入的注入点找法
  2. 苹果关闭自动更新_iOS终于有这个功能,可以关闭自动更新
  3. SQL基础入门-数据控制语言-Grant与Revoke
  4. Node快速切换版本、版本回退(降级)、版本更新(升级)
  5. 【物联网】二维码——简要介绍
  6. 【计算机网络】Transmission-Control-Protocol拥塞控制
  7. 计算机搞笑技巧,分享10个最常用的电脑操作技巧,你能掌握几个?
  8. 好用的多维表格软件,出世一年便已表现抢眼
  9. python指定位置写入文件_Python中如何在指定目录下进行文件的读写操作
  10. Android属性动画完全解析(上),初识属性动画的基本用法(转)