电脑内的神奇魔法 ── 演算法
难以想象,本来只会算0和1的「蠢玩意」,却能为我们解决生活上各式各样的问题。这个令电脑能够执行以0和1序列组成的指令,而变得聪明的神奇魔法,就是今天我想分享的主题 ── 「演算法」了。
演算法是甚么?
演算法(algorithm)是电脑科学非常重要的一部分。从定义来说,演算法是可以解决某些问题的有效方法之有限集合(finite set)。听起来好像很复杂,就让我举一个例子来说明吧!
以「洁手」为例,只要完成以下(A)或(B)的各个步骤,就能解决「洁手」问题:
(A) 或 (B) | |
用水 1. 打开水龙头 2. 用水弄湿双手 3. 加入枧液,揉搓双手最少20秒 4. 用水冲洗干净 5. 关上水龙头 | 用酒精搓手液 1. 伸手到消毒酒精机的感应器下 2. 等待机器喷出消毒酒精 3. 搓揉双手直至酒精挥发为止 |
故此这些步骤可以称为「洁手的演算法」,因为演算法就是透过一系列动作解决特定的问题。
演算法如何运作?
基本上电脑能解决的问题,都是通过0 和 1的运算来实现。无论是基本的四则运算,即加、减、乘、除,还是复杂的任务例如以人工智能按用户喜好排序推荐电影等,背后都离不开演算法。为了令大家更容易明白演算法的运作,下文我将透过两个例子跟大家一探究竟。
任务:将一个打乱的数列 {9,4,6,3,1,8,5,2} 顺序排列成为 {1,2,3,4,5,6,8,9}。 |
1. 插入排序法
将数列分成已整理和未整理的两部分,在未整理部分中挑选一个数字,按数值大小放在已整理部分中正确的位置。重复这个步骤,直至未整理部分的项数变为0。
图1:插入排序法
2. 快速排序法
在数列中随机抽取一个数字,以此为参考值,将数列分成小于和大于该数的两个子数列。在子数列中分别重复这个步骤,直至完成排序。
图2:快速排序法
演算法与「时间复杂度」
以上两种排序法中,哪一种比较快?这就要看它们的「时间复杂度」了。
「时间复杂度」是描述演算法中输入项数(n)与运行所需时间之间关系的函数,通常以大O符号表示。
常见的「时间复杂度」例子:
O(1): 判断单双数(判断1位数 和100位数所需时间是一样的)
O(n): 加减法(100位数加减所需时间比1位数加减所需时间多100倍)
O(n²): 长乘法(100位数乘法所需时间比1位数乘法所需时间多100*100 = 10,000倍)
要留意的是,计算「时间复杂度」时会假设n非常大,因此我们只取增长速度最快的项(通常是最大指数的项),亦会忽略系数,例如:
O(3n³ + 2n + 5)→ O(3n³)→ O(n³)
图3:不同时间复杂度的比较
插入排序法的平均时间复杂度为O(n²) ,而快速排序法的平均时间复杂度则为 O(n log n) 。
回到上面的问题:两种排序法中到底哪种比较快?这就交给大家思考了!
作者简介:
吴沛熹,中四学生,就读于荃湾官立中学。于小学四年级加入香港资优教育学苑, 积极参与各种课程。对电脑十分感兴趣,希望能学到更多有关人工智能的知识,并以此为职业路向。平时亦喜欢做运动调剂身心,最常做的运动是篮球和排球。