首页 > 其他分享 >O(log(N))是什么意思

O(log(N))是什么意思

时间:2022-12-12 10:22:32浏览次数:33  
标签:麦子 麦粒 log 格子 什么 西塔 意思 搜索

这里借用那个著名故事《国王赏麦》来直观的解释O(log(N))。

传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔。西塔说:“我不要你的重赏,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以 后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。区区小数,几粒麦子,这有何难,“来人”,国王令人如数付给西塔。计数麦粒的工作开始了,第一格内放1粒,第二格内放2粒,第三格内放4粒。还没有到第二十格,一袋麦子已经空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。

从西塔的角度看,每多一个格子他就可以多获得一倍的麦粒,这是个幂运算。而对数计算是幂运算的逆运算,想要直观的理解它,我们可以从西塔对面的视角,也就是国王的角度来看这次赏麦是一个什么样的游戏——我每多提供一倍的麦子,他只多消耗一个格子。而这其实就是O(log(N))的本质:输入规模翻倍,操作次数只增加一。所以这真的是一个非常非常低的时间复杂度。比起O(N)它更接近O(1).

如何达到O(log(N))

如果要设计一个算法,让其具有O(log(N))的时间复杂度,从正面思考是困难的。我们不妨想一想有没有什么操作是每操作一次,需要处理的规模就小一半的对,特别经典的例子就是二分搜索。每次取中位数,在其左或其右继续搜索目标值。其本质就是每搜索一次,就把待搜索的数据量减小了一半。在这之上还有二分搜索树,O(log(N))其实就是二分搜索树的高度。

总结:

  1. 时间复杂度指的是随着输入大小的增长,运行时间会以怎样的速度扩张
  2. O(log(N))指的是 该算法随着输入规模翻倍,操作次数只增加一。
 

 

标签:麦子,麦粒,log,格子,什么,西塔,意思,搜索
From: https://www.cnblogs.com/ghnie/p/16975374.html

相关文章

  • Flink 1.10 SQL、HiveCatalog 与事件时间整合示例
    Flink1.10与1.9相比又是个创新版本,在我们感兴趣的很多方面都有改进,特别是FlinkSQL。本文用根据埋点日志计算PV、UV的简单示例来体验Flink1.10的两个重要新特性:一......
  • 电动滑板车出欧盟需要做什么测试报告呢?
    ​电动滑板车出口欧盟EN17128标准电动滑板车是继传统滑板之后的又一新型滑板运动产品。电动滑板车节约能源,充电快速且续航能力强。整车造型美观、可以折叠,操作方便,驾驶更安......
  • 为什么 A 能 ping 通 B,B 却不能 ping 通 A ?
    有开发小哥咨询了一个问题,记录一下处理过程分享给有需要的朋友。 问题如下: A、B两台开发服务器连接交换机,并且A、B两台服务器的IP地址设置为同一个网段,却发现A......
  • 为什么 Random.Shared 是线程安全的
    在多线程环境中使用Random类来生成伪随机数时,很容易出现线程安全问题。例如,当多个线程同时调用Next方法时,可能会出现种子被意外修改的情况,导致生成的伪随机数不符合预......
  • 中国经济预计2028年超过美国!为什么?看解读!
    文/王不留(微信公众号:王不留) 今天突然看到一则腾讯网介绍全球未来经济趋势的新闻。  CEBR,这个机构怎么突然变成泰国的机构了? 我以为标题是手误,但也不对啊,正文也是将CEB......
  • NLog.com
    <?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc......
  • 为什么ClickHouse这么快?
    通过了解CH的几大特性了解千亿级企业ClickHouse实时处理引擎架构设计、核心技术设计、运行机理全流程。1初始ClickHouse1.1什么是ClickHouse1.2ClickHou......
  • Verilog 设计方法
    设计方法Verilog的设计多采用自上而下的设计方法(top-down)。即先定义顶层模块功能,进而分析要构成顶层模块的必要子模块;然后进一步对各个模块进行分解、设计,直到到达无法进一......
  • java 基础 什么是方法
    什么是方法方法(method)是将具有独立功能的代码块组成为一个整体,使其具有特殊功能的代码集注意:    方法必须先创建才可以使用,该过程称为方法定义    方......
  • 为什么计算机中数字符号位0表示正数,1表示负数
    你好,我是悦创。大学时上计算机组成原理课程的时候,上到计算机如何存储数据的相关知识时,因为计算机世界里面所有的数据归根结底都是由0和1来存储的,那么如何表达数值的正负......