热门标签 | HotTags
当前位置:  开发笔记 > 大数据 > 正文

为什么O(nlogn)大于O(n)?

我读到O(nlogn)大于O(n),我需要知道为什么会这样?例如取n为1,求解

我读到O(n log n)大于O(n),我需要知道为什么会这样?

例如取n为 1,求解O(n log n)O(1 log 1)= O(0)。在同一手上O(n)会是O(1)

这实际上是矛盾的 O(n log n) > O(n)

回答


让我们首先澄清Big O当前上下文中什么是符号。从(来源)可以阅读:

Big O 表示法是一种数学表示法,它描述了当参数趋向于特定值或无穷大时函数的限制行为。(..)在计算机科学中,大 O 符号用于根据算法的运行时间或空间要求随着输入大小的增长而增长的情况进行分类

以下说法不准确:

例如取 n 为 1,求解 O(n log n) 将是 O(1 log 1) = O(0)。同样,O(n) 将是 O(1)?

不能简单地执行“O(1 log 1)”,因为该Big O符号不代表一个函数,而是一组具有某个渐近上限的函数;正如人们可以从源代码中读取的那样:

Big O 表示法根据函数的增长率来表征函数:具有相同增长率的不同函数可以使用相同的O表示法来表示。

非正式地,在计算机科学的时间复杂度和空间复杂度理论中,人们可以将Big O符号视为算法的分类,分别具有关于时间和空间的某种最坏情况。例如O(n)

如果算法的时间/空间复杂度为 O(n),则称该算法采用线性时间/空间或 O(n) 时间/空间。非正式地,这意味着运行时间/空间最多随输入(source)的大小线性增加。

O(n log n)作为:

对于某个正常数 k,如果 T(n) = O(n log^kn),则称算法在拟线性时间/空间中运行;线性时间/空间是 k = 1 ( source ) 的情况。

从数学上讲这个陈述

我读到 O(n log n) 大于 O(n) (..)

不准确,因为如前所述,Big O符号表示一组函数。因此,更准确的是O(n log n)contains O(n)。尽管如此,通常这种宽松的措辞通常用于量化(对于最坏的情况)一组算法在输入大小增加方面与另一组算法相比的表现。比较两类算法(例如O(n log n)O(n))而不是

例如取 n 为 1,求解 O(n log n) 将是 O(1 log 1) = O(0)。同样,O(n) 将是 O(1)?

这实际上与 O(n log n) > O(n) 矛盾

对于最坏的情况您应该分析两类算法随着其输入大小(n)的增加而表现如何;分析n何时趋于无穷大

正如@cem正确指出的那样,在图像中“big-O表示绘制函数的渐近最小上限之一,而不是指集合O(f(n))

正如您在特定输入后的图像中看到的那样,O(n log n)(绿线)比O(n)(黄线)增长得更快。这就是为什么(在最坏的情况下)O(n)O(n log n)增加输入规模更可取的原因,前者的增长率比后者慢。





回答


我将给你真正的答案,即使它似乎与你目前的想法相差不止一步……

O(n)和O(N日志N)不是数字,甚至是功能,和它不会有道理地说,一个比另一个更大。这是草率的语言,但实际上有两个准确的陈述可能是说“O(n log n)大于O(n)”。

首先,对于 n 的任何函数 f(n),O(f(n))是渐近增长不超过 f(n) 的所有函数的无限。正式的定义是:

当且仅当存在常数 n0 和 C 使得 g(n) <= Cf(n) 对于所有 n > n0 时,函数 g(n) 的复杂度为 O(f(n))。

所以 O(n) 是一组函数,O(n log n) 是一组函数,O(n log n) 是O(n)的超集。作为一个超集有点像“更大”,所以如果有人说“O(n log n)大于O(n)”,他们可能指的是它们之间的超集关系。

其次,O(f(n)) 的定义使 f(n) 成为集合中函数​​渐近增长的上限。并且 O(n log n) 的上限大于 O(n) 的上限。更具体地说,有一个常数 n0 使得 n log n > n,对于所有 n > n0。边界函数本身渐近地更大,这是人们在说“O(n log n) 大于 O(n)”时可能意味着的另一件事。

最后,这两件事在数学上是等价的。如果 g(n) 渐近地大于 f(n),则数学上遵循 O(g(n)) 是 O(f(n)) 的超集,如果 O(g(n)) 是适当的超集的 O(f(n)),它在数学上遵循 g(n) 渐近大于 f(n)。

因此,即使“O(n log n) 大于 O(n)”这句话在严格意义上没有任何意义,但如果您愿意仁慈地阅读它,它具有清晰明确的含义。





回答


在大O表示法只有一个渐近的含义,即它只有时才有意义n趋于无穷大。

例如,时间复杂度O(100000)仅意味着您的代码在恒定时间内运行,这比 渐近地更快(更小)O(log n)






推荐阅读
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了如何在VSCode中查看运行日志的方法,对于新手来说,需要注意日志文件的设置位置。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了在使用TortoiseSVN的Repo-browser浏览SVN时出现的错误,以及解决方法。文章提到了卸载当前版本、安装较低版本、使用更下一层的路径等解决方案。同时指出该问题可能是客户端与SVN服务端不匹配造成的,且服务端无法升级更高的SVN版本。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Elasticsearch1Elasticsearch入门1.1Elasticsearch术语1.1.16.0以前的Elasticsearch术语1.1.26.0以后的Elasti ... [详细]
author-avatar
恨透这一切_249
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有