我可以想到C中的三个操作,可以在某种意义上被描述为具有“不变”的复杂性.我已经看到了这个意思的一些辩论(*),在我看来,我们可以说“所有这些操作是不变的,但有些比其他人更为常态”:-)

(编辑2:如果你已经认为你知道答案,请阅读这个问题的一些辩论,然后才赶上:What data structure,exactly,are deques in C++?很多人,相当高分,都在争论“不变”的意思,我的问题是,你可能会觉得很明显!)

(编辑:我不需要一个“复杂性”的引言,我想要一个明确的答案,也许是从C标准的引用,告诉我们应该是什么是不变的.处理器刻度,现实世界的时间,或者其他的东西?在其他线程上,有些人认为时间与C标准所要求的完全无关.)

标准中的这些复杂性保证是否适用于操作的运行时?或者他们只是指定可能发生的包含的对象的(最大)份数/移动数量? “摊销”是什么意思?

给定(非空)向量< int> v,以下在运行时显然是常数:

swap(v.front(),v.back());

(尽管可能会指出,这取决于数据是在缓存还是交换出来,或者是什么!).

给定一个列表< int> l,做一个push_back很简单.正确分配一个新项目,并且链接列表中的几个指针被混洗.每个push_front涉及一个分配,总是具有相同的内存量,所以这显然是相当“恒定的”.但是,当然,分配时间可能相当可观.内存管理可能需要花费大量的时间才能找到合适的可用内存.

3.但是在向量< int>上执行push_back更不可预测大多数情况下,它将非常快速,但是现在每个数据都必须重新分配所有数据的空间,并将每个元素复制到一个新的位置.因此,在运行时方面比单个列表:: push_front不太可预测,但它仍被称为常量(摊销).平均来说,向向量中添加大量数据将需要独立于添加量的复杂性,这就是为什么称为“摊销常数”时间. (我对吗?)

最后,我问了int来避免另一种类型的复杂性.例如,矢量<诠释> >由于向量(向量)的每个元素可能具有不同的大小,并且例如交换两个元素并不完全如上述情况1.一样,因此可能会更复杂一点.但理想情况下,我们可以回答所有向量T,而不是T = int. (*)有关辩论的例子,请参阅这些答案的意见:What data structure,are deques in C++?

解决方法

复杂性总是相对于特定变量或变量组而言.所以当标准谈论定时插入时,它谈论的是与列表中项目数量相关的恒定时间.也就是说,O(1)插入意味着列表中当前的项目数量不会影响插入的整体复杂度.该列表可能有500或50000000个项目,并且插入操作的复杂性将是相同的.

例如,std :: list具有O(1)插入和删除;插入的复杂性不受列表中元素数量的影响.然而,内存分配器的复杂度可能取决于已经分配的事情的数量.但是,由于O(1)正在谈论清单中的项目数量,所以并不涵盖.因此,我们将会测量内存分配器的复杂性,而不是数据结构.

简而言之:这是一个不同的测量.

It implies that we are free to implement our algorithm as badly as we like,including one where the time isn’t really constant in any pragmatic sense,but where we have respected the number of ‘operations’ on the contained objects.

没有相对于实现来指定复杂性.它是相对于算法指定的.上下文可以切换并不重要,因为运行时间不是复杂性.

如上所述,您可以使用相对于删除(其中n是分配数)的O(log(n))的内存分配器实现std :: list.但是,删除列表中的元素仍然是O(1)相对于列表中的项目数.

不要将复杂性与整体性能混淆.复杂性的目的是为不同变量的算法提供一般的度量.希望代码快速运行的程序员的目的是找到符合实现该性能所需的复杂性的算法的合理实现.

复杂性是评估算法效率的工具.复杂性并不意味着你会停止思考.

And what exactly does ‘amortized’ mean?

Amortized表示:

如果某些东西是“摊销X时间”,那么当您在相同的数据结构上重复无限次的操作时,X处的复杂性限制

所以,std :: vector在后面有“摊余时间”插入.因此,如果我们采取对象并在其上执行无限多的插入,则渐近的复杂性限制将与“常时”插入无异.

在外行方面,这意味着这个操作有时可能是不恒定的,但是它将不常数的次数将总是在减少.在长期的插入中,它是不变的时间.

c – “不变”的复杂性是什么意思?时间?份数/动作数的更多相关文章

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. js中‘!.’是什么意思

  3. InnoDB 和 MyISAM 引擎恢复数据库,使用 .frm、.ibd文件恢复数据库

  4. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  5. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  6. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  7. 宝塔Linux的FTP连接不上的解决方法

    宝塔Linux的FTP连接不上的解决方法常见的几个可能,建议先排查。1.注意内网IP和外网IP2.检查ftp服务是否启动 (面板首页即可看到)3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 (如是腾讯云/阿里云等还需检查安全组)4.是否主动/被动模式都不能连接5.新建一个用户看是否能连接6.修改ftp配置文件 将ForcePassiveIP前面的#去掉 将19

  8. 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

  9. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  10. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部