数据结构与算法-大O记法介绍

341 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

大O记法

量化线性查找最准确的方式是具有N个数据的数组,线性查找最多需要N个步数。同时为了更好的表达时间复杂度,通常采用大O记法方式来表示。众所周知计算算法采取的形式是以步数而非时间,另外大O记法是基于要处理数据量来描述算法所需步数,大O会根据数据增长变化而步数发生变化。

  • 数组读取效率很高,读取只需要一步。用大O记法表示就是O(1)
  • 数组查找效率并不高,此过程需要遍历数组。用大O记法表示就是O(N)(以最坏情况为准)
  • O(N)算法步数等于数据量,也被称之为线性时间
  • O(1)是恒定的,被称之为常数时间;它所表示的是数据变化不影响步数变化而非步数就是1的概念
  • 总体来说在临界点之后O(N)算法会比O(1)算法低效

算法表示

特殊场景下的算法

线性查找并不说就是O(N)算法,当查找数据就在数组头部严格来说是不是就是O(1)了。这种情况下更加准确的表达线性查找的大O记法应该是最好情况下为O(1)而最坏情况下是O(N),这样描述可能更加精准但是尽管如此大O记法一般情况下还是以最坏情况作为标准。

二分查找的大O记法

了解O(N)和O(1)之后再来介绍新大O记法,像是二分查找如何用大O记法表示,它的时间复杂度是介于O(1)和O(N)之间的。二分查找的大O记法表示为O(logN),又称为对数时间,它的算法是不停的将数据对半切分直至找到最后的值。

在数学理论知识中对数是指数的反函数,指数232^3等于2x2x2;反之log28log_28反推出结果是3。举例之后似乎对于O(logN)就更好理解了;其中O(logN)等价于O(log2log_2N),当N=8时O(log8)表示步数为3。

总结

大O计法可作为算法的参考系帮助开发者在实际代码编写中去推导算法效率,有助于实现高效代码提升效率减轻对系统的压力。

线性查找恒定读取二分查找
O(N)O(1)O(logN)