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

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

先从简单直观的 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 的确是有意义的,不是吗?没有其他什么可以表示这种行为。

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

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

时间复杂度 log n相关推荐

  1. python二分查找时间复杂度_时间复杂度 二分查找

    时间复杂度 时间复杂度是用来估计算法运行时间的一个式子(单位). 一般来说,时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度(按效率排序) O(1) < O(log n) < O( ...

  2. 矩阵的乘法和快速幂的一些理解(适用初学者)

    矩阵是线性代数的知识...后悔没好好学了... 第一部分:矩阵的基础知识 1.结合性 (AB)C=A(BC). 2.对加法的分配性 (A+B)C=AC+BC,C(A+B)=CA+CB . 3.对数乘的 ...

  3. mysql索引_mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结)

    原标题:mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结) mysql为什么使用B+ Tree索引,不使用B- Tree索引? 索引顺序如何生效? 什么是覆盖索引? orde ...

  4. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  5. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  6. 《仙剑奇侠传online》游戏后台优化分析:CPU、内存与启动时间

    一.服务器CPU性能优化 1.1寻路算法JPS优化 MMORPG游戏中服务器中需要对NPC寻路,然而A*算法及其各种优化并不让人满意,因此寻路算法也成为瓶颈之一. 因此,本文介绍JPS的效率.多线程. ...

  7. 揭秘重度MMORPG手游后台性能优化方案

    本文节选自<2018腾讯移动游戏技术评审标准与实践案例>手册,由腾讯互娱工程师王杰分享<仙剑奇侠传online>项目中游戏后台的优化经验,深度解析寻路算法.视野管理.内存优化. ...

  8. C#刷遍Leetcode面试题系列连载(4): No.633 - 平方数之和

    点击蓝字"dotNET匠人"关注我哟 加个"星标★",每日 7:15,好文必达! 前文传送门: 上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetC ...

  9. 算法-排序-基数排序(对任意整数排序)

    基数排序 时间复杂度:Θ(d(n+k)) d:元素的位数,k元素中每位数的取值区间大小 非原址排序 1⃣️特点该排序只能每次为基数为1位数进行排序 void radix_sort(int *array ...

最新文章

  1. 关于Vue实例的生命周期created和mounted的区别
  2. SpringBoot和SpringSecurity整合,未登录请求自定义controller访问前端页面,出现 302状态码,一直在登录页面重定向
  3. VS2010中如何更改项目名称【转】
  4. C++用递归方式实现在对不更改随机数组的情况下查找最大值
  5. 宽屏企业网站源码中英php_宽屏版大气企业网站源码dede网站源码中英文网站模板SEO...
  6. 《SAS编程与数据挖掘商业案例》学习笔记之十
  7. PHP 文件上传全攻略
  8. android鸿洋布局,Android基础ConstrainLayout约束布局的介绍和使用
  9. PHP判断msg,小程序 msgSecCheck 检查内容是否违规违法,但所有内容都可通过问题...
  10. Cesium:获取某个entity的位置属性 Cartesian3
  11. 在线班课程-第10周 http基础知识、nginx网站服务
  12. linux伪造ip数据包,伪造ICMP数据包的IP层
  13. 统计学习方法——机器学习和统计学习
  14. HOJ 1276 士兵队列训练问题(stl, 水题)
  15. 大学的终结,终结了什么???
  16. 845透色android10,和平精英TCA845透色
  17. Python+Pycharm的安装
  18. Python的异常及处理
  19. PUCCH(3)matlab验证ZC序列的性质
  20. 动圈耳机振膜_新手小白必读 1分钟看懂动圈式耳机振膜

热门文章

  1. 资料分享:四元数与三维旋转 | 故事:四维虫子
  2. 哈尔滨瑞杰培训的PHP课程视频
  3. 文件下载多级文件生成ZIP压缩包
  4. poi3.13生成多级标题
  5. 【转】简单三极管开关电路
  6. nft交易平台开发流程
  7. 禁止苹果机开机时嘭的发出一声
  8. 【混淆工具】保护Net程序代码安全
  9. 华为海思2022数字芯片笔试题(节选)
  10. NAS信令学习笔记 ——TAU(2)