如何创建矢量矢量的笛卡尔积?
我有一个向量的矢量说
vector<vector<int> > items
不同大小,如下所示
1,2,3
4,5
6,7,8
我想根据这些向量的笛卡尔积来创建组合
1,4,6
1,4,7
1,4,8
and so on till
3,5,8
我怎样才能做到这一点 ?我查了几个链接,我也在这篇文章的末尾列出了它们,但我无法解释它,因为我不熟悉这种语言。有些人可以帮助我。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
vector<vector<int> > items;
int k = 0;
for ( int i = 0; i < 5; i++ ) {
items.push_back ( vector<int>() );
for ( int j = 0; j < 5; j++ )
items[i].push_back ( k++ );
}
cartesian ( items ); // I want some function here to do this.
}
这个程序有相同的长度向量,我把它放在这里,以便更容易理解我的数据结构。即使有人使用其他链接中的其他答案并与此集成以获得结果,这将非常有用。非常感谢你
我看了几个链接
一
二
计划来自:计划
没有找到相关结果
已邀请:
9 个回复
摊揉售
现在,我将向您展示我从@John无耻地偷走的递归迭代版本: 程序的其余部分几乎相同,仅显示
功能。
膝垫富顷
因此主循环具有
作为迭代变量,从
到
。原则上,
的每个值都编码足够的信息来提取该迭代的每个
的索引。这是使用重复的模运算在子循环中完成的:
输出:
师埠女
肉簧咸缮
我从我写的haskell版本中得到了一些痛苦:
柑恫祟
的迭代器迭代你的个人
s。 在开始时启动所有迭代器。通过迭代器拉出每个向量的元素来构造您的第一个产品向量。 增加最右边的一个,然后重复。 当你到达最后,将那个重置为开头并递增倒数第二个。您可以通过将它从迭代器向量中的相邻元素中拉出来获得“倒数第二个”迭代器。 继续循环,直到最后和倒数第二个迭代器都结束。然后,重置它们,增加倒数第三个迭代器。一般来说,这可以级联。 它就像一个里程表,但每个不同的数字都在不同的基础上。
吠强祷豪硅
文件cartesian.hpp看起来像这样。
如果有人发表评论如何让它变得更快或更好,我会非常感激他们。
绵扇寸访
苦诫
这背后的想法如下。 让
。 让
,对于
中的所有
。 让
。 我们首先解决迭代
的简单问题。这是由
lambda完成的。该算法只是“携带”常规等级学习者用于添加1,尽管具有混合基数系统。 我们使用它来解决更普遍的问题,通过公式
将
中的元组
转换为所需的元组之一,用于
中的所有
。我们在
lambda中进行这种转换。 然后我们用
执行迭代。 现在有一些关于复杂性的评论,假设所有
为
: 该算法需要
空间。请注意,笛卡尔积的显式构造需要
空间。因此,这比任何需要将所有元组同时存储在内存中的算法在空间上指数级更好。
函数需要摊销
时间(通过几何级数参数)。
功能需要
时间。 因此,该算法总共具有时间复杂度
和空间复杂度
(不计算存储成本
)。 一个值得注意的有趣的事情是,如果将
替换为平均每个元组仅检测
坐标而不是全部检测的函数,则时间复杂度降至
,也就是说,它变为相对于大小的线性时间。笛卡尔积。换句话说,在某些情况下,避免每次迭代的元组副本可能是有意义的。
扫窟
该实现使用递归类结构来实现每个向量上的嵌入式for循环。该算法直接在输入向量上工作,不需要大的临时数组。理解和调试很简单。 如果我愿意,使用std :: function p_Action而不是void p_Action(long p_Depth,T * p_ParamList)作为lambda参数将允许我捕获局部变量。在上面的电话中,我没有。 但是你知道,不是吗。 “function”是一个模板类,它接受函数的类型参数并使其可调用。