O(logn)

最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么

算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定.你如果采用二分法,那么就会以2为底数,三分法就会以3为底数,其他亦然.不过无论底数是什么,log级别的渐进意义是一样的.也就是说该算法的时间复杂度的增长与处理数据多少的增长的关系是一样的.
### 时间复杂度 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、付费专栏及课程。

余额充值