栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Roson的Qt之旅#75 Qt容器的算法复杂度

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Roson的Qt之旅#75 Qt容器的算法复杂度

算法复杂度关注的是每个函数随着容器中条目数量的增长有多快(或多慢)。例如,在QlinkedList的中间插入一个项是一种非常快的操作,不管QlinkedList中存储了多少项。另一方面,如果QVector包含许多项,则在QVector中间插入项可能非常昂贵,因为必须将一半的项移动到内存中的一个位置。

为了描述算法复杂度,我们使用以下术语,基于“big Oh”符号:

  • Constant time: O(1). 如果不管容器中有多少项,函数都需要相同的时间,则函数被称为在常数时间内运行。 一个例子是QlinkedList::insert()。  
  • Logarithmic time: O(log n). 以对数时间运行的函数是其运行时间与容器中项目数的对数成正比的函数。 一个例子是qBinaryFind()。  
  • Linear time: O(n). 以线性时间运行的函数执行的时间与容器中存储的项数成正比。 一个例子是QVector::insert()。  
  • Linear-logarithmic time: O(n log n). 以线性-对数时间运行的函数比线性时间函数渐进地慢,但比二次时间函数快。  
  • Quadratic time: O(n²). 二次时间函数的执行时间与容器中存储的项数的平方成正比。  

下表总结了Qt顺序容器类的算法复杂度:

Index lookup(索引查找)Insertion(插入)Prepending(从前面添加)Appending(从后面追加)
QlinkedListO(n)O(1)O(1)O(1)
QListO(1)O(n)Amort. O(1)Amort. O(1)
QVectorO(1)O(n)O(n)Amort. O(1)

表中"Amort "代表"平摊行为" 例如,“Amort. O(1)”意味着如果你只调用一次函数,你可能会得到O(n)的行为,但如果你调用它多次(例如,n次),平均行为将是O(1)。  

下表总结了Qt关联容器和集合的算法复杂度:  

Key lookup(key查找)Insertion(插入)
Average(平均)Worst case(最坏情况)Average(平均)Worst case(最坏情况)
QMapO(log n)O(log n)O(log n)O(log n)
QMultiMapO(log n)O(log n)O(log n)O(log n)
QHashAmort. O(1)O(n)Amort. O(1)O(n)
QSetAmort. O(1)O(n)Amort. O(1)O(n)

使用QVector、QHash和QSet,附加项的性能被平摊到O(log n)。在插入项之前,通过调用QVector::reserve()、QHash::reserve()或QSet::reserve()可以将附加项的期望数量降至O(1)。 下一节将更深入地讨论这个主题。  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号