O(logn)的意思



T=K*log2(N) 注:2是小2
时间T与以2为底的对数成正比。实际上,由于所有的对数都和其他对数成比例(从底数为2转换到底数为10需乘以3.322),我们可以将这个为常数的底数也并入K.由此不必指定底数:
T = K*log(N)
(知道这个公式吗:loga(b)=logc(b)/logc(a),loga(b)表示以a为底,这样logc(a)是常数,用什么为底就无所谓了)
这是《数据结构》第一章里的一段话,底数到底应该是几呢?

======================================================================
既然这里都说了不必指定底数,意思就是说任一指定一个底数的话,效果都是一样的,就不必去计较这个了。
如果看到那个地方说某个算法复杂度是O(logN)的话,那可能直接根据那个算法计算出来的基本操作次数是log2(N),也可能是log3(N)甚至还可能是2*log2(N*3)等等,反正这个时候你知道底数也没有什么用,因为你不知道常数项。只不过,计算机中的很多算法如果是O(logN)的复杂度的话,其基本操作的次数都是C1*log2(C2*N),但是这并不是说见到logN就一定是log2N

转载于:https://www.cnblogs.com/zywscq/p/3938617.html

### 时间复杂度 O(log n) 的计算方法 时间复杂度 \( O(\log n) \) 表示算法的运行时间随输入规模 \( n \) 增大而按对数比例增长。这种类型的算法通常通过每次迭代减少问题规模的一部分来实现效率提升。 #### 对数时间复杂度的核心特征 对于 \( O(\log n) \),其核心在于每一步都将问题规模缩小到原来的某个固定分数,通常是减半或其他常数比率[^3]。例如,在二分查找中,每一次比较都会将待查范围缩减一半,因此经过若干次操作后可以定位目标元素的位置。 #### 计算过程分析 假设初始问题是大小为 \( n \) 的数据集,则执行一次分割之后剩余的数据量变为 \( n/c \)(其中 c>1 );再次重复此动作直到剩下最后一个单元为止。如果总共进行了 k 步这样的划分,则满足如下关系式: \[ n / c^k = 1 \] 由此可得: \[ k = \log_c{n} \] 由于底数c一般不影响最终的大O表示法中的主导项形式(即无论具体是多少都可以抽象成\(\log\)),所以得出结论该类算法属于\( O(\log n)\)[^3]. 以下是基于上述理论的一个简单例子——二分查找的具体代码展示以及对应的时间复杂度推导说明: ```python def binary_search(arr, low, high, x): while low <= high: mid = (low + high) // 2 # 如果找到目标值则返回索引位置 if arr[mid] == x: return mid # 若当前中间值大于目标值,则继续向左子数组寻找 elif arr[mid] > x: high = mid - 1 # 否则转至右子数组搜索 else: low = mid + 1 # 如未发现匹配项,返回-1标志失败 return -1 ``` 在这个函数里,每当进入新的一轮循环时,“high-low”的区间长度就会被削减大约一半。如此这般持续下去直至锁定唯一可能解或者确认不存在符合条件的结果为止。整个流程所需的最大步数值正好吻合之前提到过的公式逻辑结构,故判定整体性能表现为典型的\( O(\log n)\)级别。 ### 总结 综上所述,当一个程序能够在每一阶段都显著降低处理对象的数量级时,就可以认为它的运作模式遵循着对数量级呈指数衰减规律的变化趋势,进而将其归入\( O(\log n)\)类别之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值