C++ 中许多 for 循环的紧凑形式

2024-03-09

我有一段代码如下,以及数量for循环由下式确定n这是在编译时已知的。每个for循环迭代值 0 和 1。目前,我的代码如下所示

for(int in=0;in<2;in++){
    for(int in_1=0;in_1<2;in_1++){
        for(int in_2=0;in_2<2;in_2++){
          // ... n times
            for(int i2=0;i2<2;i2++){
               for(int i1=0;i1<2;i1++){
                   d[in][in_1][in_2]...[i2][i1] =updown(in)+updown(in_1)+...+updown(i1);
               }
            }
          // ...
        }
    }
}

现在我的问题是是否可以写成一种更紧凑的形式。


The n bits in_k可以解释为小于一个整数的表示2^n.

这允许轻松使用一维数组(向量)d[.].

实际上,一个整数j对应于

j = in[0] + 2*in[1] + ... + 2^n-1*in[n-1]

而且,直接实现是O(NlogN)。 (N = 2^n)

递归解决方案是可能的,例如使用

f(val, n) = updown(val%2) + f(val/2, n-1) and f(val, 0) = 0.

在引入记忆化的情况下,这对应于 O(N) 复杂度,此处未实现。

Result:

0 : 0
1 : 1
2 : 1
3 : 2
4 : 1
5 : 2
6 : 2
7 : 3
8 : 1
9 : 2
10 : 2
11 : 3
12 : 2
13 : 3
14 : 3
15 : 4

#include <iostream>
#include <vector>

int up_down (int b) {
    if (b) return 1;
    return 0;
}

int f(int val, int n) {
    if (n < 0) return 0;
    return up_down (val%2) + f(val/2, n-1);
}

int main() {
    const int n = 4;
    int size = 1;
    for (int i = 0; i < n; ++i) size *= 2;
    std::vector<int> d(size, 0);
    
    for (int i = 0; i  < size; ++i) {
        d[i] = f(i, n);
    }
    for (int i = 0; i < size; ++i) {
        std::cout << i << " : " << d[i] << '\n';
    }
    return 0;
}

如上所述,在实现记忆化的条件下,递归方法允许 O(N) 复杂度。

另一种可能性是使用简单的迭代方法,以获得 O(N) 复杂度。
(这里N代表数据总数)

#include <iostream>
#include <vector>

int up_down (int b) {
    if (b) return 1;
    return 0;
}
int main() {
    const int n = 4;
    int size = 1;
    for (int i = 0; i < n; ++i) size *= 2;
    std::vector<int> d(size, 0);
    
    int size_block = 1;
    for (int i = 0; i  < n; ++i) {
        for (int j = size_block-1; j >= 0; --j) {
            d[2*j+1] = d[j] + up_down(1);
            d[2*j] = d[j] + up_down(0);
        }
        size_block *= 2;
    }
    for (int i = 0; i < size; ++i) {
        std::cout << i << " : " << d[i] << '\n';
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中许多 for 循环的紧凑形式 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 在 C 中将匿名结构作为参数传递

    我有以下 c 行 为了可读性而添加回车符 它们不在代码中 define i2c write slave addr reg addr len data ptr twi master write MPU TWI addr reg addr ad
  • 如何移动文件?

    我正在针对 SourceForge SVN 存储库使用 TortoiseSVN 我想将文件从一个文件夹移动到另一个文件夹以维护其修订历史记录 这可能吗 如果是这样 你会怎么做 我当前的策略是将文件复制到新文件夹中并将其签入 然后从当前文件夹
  • 优化 S3 下载大量小文件

    我目前使用转账管理器 https docs aws amazon com AWSJavaSDK latest javadoc com amazonaws services s3 transfer TransferManager html从
  • AJAX 将不带表单的 ValidateAntiForgeryToken 发布到 MVC 操作方法

    我一直在寻找如何在 SO 上执行此操作的示例 据我所知 我已经尝试了所有我能找到的示例 但到目前为止没有成功 我尝试根据我的场景更改一些实现 但到目前为止也失败了 我的页面上有这个 layout cshtml 所以我总是有一个可用的令牌
  • Android 设计支持库可扩展浮动操作按钮 (FAB) 菜单

    现在Android设计支持库已经出来了 有谁知道如何用它实现扩展的Fab菜单 就像Inbox App上的fab一样 应该看起来像这样 获得了一种更好的方法来实现动画 FAB 菜单 而无需使用任何库或为动画编写大量 xml 代码 希望这对将来
  • insertUI 中的 R 闪亮动态 UI

    我有一个闪亮的应用程序 我想使用操作按钮添加 UI 元素 然后让插入的 ui 成为动态的 这是我当前的 ui 文件 library shiny shinyUI fluidPage div id placeholder actionButto
  • MySQL 与 JSON - 为什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 vbscript 从本地驱动器获取文件夹列表

    我想从计算机中删除所有文档 doc 文件 因为我知道如何从文件夹中获取子文件夹列表 但不知道如何从根目录中获取文件夹列表 Ex C subfoldersInFolder folder subFolder 给出文件夹的所有子文件夹 但据说我想
  • 熊猫显示所有行的组总和[重复]

    这个问题在这里已经有答案了 给定以下数据框 col a col b tosum b 5 b 5 b 1 c 6 c 3 a 2 a 2 我想显示所有行上每个 col 组的总和 如下所示 col a col b tosum group sum
  • 图像(Blob)在浏览器中仅显示一次

    我正在使用 Symfony2 和 Twig 在实体类中 ORM Column name photo type blob nullable true private photo public function displayPhoto ret
  • 绑定元函数:接受类型和模板模板参数(接受任何内容)

    我正在尝试写一个Bind将模板参数绑定到某些内容的元编程模板帮助器元函数 我有一个简单模板元函数的工作实现 template
  • 如何让 SSL 在 pip3 中工作?

    Python 3 6 5 从源代码构建并与 Python 2 7 5 一起安装 python3但是打开 python 终端pip3无法安装任何带有 SSL 错误的软件包 root servername openssl OpenSSL 1 1
  • 如何在 Python 中向旧的 CSV 文件追加新行?

    我正在尝试向旧的 CSV 文件添加新行 基本上 每次运行 Python 脚本时它都会更新 现在 我将旧的 CSV 行值存储在列表中 然后删除 CSV 文件并使用新的列表值再次创建它 我想知道是否有更好的方法可以做到这一点 with open
  • 如何列出 FTP 连接的目录内容

    我找不到这方面的教程 在 VB NET 中我想要执行如下命令 Dim array1 as string ListFilesInFolder www example com images 我知道这可能不会那么简单 但是有人可以给我指点教程或其
  • MongoDB C# 驱动程序覆盖字符串的默认值从 null 到 string.empty

    使用 10gen mondgo db c 驱动程序 我有以下课程 BsonId public ObjectId Id get set public int AttemptId get set public int UserId get se
  • Json 下拉列表

    当我点击部门安装主题时 当我点击主题时要安装的服务 但当我点击服务时却没有看到问题 我认为对json的描述不准确 你能帮我解决这个问题吗 谢谢 我的 Jquery 代码
  • ASP.NET MVC 在哪里放置自定义验证属性

    我一直在摆弄一些 ASP NET MVC3 解决方案结构 并且已经确定了由以下项目组成的设计 MyApp Web MVC3 Web Layer MyApp Data Repositories and infrastructure for m
  • 使用php将XML数据插入mysql

    代表问题的 xml 文件部分 该 xml 文件有数百条客户记录
  • 如何将事件流式传输到 BigQuery?

    我想将事件添加到 BigQuery 中 以便使用以下服务通过图表查看它们模式分析 https modeanalytics com 我不确定是否掌握了 BigQuery 的完整概念 也许我对它做出了错误的假设 但我想使用它的目的是拥有一个 某
  • C++ 中许多 for 循环的紧凑形式

    我有一段代码如下 以及数量for循环由下式确定n这是在编译时已知的 每个for循环迭代值 0 和 1 目前 我的代码如下所示 for int in 0 in lt 2 in for int in 1 0 in 1 lt 2 in 1 for