使用 C++ 的 STL 进行 i 阶统计

2024-02-03

给定一个空数组,我需要进行两种类型的查询

  1. 向数组中插入一个元素

  2. 查找某个元素的索引k(显然数组必须保持排序)

这可以通过使用来完成set容器

set<int> st;
set.insert(t);

这会将我的元素插入O(log(n)).

对于第二个查询

set<int>::iterator it;
it = st.find(k);
idx = distance(st.begin(), it);

这需要O(n) time. (O(n) [for distance()[ + O(log(n) [for set::find()] ).

有什么办法可以同时进行这两个查询O(log(n))使用 C++ 的预定义容器?

http://www.cplusplus.com/reference/stl/ http://www.cplusplus.com/reference/stl/


不。这是不可能的(使用预定义的容器)。 C++ 标准库的序列容器具有:

  • O(1) 随机访问和 O(N) 插入/删除 或者
  • O(N) 随机访问和 O(1) 插入/删除

注意deque是一个例外,但仅当插入/删除发生在数组末尾时才有效。一般情况仍然是 O(N)。

此外,迭代器的分类不包括这种情况的类别。你有双向迭代器(那些list, set, multiset, map and multimap),需要 O(N) 时间跳转到随机位置,下一个类别是随机访问迭代器(那些vector, deque and string)。没有中间类别。

添加一个新类别绝非易事。该库还实现了很多算法(例如for_each)与容器一起使用。每个迭代器类别都有一个实现。

阶次统计树已被提出于Boost http://boost.org几次。据我所知:

  1. 2004: 第一个建议 http://lists.boost.org/Archives/boost/2004/03/62823.php(不知道有没有实现)
  2. 2006: 《分层数据结构》 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2101.html#tr.hierarchy.augment
  3. 2006: AVL阵列 http://sourceforge.net/projects/avl-array(在Boost中更名为“排行榜”)
  4. 2012: 计数器树 http://dl.dropbox.com/u/8437476/works/countertree/doc/index.html

它们被接受的主要困难是普遍认为它们不是好处,而是危险。今天的程序员习惯于使用典型的容器来解决他们所知道的所有问题。有经验的程序员担心新手可能会盲目地使用建议的容器来完成所有事情,而不是仔细选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++ 的 STL 进行 i 阶统计 的相关文章

  • Roslyn SyntaxNode 是否被重用?

    我一直在看罗斯林CTP http msdn microsoft com en us roslyn并且 虽然它解决了类似的问题表达式树API http msdn microsoft com en us library bb397951 asp
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code
  • 如何正确初始化“min”变量?

    我的代码中有一个小问题 用于从一系列数字中查找最小值 当我初始化时min 0 最小值结果为0 但是当我不初始化时min 答案是正确的 为什么会出现这种情况 Xcode 告诉我应该初始化min多变的 int a 20 0 int max 0
  • 如何使转发引用参数仅绑定到右值引用?

    我正在编写一个网络库 并大量使用移动语义来处理文件描述符的所有权 我的一个类希望接收其他类型的文件描述符包装器并取得所有权 所以它就像 struct OwnershipReceiver template
  • 如何将 C# 8 与 Visual Studio 2017 结合使用?

    我想在 Visual Studio 2017 中使用 C 8 0 尤其是范围和不可空引用类型 这可能吗 展望未来 微软希望将 C 语言版本与框架版本比过去更紧密地联系起来 他们实际上只希望您将 C 8 与 NET Core 3 x 和 NE
  • 条件运算符 + 向上转换 + const 引用

    灵感来自这个问题 https stackoverflow com questions 23049166 我尝试了以下代码 struct A virtual void doit const 0 struct B public A virtua
  • 使用 libavcodec 提取音频样本

    我对如何从 AVFrame 中的数据提取双值感到困惑 我正在尝试提取帧 我尝试检查用 CPython 编写的 av 模块背后的源代码 尤其是 AudioFrame 来尝试了解它从何处解码样本 https github com PyAV Or
  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的

随机推荐

  • 使用 Python 在 CATIA 中创建新产品

    我正在使用 Python 脚本自动创建新产品 但遇到了交互式事件卡在 零件编号 对话框中的问题 当创建新零件而只是创建新产品时 不会发生这种情况 以下是脚本的适用部分 CATIA 已打开 import win32com client dyn
  • NuGet:如何使用 Install.ps1 文件更改文件的属性?

    我正在创建 NuGet 包 并为此创建了 Nuspec 清单文件 在content文件夹我有两个文件 test exe and test config 现在 当任何用户安装此软件包时 我想将这些文件的属性 复制到输出目录 更改为项目中的 始
  • 如何通过 htaccess 将目录中的所有文件重定向到根目录中的另一个目录

    我想重定向所有文件 无论是否存在 user我网站上的目录到一个名为temp php通过 htaccess 在根目录中 例如 如果用户输入用户 send php or user or 用户 发送 可能根本不存在 全部重定向到temp php
  • 在 Visual Studio Code 中禁用基于单词的建议

    我想要禁用基于单词的建议 在我看来这很烦人而且没用 例如 括号将提供变量 方法和语言的建议 不会污染建议列表将所有类似的单词写入文件中 我只是想要代码建议 我试过 editor wordBasedSuggestions false 但没有运
  • CUDA racecheck、共享内存数组和 cudaDeviceSynchronize()

    我最近发现了比赛检查的工具cuda内存检查 在 CUDA 5 0 中可用 cuda memcheck tool racecheck 参见英伟达文档 http docs nvidia com cuda cuda memcheck index
  • jQuery UI:将项目从一个列表移动到另一个列表

    虽然这should相对简单 我不知道如何移动 而不是复制 LI之间的元素ULs 我想要的只是从列表中拖动任何项目foo列出bar 或反之亦然 而不重复元素 While connectToSortable几乎完全符合我想要的 尽管我宁愿避免s
  • 命名空间不能直接包含成员? [复制]

    这个问题在这里已经有答案了 我有个问题 我一直在关注教程 以便我可以学习使用 Xamarin 进行编程 现在我有这个错误行 我已经在标题中写下了 这是给大家的代码 using System Collections ObjectModel u
  • 以编程方式访问函数位置

    是否可以通过代码访问 FunctionLocation 使用控制台登录功能时谷歌浏览器开发人员工具显示的属性 目前的答案是no The FunctionLocation 您在 Inspector 中看到的属性已添加到V8Debugger i
  • 无法绑定到“ngModel”,因为它不是“ion-select”的已知属性

    大家好 当我在产品版本中编译我的应用程序时 出现错误 无法绑定到 ngModel 因为它不是 ion select 的已知属性 My code
  • 对 SharePoint 列表的 CAML 查询返回整个集合

    我遇到了一个问题 如果我在 C 中执行 CAML 查询 我的 ListItemCollection 将包含整个列表 这是一个片段 我擦洗过的代码也许你可以看到我做错了什么 在调试时 我发现生成的 XML 正是我所期望的从文件读取的值 似乎有
  • 在函数中包含库调用?

    将执行该函数所需的每个库包含在该函数中是一个好习惯吗 例如我的文件global r包含我需要一个闪亮的应用程序的几个功能 目前我在文件顶部有所有需要的包 当我切换项目 复制这些函数时 我必须加载包 将它们包含在新代码中 否则 所有需要的包都
  • extjs 5网格的滚动条在边框布局面板中不起作用

    在边框布局面板中 即使网格存储足够长 导致网格溢出 网格的滚动条也无法正常工作 如果我的网格位于无边框布局面板中 则滚动条是可以的 但是当我将网格放入边框布局面板中时 要么没有滚动条 要么有无效的滚动条 what i want is to
  • 在 VS 中发布网站时@import“theme.css”不起作用

    我有一个网站 它依赖于 jquery ui theme css 的一些 css 样式 当我在本地运行我的项目时 这工作正常 但是当我发布和部署时 这些特定的样式不会被选择 例如 当我在本地检查对话框关闭按钮时 它会显示标准的十字图像 但在发
  • sql server:必要时在外键上创建索引

    我有很多带有外键的表 有些有索引 而另一些则没有 所有外键均已命名FK
  • th:复选框中字段属性的值

    我有一个包含数据库数据的表 动态插入 在一列中我插入复选框 现在我想选择其中一个并发送到下一个表单 我选择一个产品并将属性发送到另一个表单 在此表单中应仅显示所选产品的属性 但我不知道 th field 中插入什么样的值 我尝试了很多解决方
  • 安排连续气流 DAG 运行

    有没有办法循环运行气流 DAG 当尝试创建一个循环 将最后一个组件连接到最后一个组件的上游 时 我收到 在 DAG 中检测到循环 错误任务 一般来说 我有一个简短的 3 个 BashOperator 组件流程 我想连续运行它们 从最后一个组
  • 类型错误:jQuery.browser 未定义

    我正在使用 jquery mobile 1 4 2 和脚本 1 11 0 我已经阅读过之前提出的有关此问题的问题 但我不知道如何在我的代码中使用 这是我的代码 script jQuery input name cat bind jQuery
  • ActionBar Compat 的自定义(渐变)背景

    我正在使用 Action Bar Compat 以便我的带有导航抽屉的操作栏向后兼容至 API 级别 9 并且我想更改操作栏的背景 我复制了代码安卓开发者 https developer android com training basic
  • 如何在 ruby​​ on Rails 中通过 websocket 发送保活数据包

    我想发送一个 与客户保持联系 我的 websocket 连接每 30 秒发送一条消息 我的 websocket 初始化程序中的代码如下所示 ws WebSocket Client Simple connect wss bitcoin tos
  • 使用 C++ 的 STL 进行 i 阶统计

    给定一个空数组 我需要进行两种类型的查询 向数组中插入一个元素 查找某个元素的索引k 显然数组必须保持排序 这可以通过使用来完成set容器 set