next_permutation() 的并行代码

2023-12-09

我想知道是否可以使用 OpenMP 并行化此代码。 OpenMP 会让代码运行得更快吗?有更好的方法来实现这一目标吗?

vector<int> t; // already initialized
do{
    // Something with current permutation

} while(next_permutation(t.begin(), t.end()));

我知道我可以轻松并行化for指令,但这里我有一个while (condition = true).


  1. next_permutation按字典顺序生成排列,这意味着生成的排列的前缀也按字典顺序排列。换句话说,您可以通过单独处理每个可能的初始元素来进行非常粗略的并行化:

    // Assume that v is sorted (or sort it)
    // This `for` loop should be parallelized
    for (auto n = v.size(), i = 0; i < n; ++i) {
      // Make a copy of v with the element at 'it' rotated to the beginning
      auto vprime = v;
      std::rotate(vprime.begin(), vprime.begin() + i, vprime.begin() + i + 1);
      // The above guarantees that vprime[1:] is still sorted.
      // Since vprime[0] is constant, we only need to permute vprime[1:]
      while (std::next_permutation(vprime.begin() + 1, vprime.end()) {
        // do something with vprime
      }
    }
    

    上面假设每个排列的处理时间大致相同。如果某些初始元素的排列的处理时间与其他某些初始元素的排列的平均时间不同,则某些线程将先于其他线程终止,从而降低并行化的有效性。您可以通过使用大于一个元素的前缀来缩小并行化块。

  2. 看来你真正想要的是产生集合的所有排列k从向量中提取的元素n元素。有n!/(nk)!这样的排列,很快就会变成一个非常大的数字。例如,如果n是 15 并且k是10,有10,897,286,400种排列。即使处理速度相当快,处理所有这些也需要一段时间。所以你寻求并行工作的方法是正确的。

  3. 要找到 k 组合的所有排列,执行next_permutation如果您有一个可以生成所有组合的库函数,则对每种可能的组合进行分析是一种合理的方法。但请注意,许多实现next_combination是为了易用性而不是性能而优化的。高效执行next_combination在循环中需要持久状态,这将可以从根本上减少搜索下一个组合的成本。

    另一种方法是使用next_partial_permutation,它直接生成 n 个元素中 k 个的下一个排列。一个简单的解决方案基于next_permutation,但这也是次优的,因为需要额外调用std::reverse。 (值得思考为什么这个算法有效。一个提示:如果你反转序列的字典顺序第一个排列,你就会得到字典顺序最后一个排列。)(代码改编自 N2639)

    template<typename BidiIt>
    bool next_partial_permutation(BidiIt first, BidiIt middle, BidiIt last) {
      std::reverse(middle, last);
      return std::next_permutation(first, last);
    }
    

    无论如何计算部分排列,您都可以使用与上述相同的方法并行化算法:按前缀(或初始元素,如果处理时间不变)对排列进行分块,并并行执行分块。

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

next_permutation() 的并行代码 的相关文章

  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐