这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战。
大O:数步数
为了统一描述,大不关注算法所用的时间,只关注其所用的步数。
第1章介绍过,数组不论多大,读取都只需1步。用大记法来表示,就是:
很多人将其读作“大O1”,也有些人读成“1数量级”。我一般读成“O1”。虽然大记法有很多种读法,但写法只有一种。
意味着一种算法无论面对多大的数据量,其步数总是相同的。就像无论数组有多大,读取元素都只要1步。这1步在旧机器上也许要花20分钟,而用现代的硬件却只要1纳秒。但这两种情况下,读取数组都是1步。
其他也属于的操作还包括数组末尾的插入与删除。之前已证明,无论数组有多大,这两种操作都只需1步,所以它们的效率都是
。
下面研究一下大记法如何描述线性查找的效率。回想一下,线性查找在数组上要逐个检查每个格子。在最坏情况下,线性查找所需的步数等于格子数。即如前所述:对于
个元素的数组,线性查找需要花
步。
用大记法来表示,即为:
我将其读作“O N”。
若用大记法来描述一种处理一个
元素的数组需花
步的算法的效率,很简单,就是
。
数学解释
要采用一种易于理解的方式来讨论大。当然这不是唯一的方式,如果你去上传统的大学算法课程,老师很可能从数学角度来介绍大
。因为大
本就是一个数学概念,所以人们经常用数学词汇介绍它,比如说“大
记法可用来描述一个函数的增长率的上限”,或者“如果函数
的增长速度不比函数
快,那么就称
属于
”。大家数学背景不同,所以这些说法可能对你有意义,也可能没什么帮助。
如果你想深入研究大背后的数学理论,可参考Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein所著的《算法导论》,里面有完整的解析。此外,Justin Abrahms在他的文章中也对大
做了不错的定义,维基百科上也有大量的数学解释。