《算法基础:打开算法之门》一第1章 什么是算法以及为什么应该关注算法

简介:

本节书摘来自华章出版社《算法基础:打开算法之门》一书中的第1章,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区“华章计算机”公众号查看

第1章

Algorithms Unlocked
什么是算法以及为什么应该关注算法

让我们从我经常被问到的一个问题开始:“什么是算法?”一个常见的回答是,“完成一个任务所需的一系列步骤。”在日常生活中经常会碰到算法。刷牙的时候会执行一个算法:打开牙膏盖,拿出牙刷,持续执行挤牙膏操作直到足量的牙膏涂在你的牙刷上,盖上牙膏盖,将牙刷放到嘴的1/4处,上下移动牙刷N秒,等等。如果你必须乘通勤车去工作,乘通勤车也是一个算法。诸如此类。〖ZW(B]或者,正如一个我曾经一起打曲棍球的同伴问我的,“什么是nalgorithm?”〖ZW)]但是本书是关于运行在计算机上的算法的,或者更概括地来讲,是关于运行在计算设备上的算法的。正如你日常所运行的算法会影响你每天的生活一样,在计算机上运行的算法也会影响你的生活。你使用过GPS来寻找旅行路线吗?它运行一种称为“最短路径”的算法以寻求路线。你在网上购买商品吗?那么你会使用(应该正在使用)一个运行加密算法的安全网站。当你在网上购买商品时,它们是由一个私营快递公司发货的吗?它使用算法将包裹分配给不同的卡车,然后确定每个司机发件的顺序。算法运行在各种设备上——在你的笔记本上,服务器上,智能手机上,嵌入式系统上(例如你的车中,你的微波炉中,或者气候控制系统中)——无处不在!运行在计算机上的算法和你在日常生活中执行的算法有什么区别呢?当粗略地描述一个算法时,你可能能够容忍它的非精确性,但是计算机不能。例如,如果你开车上班,你的drivetowork算法可能会说“如果交通不畅,可以选择其他路线”。虽然你可能知道“交通不畅”是什么意思,但是计算机不知道。因此,一个计算机算法是完成一个任务所需的一系列步骤,1且这些步骤需要足够精确地描述,以使得计算机能够运行它。如果你已经用Java、C、C++、Python、Fortran、Matlab或者类似的编程语言编写过哪怕一丁点的计算机程序,那么你会对精确度标准的含义有一些概念。如果你从来没有编写过计算机程序,那么当你看了本书中如何描述算法后,可能你会对精确度有一点概念。我们思考下一个问题:“我们想从一个计算机算法中获取什么?”计算机算法解决计算问题。我们希望从一个计算机算法中获取两个结果:给定一个问题输入,它应该总能够产生该问题的正确输出结果,并且在运行该算法时,应该能够有效地利用计算资源。让我们依次看看这两个必要条件。

相关文章
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
2803 0
|
算法 API
算法基础学习2——冒泡排序
要比较的每一对元素是相邻的,从下标为0开始,到最后一个元素,如果下标设为 j,则相邻元素下标值为 j +1,搜索到最后一个元素:j+1<a.length,而 a.length - 1 = i ;所以终止条件是 j < i
100 0
算法基础学习2——冒泡排序
|
机器学习/深度学习 算法 Java
算法基础学习1——时间复杂度和空间复杂度
算法基础学习1——时间复杂度和空间复杂度
96 0
算法基础学习1——时间复杂度和空间复杂度
|
搜索推荐 Java
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
|
机器学习/深度学习 自然语言处理 算法
深度学习算法基础
深度学习算法基础
148 0
|
存储 编解码 算法
【算法基础】希尔排序解析
希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
87 0
|
编解码 算法 网络协议
【算法基础】冒泡排序解析
在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。
133 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
131 0
|
存储 算法
算法基础
递归算法在计算机系统中用栈帮助实现,一般常见的算法有深度优先遍历(DFS),可以解决的问题有迷宫问题是否连通的问题,递推会对应一个递归搜索树,递归搜索树可以帮助我们更好的理解递归的流程,递归要注意的有是否可以进行剪枝,在迷宫问题中,也要考虑是否要保存原有的迷宫。
144 0
算法基础
|
算法 C语言
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
题目:3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的新结点成为值为y的结点的前驱结点。 题目来自李云清版《数据结构》
242 5
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点