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

本文讲的是时间复杂度 O(log n) 意味着什么?,


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

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

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

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

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

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

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

十六个元素的有序数组

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

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

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

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

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

简化后的公式

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

归纳一下

分子和分母代入指数

等式两边同时乘以 2^k

最终结果

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

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

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

对数形式

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

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






原文发布时间为:2017年6月14日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-09-25 13:01:38

时间复杂度 O(log n) 意味着什么?的相关文章

【算法数据结构Java实现】递归的简单剖析及时间复杂度计算

1.理解             对于递归函数的理解,我觉得是比较重要的,因为很多大神能把递归函数用的惟妙惟肖,不光是他们的编程功力高深,更主要是能理解这个算法.比较直白的理解是,如果一个事件的逻辑可以表示成,f(x)=nf(x-1)+o(x)形式,那么就可以用递归的思路来实现. 编写递归逻辑的时候要知道如下法则: 1.要有基准   比如说,f(x)=f(x-1)+1,如果不加入基准,f(0)的值是多少,那么函数会无限执行下去,没有意义 2.不断推进   也就是f(x)=f(x-1)或是f(x)

redo log buffer小结

整理自<OCA/OCP认证考试指南> 001     日志重做缓冲区是小型的.用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域."变更向量"是应用于某些对象的修改,执行DML语句会生成应用于数据的变更向量.有了重做日志,数据库就可以确保数据永不丢失:每当数据块发生更改时,都会将应用于块的变更向量写到重做日志,如果需要还原数据文件,则通过重做日志,可以将变更向量提取并应用于数据文件备份. 002     会话服务器进程不将重做记录直接写入重做日志文件,否则,每当执行D

算法的时间复杂度示例

本文是学习数据结构的笔记. [效果图] [代码] # example.py # 算法时间复杂度示例 def func_01(n): ''' 时间复杂度O(Log(Log(N))) ''' import math i = n count = 0 while i > 1: i = round(math.sqrt(i)) # 注意:sqrt(i)! count += 1 return count print('时间复杂度O(Log(Log(N))),N=2000000000000000000,循环{}

Java集合学习(十二) TreeMap详细介绍(源码解析)和使用示例

这一章,我们对TreeMap进行学习. 第1部分 TreeMap介绍 TreeMap 简介 TreeMap 是一个有序的key-value集合,它是通过红黑树实现的. TreeMap继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法.比如返回有序的key集合. TreeMap 实现了Cloneable接口,意味着它能被克隆. TreeMap 实现了java.io.Serializabl

Java笔记:集合框架实现原理

这篇文章是对http://www.cnblogs.com/skywang12345/category/455711.html中java集合框架相关文章的一个总结,在此对原作者的辛勤整理表示感谢. Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collec

MySql 优化

    首先我们需要明确我们什么时候需要用到数据库:     1. 当缓存并不能解决你的问题,比如写操作,事务操作     2. 缓存的创建或过期需要通过数据库.     其次,我们可能需要一个专业的工具来指导我们优化:     mysqlreport     这是作为一个Mysql第三方的状态报告工具,其实就是将一下两行命令所获得的数据以一种更加人性化的方法呈现到我们眼前:     mysql> show status;     mysql> show engine innodb statu

[jjzhu学java]之JDK集合框架源码分析

Java Collection Collection接口 AbstractCollection类 AbstractList类 Vector类 Stack栈 ArrayList AbstractSequentialList LinkedList线性链表 Map接口 AbstractMap HashMap LinkedHashMap treeMap HashTable 总结 Java Collection 图中实线边框表示的是实现类(ArrayList, Hashtable等),虚线边框的是抽象类(

深入理解Arrays.sort() (转)

Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序.官方Java文档只是简要描述此方法的作用,并未进行详细的介绍,本文将深入解析此方法.1. 简单示例sort方法的使用非常的简单明了,下面的例子中,先定义一个比较Dog大小的Comparator,然后将其实例对象作为参数传给sort方法,通过此示例,你应该能够快速掌握Arrays.sort()的使用方法. [java] view plaincopy     import

Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMap数据结构第3部分 TreeMap源码解析(基于JDK1.6.0_45)第4部分 TreeMap遍历方式第5部分 TreeMap示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928   第