双端队列与队列速度

2024-05-12

我正在研究 LeetCode 上的一个问题(Here https://leetcode.com/problems/moving-average-from-data-stream/)。当我完成这个问题后,我想出了:

class MovingAverage {
    std::deque<int> numsToAverage;
    int maxSize;
    int currentTotal;
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        maxSize = size;
        currentTotal = 0;
    }

    double next(int val) 
    {
        currentTotal += val;
        numsToAverage.push_back(val);

        if (numsToAverage.size() > maxSize)
        {
            currentTotal -= numsToAverage[0];
            numsToAverage.pop_front();
        }

        return (double)currentTotal / (double)numsToAverage.size();
    }
};

后来,我看到另一个解决方案与我的非常相似,但使用了队列。出于好奇,我换了只有双端队列到队列我从第 18 个百分点(双端队列)跳到第 56 个百分点(队列)。这是队列代码:

class MovingAverage {
    std::queue<int> numsToAverage;
    int maxSize;
    int currentTotal;
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        maxSize = size;
        currentTotal = 0;
    }

    double next(int val) 
    {
        currentTotal += val;
        numsToAverage.push(val);

        if (numsToAverage.size() > maxSize)
        {
            currentTotal -= numsToAverage.front();
            numsToAverage.pop();
        }

        return (double)currentTotal / (double)numsToAverage.size();
    }
};

我的问题是具体的why?我检查了标准::队列 http://en.cppreference.com/w/cpp/container/queue它默认为双端队列!为什么仅仅因为它是一个队列就会更快?我唯一的猜测是它在某个地方缓存了该值?但同时,队列默认是双端队列!插入/删除时间简直不能再好了!

(旁注,我没有考虑 size == 0 的情况,因为这个问题没有测试它。事实上,如果你把它交给 0,他们的代码就会剧烈崩溃)


这是一个有根据的猜测:

  • 内存控制器具有预取“惯用手性”,它会奖励连续的升序内存访问,但按降序访问的速度会较慢。

  • 因此,用作 FIFO 容器的双端队列具有在一侧推入并在另一侧弹出的首选方向。

  • 您的双端队列代码可能使用最不受欢迎的方向。但队列实现已经经过优化,可以在其最喜欢的方向上使用底层双端队列。

  • 有一种简单的方法可以测试这个假设(假设这些是非保证的实现细节)。在您的双端队列代码中,切换push_back --> push_front and pop_front --> pop_back。如果假设正确,双端队列代码应该加速到与队列实现一样快:-)

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

双端队列与队列速度 的相关文章

随机推荐

  • TypeScript:实现具有调用签名和索引签名的接口

    我想创建一个满足此类型的对象 interface I string x string number 并通过 TypeScript 类型检查 理想情况下 我希望不需要诉诸技巧 例如使用any作为中间步骤 我知道可以将其他字段添加到具有调用签名
  • 如何在MySQL选择查询中编写正则表达式?

    我尝试过这个表达 b word w b i比较一个word对照其他单词列表来查找重复项 我用了preg math all 效果很好 我想做同样的事情 但这次检查从 mysql 数据库检索到的单词 这是我写的 SELECT FROM tabl
  • 如何在 Nuxt 中设置 netlify 表单

    当我通过添加带有 a 的链接来使用 vue router 导航到表单时
  • 进程间并发文件写入

    我需要将不同进程的日志数据写入单个文件 我正在使用 Windows Mutex 它需要公共语言运行时支持 Mutex m gcnew Mutex false MyMutex m gt WaitOne File Open and Write
  • Inno Setup 在 Windows Vista/7 及更高版本上安装到 AppData\Roaming,但在 Windows XP 上安装到应用程序数据

    我为 inDesign 制作了几个脚本 现在我想将它们全部分发到一个安装文件中 由于 inDesign 脚本驻留在 XP 和 Vista 或更高版本 上的不同位置 因此我遇到了一些问题 我编译的设置在 Windows XP 下运行良好 但不
  • 数字解析怪异

    这行代码 Console WriteLine Convert ToInt32 23 23 1 抛出异常 这行代码 Console WriteLine Convert ToDouble 23 23 1 打印 2324 有谁知道为什么会这样 我
  • Web应用程序结构和部署

    我们的产品是一个 ASP Net Web 应用程序 目前 我们在 Visual Studio 中使用网站项目 但研究使用 Web 应用程序项目已经有一段时间了 我目前正在研究它们 以便我们能够改进我们的部署过程 我们有一个在不同客户之间共享
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • 如何将 Devise 的“超时”模块添加到现有的 Devise 安装中? - 轨道 3.1

    这些是将模块添加到现有 Devise 安装的说明 https github com plataformatec devise wiki How To change an already existing table to add devis
  • 如何将 create-react-app 与较旧的 React 版本一起使用?

    使用时创建反应应用程序 https github com facebookincubator create react app with 自定义反应脚本 https github com kitze custom react scripts
  • Javascript 文件到 Blob

    我正在使用 Cordova Media 将音频录制到空文件中 要上传它 我需要文件的内容类型 我正在尝试将文件转换为 Blob 以便我可以设置内容类型 但是我正在努力将文件转换为 Blob state cordova localDirect
  • search_after 在弹性搜索中如何工作?

    我一直在尝试在我们的应用程序中使用 Elasticsearch 但分页限制为 10k 对我们来说实际上是一个问题 并且由于必须超时问题 滚动 API 也不是推荐的选择 我发现 Elasticsearch 有一个叫做 search after
  • Xslt 到 xsl-fo 转换

    我想将 xslt 转换为 xsl fo 但我不太确定我能做到这一点 我尝试将 XML 列表转换为 xsl fo 列表 谁能告诉我在哪里可以找到我在谷歌上搜索了很长时间没有很多这样的例子 我的XML是这样的 p TEXT p ul li It
  • Python-将秒从纪元时间转换为人类可读时间[重复]

    这个问题在这里已经有答案了 最初我编写了这段代码来将日期转换为人类可读的时间 a datetime datetime strptime time Y m d H M S f b datetime datetime now c b a day
  • 如何使用 OnChange() 触发器

    我有一个电子表格以及该电子表格的主副本 每次用户将数据输入单元格时 它都会获取新数据并放入主副本中 然而最近 我注意到一个用户创建了一个新列 该列未被 OnEdit 捕获 于是我查了一下 看到了去年实现的OnChange 但是 我不知道如何
  • Apache Nifi/Cassandra - 如何将 CSV 加载到 Cassandra 表中

    我每天都会收到多次传入的各种 CSV 文件 存储来自传感器的时间序列数据 这些传感器是传感器站的一部分 每个 CSV 均以其来源的传感器站和传感器 ID 命名 例如 station1 sensor2 csv 目前 数据存储如下 gt cat
  • 为什么使用自动布局时视图的框架宽度始终为 600 x 600

    我正在制作一个基本的扫雷应用程序 用于快速练习 娱乐 我想让板的尺寸 10 个图块宽 适应任何 iOS 屏幕 为此 我通过获取tileContainer view frame width和 10来设置每个图块的大小 我的问题是 tileCo
  • NuxtJS & SASS Loader - 在生产环境中使用 sass-loader (SCSS) 进行构建

    我添加了此行以在开发 本地 服务器上使用 sass loader 进行构建 nuxt config js module exports mode spa build analyze analyzerMode static generateS
  • TensorFlow:有没有办法将冻结图转换为检查点模型?

    可以将检查点模型转换为冻结图 ckpt 文件转换为 pb 文件 但是 是否有反向方法将 pb 文件再次转换为检查点文件 我想它需要将常量转换回变量 有没有办法将正确的常量识别为变量并将它们恢复回检查点模型 目前支持将变量转换为常量 http
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag