logn是什么意思_时间复杂度 O(log n) 意味着什么?

  • 原文作者:Maaz

  • 译文出自:掘金翻译计划

  • 译者:cdpath

  • 校对者:zaraguo (zaraguo), whatbeg (Qiu Hu)

f5f3220215d47ec66613ba189ebc95f6.png

预先知道算法的复杂度是一回事,了解其后的原理是另一件事情。

不管你是计算机科班出身还是想有效解决最优化问题,如果想要用自己的知识解决实际问题,你都必须理解时间复杂度。

先从简单直观的 O(1) 和 O(n) 复杂度说起。O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表),O(n) 意味着先要检查 n 个元素来搜索目标,但是 O(log n) 是什么意思呢?

你第一次听说 O(log n) 时间复杂度可能是在学二分搜索算法的时候。二分搜索一定有某种行为使其时间复杂度为 log n。我们来看看是二分搜索是如何实现的。

因为在最好情况下二分搜索的时间复杂度是 O(1),最坏情况(平均情况)下 O(log n),我们直接来看最坏情况下的例子。已知有 16 个元素的有序数组。

举个最坏情况的例子,比如我们要找的是数字 13。

4e5d3f6d8149098e4a51c69424802849.png

十六个元素的有序数组

a1f3138b802ca142cdd78254bdc98ba7.png

选中间的元素作为中心点(长度的一半)

26d85fc3e1fd644c96924bfcb7a0645f.png

13 小于中心点,所以不用考虑数组的后一半

6d9e750f5e7f30bfdeef6c6316a13b4a.png

重复这个过程,每次都寻找子数组的中间元素

6ac690ece819e9293e6f98de4f357b4b.png

f87210199cddff49a7188cc774d78b9b.png

每次和中间元素比较都会使搜索范围减半。

所以为了从 16 个元素中找到目标元素,我们需要把数组平均分割 4 次,也就是说,

e48c5abc5dd0a1558d89e9aa747fb5a6.png

简化后的公式

类似的,如果有 n 个元素,

8b3028d2d4d67904275a418d1d6776b1.png

归纳一下

ae4c6489d467dc1a0af75159030e66dd.png

分子和分母代入指数

a31267000769a153116736e30b10f725.png

等式两边同时乘以 2^k

17285e9668a90f037cd42f8fcb20f226.png

最终结果

现在来看看「对数」的定义:

为使某数(底数)等于一给定数而必须取的乘幂的幂指数。

也就是说可以写成这种形式

4a7251f593b29c61aee6c7fa68f885af.png

对数形式

所以 log n 的确是有意义的,不是吗?没有其他什么可以表示这种行为。

就这样吧,我希望我讲得这些你都搞懂了。在从事计算机科学相关的工作时,了解这类知识总是有用的(而且很有趣)。说不定就因为你知道算法的原理,你成了小组里能找出问题的最优解的人呢,谁知道呢。祝好运!

### 递归算法 O(log n) 时间复杂度分析 对于具有 \(O(\log n)\) 时间复杂度的递归算法,通常意味着每一步操作会将问题规模显著减小。这类算法的一个典型例子是二分查找。 #### 二分查找作为 O(log n) 的实例 考虑在一个已排序数组中寻找特定元素的任务。如果采用线性查找,则最坏情况下需遍历整个列表,其时间复杂度为 \(O(n)[^2]\);而改用二分查找方法后,每次迭代都能排除一半的数据量,从而大幅减少比较次数: ```python def binary_search(arr, low, high, x): if high >= low: mid = (high + low) // 2 # 如果目标值等于中间位置的值 if arr[mid] == x: return mid # 若目标小于中间值,在左子数组继续搜索 elif arr[mid] > x: return binary_search(arr, low, mid - 1, x) # 否则在右子数组中查找 else: return binary_search(arr, mid + 1, high, x) else: # 元素不存在于数组中 return -1 ``` 此函数展示了如何通过不断缩小范围来高效定位所需项的位置[^4]。由于每一次调用都将待查区间折半处理,所以即使面对非常庞大的数据集也能保持较高的效率水平。 具体来说,当初始大小为\(n\)时,经过一次分割变为\(\frac{n}{2}\),再进一步划分为\(\frac{n}{4}, \ldots,\),直到剩下最后一个可能包含目标数值的地方为止。这个过程可以用对数表达式描述,即总共需要大约\(\log_2 n\)次划分才能完成全部工作,因此整体性能达到了理想的\(O(\log n)\)级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值