算法是一组指令。定义真的那么简单。算法可以像给出这样的指令一样简单:
- 沿着街道往下走。
- 在第一个右边。
- 找到左边的第二个房子。
- 敲门。
- 交付包裹。
虽然算法的定义很简单,但实际意义及其对我们生活的影响可能非常复杂。
一个算法的例子
我们在日常生活中使用的算法的一个常见示例是一个配方。这套说明为我们提供了我们需要的所有成分以及如何处理这些成分的说明。听起来很简单吧?
但是如果你不知道量杯的位置怎么办?你需要一个算法来找到它。您甚至可能需要一个如何使用量杯的算法。
因此,虽然算法是一组指令,但它还需要考虑将要解释这些指令的人或内容。例如,如果您向朋友说明如何从您的房子到最近的杂货店,您的朋友只知道如果他们知道您的房子所在的位置如何到达该商店。他们没有能力(还)从另一个朋友的家里找到那个特定的杂货店。
这就是算法既简单又复杂的方法。当我们谈论计算机算法时,了解计算机能够做什么是制定算法的基本部分。
排序算法是如何演变的
最早创建的算法之一是冒泡排序程序。冒泡排序是一种通过循环数据集对数字,字母或单词进行排序的方法,并排比较每组值,并在需要时交换它们。
重复此循环,直到算法可以在整个列表中移动而无需交换任何内容,这意味着值正确排序。这种类型的算法通常被称为递归算法,因为它一遍又一遍地循环,直到它完成任务。
这种算法可能看起来很简单:
- 转到第一个值。
- 根据下一个值检查该值,并根据需要交换位置。
- 转到下一个值并重复比较。
- 如果我们位于列表的末尾,如果在循环期间交换了任何值,请返回顶部。
但泡沫排序并不是最多的 高效 排序值的方式。随着时间的推移,计算机变得越来越能够快速完成复杂的任务,新的排序算法出现了。
一种这样的算法扫描第一个列表并创建第二个排序值列表。此方法仅对原始列表进行一次传递,并且对于每个值,它将遍历第二个列表,直到找到放置值的正确位置。通常,它比使用冒泡排序方法更有效。
这是算法变得非常疯狂的地方。或者真的很有趣,取决于你如何看待它。
虽然冒泡排序方法被认为是以多种方式对值进行排序的最低效方法之一,但如果原始列表正确排序,则冒泡排序可以是其中之一 最 高效。这是因为,在那种情况下,冒泡排序算法将一次遍历列表并确定它是否正确排序。
不幸的是,我们并不总是知道我们的列表是否是预先排序的,因此我们必须选择一种在大量列表中平均使用最有效的算法。
我们从冒泡排序算法中学到了什么
- 随着我们找到更有效的方法和/或计算机变得更能够执行复杂任务,算法随着时间的推移而演变。
- 有时选择算法是因为它们在“大多数”时间“更”有效。
- 仅仅因为算法在大多数情况下效率更高并不意味着它在每种情况下总是最好的。
日常生活中的Facebook算法和更多
算法每天都在帮助人类。当您搜索网络时,一种算法正在尝试找到最佳搜索结果。向智能手机询问方向,算法决定您选择的最佳路线。当您浏览Facebook时,算法会决定我们朋友的哪些Facebook帖子对我们最重要。 (我们希望我们的朋友不要找出Facebook认为我们最喜欢哪一个!)
但在算法上思考可以帮助我们远远超出我们的计算机生活。它甚至可以帮助我们建立一个更好的三明治。
假设我从两片面包开始,在一片上涂芥末,在另一片上涂蛋黄酱。我在蛋黄酱面包上放了一片奶酪,上面放了一些火腿,还有一些生菜,两片番茄,然后盖上那片芥末酱。好三明治吧?
绝对是我马上吃的。但如果我把它放在桌子上一段时间,那顶层面包可能会因浸泡一些番茄而变得潮湿。这是一个我没想到的问题,我可能会在注意之前制作三明治多年,但是一旦我这样做,我就可以开始考虑改变算法的方法,以便建立一个更好的三明治。
例如,我可以摆脱番茄。但我不想失去番茄的味道。相反,我可以把番茄放在面包和生菜之后的三明治上。这允许莴苣在番茄和面包之间形成保护屏障。
这就是算法的演变方式。并且算法不必由计算机运行即可作为算法。算法是一个过程,过程就在我们身边。