热门标签 | 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)






推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 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 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
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社区 版权所有