《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀

摘要:王晓华是一位热衷于算法研究的程序员,他是CSDN算法专栏的超人气博主,也是《算法的乐趣》一书的作者。近日,笔者采访了王晓华,请他分享算法的经验之道。

王晓华是一位热衷于算法研究的程序员,他是CSDN算法专栏的超人气博主( 博客),也是《算法的乐趣》一书的作者。2005年毕业于华中科技大学,目前在中兴通讯上海研发中心从事光纤接入网通讯设备开发,担任EPON(以太网无源光网络)业务软件开发经理,参与开发的PON设备在全球部署过亿线,为数亿家庭提供宽带接入服务。 

日前,笔者对王晓华进行了采访,请他分享专研算法的乐趣之道。


王晓华

CSDN:请先做个自我介绍、所在公司以及目前所负责的领域。

王晓华:我目前在ZTE上海研发中心从事软件开发相关工作。我们开发的产品是无源光网络(PON)设备,在网络设备领域中,我们开发的设备属于接入网设备,也就是常说的“网络的最后一公里”。光接入技术目前已经是接入网的主流技术,未来的家庭宽带建设,比如FTTH、FTTB,都依赖于光接入技术的不断发展和革新。当前,下一代PON技术(NG-PON2)的标准正在制定过程中,NG-PON2标准将提供单纤40G bps的下行带宽,千兆光纤入户将成为现实,到时候只有百兆接口家用路由器将被淘汰,无线传输的速率也将水涨船高。

CSDN:是什么原因促使你对算法感兴趣的?又是什么原因让你坚持把算法做下去的?

王晓华:刚开始我对算法和软件没有概念,觉得编程序就是为了应付作业。后来因为学习表形码输入法,就写了一个程序把Windows格式的表形码码表文件转换成UCDOS支持的码表文件格式,这个程序只用了几分钟就完成了十几万条记录的转换,给我很大的震撼,让我觉得这东西不只是交作业,还可以做一些有用的事情,从而开始对编程感兴趣,从简单的排序算法开始,逐渐接触了更多有用的算法,进而对设计算法产生兴趣。

研究算法其实是一个很枯燥的过程,常常一个人在计算机前面一坐就是一天,其他人都很难理解这种行为,没有兴趣是坚持不下来的。上学的时候也热衷于参加各种算法比赛,填鸭式的背很多东西,记算法的模式,搞得很辛苦,也没取得很好的结果。当时以为这就是算法的意义,搞得几乎对算法失去了兴趣。读研究生的时候想做一个MP3播放器,为了实现均衡器和频谱的功能,找了很多资料,最后发现了离散傅立叶变换算法,小小的算法蕴含了这么多的意义在里面,于是对算法又燃起了兴趣。后来有学习了一些很有意思,但是都很实用的算法,比如A*寻径算法、棋类游戏的博弈树算法等等,渐渐地开始把兴趣放在更有实用意义的实用类算法上,开始研究针对各种现实问题的算法设计和实现。解决的实际问题越多,分析问题、解决问题的能力就越强,“玩”算法的兴趣就越大。

CSDN: 《算法的乐趣》这本书的思路是怎样的?对读者而言如何学习这本书,你有什么建议?

王晓华:这本书从一开始就顺着培养兴趣的思路来策划的。市面上已经有很多算法设计的书了,或浅显易懂,或深不可测,如果沿用类似的讨论再写一本完全没有意义。而我的“算法系列”专栏中刚好已经介绍了很多有意思的算法,于是就以此专栏为基础,补充了一些有趣的专业类算法和实用类算法,构成了本书的主要结构。每一个有趣的算法都展示了从问题的提出,到设计模型,最后得到能解决问题的算法实现的完整过程,将算法设计的三个关键问题融入到整个过程中,使得读者在得到一个趣味算法的同时,也学习了算法设计的整个过程。

本书各个章节之间没有前后关系,可以从任意一个感兴趣的章节开始看这本书。对读者而言,我建议先系统看完前三章,然后再挑选感兴趣的章节开始。在图灵社区可以下载本书的全部源代码,任何问题都可以在源代码中找到答案。

CSDN:什么是算法?最常见的算法有哪些?可否就其中一个给大家举个示例。

王晓华:我理解的算法的意义就是解决问题,从这个角度看,我将算法分为专业类算法、通用类算法和实用类算法三类。专业类算法通常都有一些坚实的数学理论、物理理论或其他理论作为理论支撑,比如离散傅立叶变换算法、RSA算法、AES加密算法、各种曲线拟合算法、插值算法、牛顿迭代法以及计算机图形学中的各种图形生成算法、消隐算法等等。专业类算法通常在一些专业领域内广泛应用,经过多年的研究和技术积累,普遍形成了各种固定的高效算法实现,很多情况下都可以像函数库一样直接拿过来用。

通用类算法也有相应的理论支撑,算法的套路是固定的,但是算法的实现要视具体的问题而定。此类算法的例子也比较多,比如退火算法、蚁群算法、遗传算法、BP神经网络模型学习算法(误差反向传播算法)等等。此类算法虽然套路固定,但是不同的问题有不同的实现方式。以遗传算法为例,针对不同的问题要设计不同的遗传编码格式,遗传编码格式不一样,对应的基因交叉和变异算法的具体实现自然也不一样,但总的来说,还是按照遗传算法的套路进行。通用类算法应用领域更广泛,上面提到的几种算法都是常用的最优化求解算法(随机搜索算法),在机器学习、人工智能和虚拟现实等领域都可以看到这些算法的身影。

实用类算法往往是针对特定的问题设计的算法,用于解决某个或某种类型的问题。有时候解决问题的算法很多,但是受重视的往往是公认的效率最高的算法。比如稳定匹配问题,Gale-Shapley 算法就是公认的最好算法。二分匹配问题,大家会首选匈牙利算法。Pierre Dellacherie 算法是俄罗斯方块游戏中最好的One-piece评估算法。除了这些著名的算法之外,任何人为解决某个问题而设计的算法也可以归为实用类算法,比如本书提供的求解“三个水桶等分8升水问题”的算法和“爱因斯坦的思考题”的算法。设计针对具体问题的实用类算法是衡量一个程序员水平高低的重要因素,也是程序员需要重点关注的问题。

CSDN:目前中兴通讯用到了哪些算法?能不能向读者详细介绍下该算法?

王晓华:中兴通讯的产品线很长,甚至包括太阳能发电和无线充电,我还真不知道这些产品中到底都用到了哪些算法。就我所涉及的产品来说,很多基本的算法都会用到,既有各种专业算法,也有为解决特定问题而设计的通用算法。比如线性表的排序和查找就用到了快速排序算法和二分查找算法,数据一致性校验用到了CRC算法,还有本书中提到的环形队列算法。PON网络的特点是下行数据是广播到所有终端设备上的,为了数据安全,标准定义了一套密钥交换算法,同时规定了实际加密数据采用了三重扰动算法和AES加密算法。

CSDN:从一名资深程序员到《算法的乐趣》的作者,你的学习秘诀是什么?会通过哪些方式来提升自己的专业技能?

王晓华:其实没有什么秘诀,就是多看、多做和多想。多看就是多看书,多看各种优秀算法的实现代码。多做就是多写代码,看懂算法的实现原理和写出正确的算法实现之间还是有一道很宽的槛儿,研究一个算法,要到能正确写出算法实现为止,而不是看懂就算了。多想就是多思考,为什么这个算法比那个算法高效?这个启发函数为什么要这样设计?多思考可以培养举一反三的能力。

CSDN:未来的下一步计划是什么?有哪些难点需要去克服?

王晓华:这个还真一时不知道从何说起,先不回答了,抱歉。

CSDN: 目前,你常用的编程语言有哪些?在你看来还有哪些语言比较热门?

王晓华:我目前用的编程语言是C/C++和Lua,偶尔用用Java。2008年听Ivar Jacoson的演讲,他讲了个笑话,形容软件行业就像是时尚业,一天一个潮流:十五年前我们都讨论OO,十年前我们追的是组件、UML和UP,五年前变成了RUP和CMMI,两年前流行XP,现在是Scrum。但是他的一句话我很认同,那就是这些都是好东西,但是没有任何一种是可以解决你的全部问题的银弹。我对当今比较流行的编程语言的看法也是这样,存在就是有道理,这些编程语言没有好坏之分,但是有各自擅长的领域,要合理的使用它们。

CSDN:你是从什么时候开始接触CSDN的?对CSDN有什么建议吗?

王晓华:我从2001年开始就是CSDN的注册用户了,刚开始是泡论坛,后来写博客。建议的话我觉得CSDN要让博主们能够通过博客获得收益,无私的奉献是一种热情,但是热情过后就什么都没有了。之前CSDN的博客是可以嵌入广告的,我就从嵌入广告中获得了十几美元的收益,后来都取消了,我看到很多人就把博客迁走了,或者申请了独立的域名。CSDN的博客和技术文章要繁荣,就要有一个共赢的模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Mac环境搭建以太坊私有区块链进行挖矿模拟

第一步:相关软件的安装 go-ethereum客户端安装Go-ethereum客户端通常被称为Geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。Geth得益于Go语言的多平台特性,支持在多个平台上使用(比如Windows、Linux、Mac)。Geth是以太坊…

vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android

visual studio 2015支持Android开发了。 Microsoft released Visual Studio 2015 Preview this week and with it you now have options for Android development. When choosing one of those Android development options, Visual Studio will also install the brand new Vi…

FFmpeg示例程序合集-批量编译脚本

此前做了一系列有关FFmpeg的示例程序,组成了《 最简单的FFmpeg示例程序合集》,其中包含了如下项目:simplest ffmpeg player: 最简单的基于FFmpeg的视频播放器simplest ffmpeg audio player: 最简单的基于FFmpeg的音频…

基于Ubuntu环境使用docker搭建对于中文识别的chineseocr_lite项目

光学字符识别(OCR) 光学字符识别(OCR)目前已经有了很广泛的应用,很多开源项目都会嵌入OCR 来扩展原有的能力,例如身份证识别、出入停车场的车牌识别、拍照翻译等等本文介绍的开源的中文 OCR 项目&#xff…

Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式

问题 接使用docker的方式来创建项目所报的错误选中文件之后,界面不停的绕圈,显示不了对于图片的识别结果,并且监控界面上出现错误提示如下ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory&a…

基于Ubuntu使用docker的方式来搭建基于Yolo3+crnn的Chineseocr识别

Docker Docker简单易用,具体的安装和配置可以看我的或者其他人的博客 安装完之后,输入以下命令安装chineseocr并且开启服务 docker pull zergmk2/chineseocr docker run -d -p 8080:8080 zergmk2/chineseocr 在浏览器输入http://127.0.0.1:8080/ocr网…

c/c++ 内存使用指南 和实践指导

如果你完全理解如下内容, 请联系我:szu030606163.com, 讨论更深层次合作 。 1. 大内高手—内存模型 单线程模型 多线程模型 2. 大内高手—栈/堆 backtrace的实现 alloca的实现 可变参数的实现。 malloc/free系列函数简介 new…

mininet 应用实践

教学目的与学时建议 能够运用 mininet 可视化工具创建计算机网络拓扑结构能够运用 mininet 交互界面创建拓扑结构能够运用 python 脚本构建计算机网络拓扑结构建议:2 学时 实验环境 下载并安装虚拟机 VMware workstation;下载虚拟机镜像( S…

实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建

Github地址 Github源码地址 支持系统:mac/ubuntu python3.6 实现功能 文字检测; 文字识别; 支持GPU/CPU,CPU优化(opencv dnn) docker镜像服务(CPU优化版本) 下载镜像 链接:https://pan.baidu…

在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本

Github地址 参考地址作者大人,十分热心,对于我的问题,提供了大量的帮助,使我少走了很多的弯路,在此表示由衷的感谢 注意事项 使用nvidia-smi命令查看cuda的版本,必须是10.1或者10.0,10.2是万万…

算法入门篇 一 时间复杂度

时间复杂度 要求:只要高阶项,不要低阶项常数操作:操作花费的时间和数据量无关,比如数组寻址,直接利用偏移量找到对应元素的位置;非常数操作:比如list(链表);查找元素需要遍历链表&a…

算法入门篇二 认识O(NlogN)的排序

递归 例子引出 使用递归的方法求出数组中的最大值(利用的是栈)求中点的方法改进 mid (left right) / 2 //但是如果left和right的数很大,相加会造成内容溢出 改进为 mid left (right - left) / 2 //(right - left)得到整个的长度&…

算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整

归并排序不使用递归 使用一个变量,使其按照1、2、4、8递增,控制左右两边1个元素、2个元素、4个元素等元素的合并 完全二叉树 完全二叉树 要不全是满的,要不叶子节点出现在最后一层,只要出现了叶子节点,后面的都是叶子…

2023年12月24日学习总结

今日to do list: 做kaggle上面的流量预测项目☠️ 学习时不刷手机🤡 okkkkkkkkkkkkkk 开始👍🍎 0、我在干什么? 我在预测一个名字叫做elborn基站的下行链路流量,用过去29天的数据预测未来10天的数据 1、…

Mac/Linux系统连接远端服务器以及相同IP地址的服务器账号密码重置,ssh失败问题

连接远端服务器 ssh 账号IP地址 输入完成之后会提示输入密码,密码输入正确后,就可以连接成功了 重置ssh密钥 如果连接的服务器除了IP地址没有改变,其余的账号、密码、系统等都变了的话,因为曾经连接过的历史数据会保存到本地&a…

Linux操作系统监视NVIDIA的GPU使用情况

对于GPU相关参数介绍 使用命令周期性查看GPU运行情况最常用的参数是 -n, 后面指定是每多少秒来执行一次命令。监视显存:设置为每 1s 显示一次显存的情况:使用命令ctrlz退出 watch -n 1 nvidia-smi 参数介绍 Fan:显示风扇转速&am…

算法入门篇四 桶排序

桶排序 计数排序(基于统计) 要求数据是有限的,和数据状况有关,比如对于200个人统计他们的年龄分布,这个时候需要申请200个桶,因此对于输入数据的规模有限制,如果输入规模是不定的,…

RTP概述

1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP&…

算法入门篇五 链表

牛客网 算法入门篇 判断一个链表是否为回文结构 给定一个单链表的头节点head,请判断这个链表是否为回文结构1->2->1,返回为True;1->2->3为False 思路: 1,遍历链表,将所有元素压入栈中,然后再…

实时流媒体编程基于Linux环境开发

一、流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有…