标签: cartesian-product

计算n元笛卡儿积

给定两个列表,我可以生成这两个列表的笛卡尔积的所有排列的列表:

permute :: [a] -> [a] -> [[a]]
permute xs ys = [ [x, y] | x <- xs, y <- ys ]

Example> permute [1,2] [3,4] == [ [1,3], [1,4], [2,3], [2,4] ]
Run Code Online (Sandbox Code Playgroud)

如何扩展置换,以便不使用两个列表,而是获取列表的列表(长度为n)并返回列表列表(长度为n)

permute :: [[a]] -> [[a]]

Example> permute [ [1,2], [3,4], [5,6] ]
            == [ [1,3,5], [1,3,6], [1,4,5], [1,4,6] ] --etc
Run Code Online (Sandbox Code Playgroud)

我在Hoogle上找不到任何相关的东西..唯一与签名相匹配的功能是transpose,它不会产生所需的输出.

编辑:我认为这个2列表版本基本上是笛卡尔积,但我不能完全实现n-ary笛卡尔积.有什么指针吗?

haskell combinatorics cartesian-product

11
推荐指数
3
解决办法
4626
查看次数

关系代数中"theta join"的清晰解释?

我正在寻找对关系代数中theta连接概念的清晰,基本的解释,也许是一个例子(或许使用SQL)来说明它的用法.

如果我理解正确的话,theta join是一个添加了条件的自然连接.那么,自然连接强制同名属性之间的相等(并删除副本?),theta连接做同样的事情,但添加在一个条件.我有这个权利吗?任何明确的解释,简单来说(对于非数学家)将不胜感激.

另外(对不起,最后只是把它扔进去,但它有点相关),有人可以解释笛卡尔积的重要性或想法吗?我认为我遗漏了一些关于基本概念的东西,因为对我来说它似乎只是一个基本事实的重述,即一组13 X一组4 = 52 ......

sql relational-algebra cartesian-product relational-database

11
推荐指数
1
解决办法
2万
查看次数

如何在Java中通过任意数字组创建笛卡尔积?

假设我有两组数字:

{1, 2, 3},
{4, 5}
Run Code Online (Sandbox Code Playgroud)

我想创建一个输出以下6种组合的算法(在Java中):

1,4
1,5
2,4
2,5
3,4
3,5
Run Code Online (Sandbox Code Playgroud)

每组中可以有任意数量的组和任意数量的成员.因此在上面的例子中,有2组,第一组有3个成员,第二组有2个成员.另一个例子如下(3组,第一组3名成员,第2组和第3组2名成员):

{1, 2, 3},
{4, 5},
{6, 7}
Run Code Online (Sandbox Code Playgroud)

这将产生以下12种组合:

1,4,6
1,4,7
1,5,6
1,5,7

2,4,6
2,4,7
2,5,6
2,5,7

3,4,6
3,4,7
3,5,6
3,5,7
Run Code Online (Sandbox Code Playgroud)

我怎么能用Java做到这一点?我正在尝试使用递归,我已经看了一个类似的问题,但我仍然很短.谢谢您的帮助!(PS这不是作业作业)

java algorithm recursion cartesian-product

11
推荐指数
3
解决办法
9729
查看次数

如何迭代计算笛卡尔积?

这个问题询问如何计算给定数量向量的笛卡尔乘积.由于向量的数量是预先知道的并且相当小,因此使用嵌套的for循环很容易获得解决方案.

现在假设您以您选择的语言给出了向量(或列表列表或集合等)的向量:

l = [ [1,2,3], [4,5], [6,7], [8,9,10], [11,12], [13] ]
Run Code Online (Sandbox Code Playgroud)

如果我被要求计算其笛卡尔积,那就是

[ [1,4,6,8,11,13], [1,4,6,8,12,13], [1,4,6,9,11,13], [1,4,6,9,12,13], ... ]
Run Code Online (Sandbox Code Playgroud)

我会继续递归.例如,在快速和肮脏的python中,

def cartesianProduct(aListOfLists):
    if not aListOfLists:
        yield []
    else:
        for item in aListOfLists[0]:
            for product in cartesianProduct(aListOfLists[1:]):
                yield [item] + product
Run Code Online (Sandbox Code Playgroud)

有一种简单的方法可以迭代计算它吗?

(注意:答案不需要在python中,无论如何我都知道在python中,itertools可以更好地完成工作,就像在这个问题中一样.)

language-agnostic iteration algorithm cartesian-product

10
推荐指数
1
解决办法
6100
查看次数

高效的项目分级算法(itertools/numpy)

我认为这是一个常见的组合问题,但我似乎无法找到它的名称或任何有关它的材料.我在Python和numpy中这样做,但如果有一个快速矩阵方法,我可以翻译.

基本上,给定n个项目,我需要生成所有方法将它们放入m个箱子中.举个例子,将4个项目合并为3个区域会产生类似的结果[(4, 0, 0), (3, 1, 0), (3, 0, 1), (2, 2, 0), (2, 1, 1), ...].这是一个固定总额的产品.

使用itertools实现这一点非常简单.

import itertools

def fixed_total_product(bins, num_items):
""" Return iterator of all item binning possibilities. """
return itertools.ifilter(lambda combo: sum(combo) == num_items,
                         itertools.product(xrange(num_items + 1), repeat=bins))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我认为在循环中进行后续计算将是低效的.使用它作为2D numpy数组稍后会更快,但我无法找到一种有效的方法来构建一个数组.我可以遍历ifilter结果,构建一个可能性列表,并使用它来构建数组,但这似乎是一个巨大的浪费.

我猜这样做的最好方法是建立一切"笨拙的方式",但我不知道该怎么做.stackoverflow上有一个快速的产品实现:使用numpy构建两个数组的所有组合的数组.我猜你可以修改它只是输出正确总和的产品.数组的大小应该是((m-1)+ n)选择n,因为有m-1个bin边界.

有任何想法吗?基准非常感谢,但不是必需的.

python algorithm numpy combinatorics cartesian-product

10
推荐指数
1
解决办法
2244
查看次数

Scala方法将iterable的每个元素与另一个元素组合在一起?

如果我有这个:

val a = Array("a ","b ","c ")
val b = Array("x","y")
Run Code Online (Sandbox Code Playgroud)

我想知道是否存在允许我遍历第一个集合的这种方法,并且对于每个元素,遍历整个第二个集合.例如,如果我们采取的阵列a,我们将有a,x,a,y,b,x,b,y,c,x,c,y.我知道拉链,但从我看到的它只适用于相同尺寸的集合,并且它关联来自相同位置的元素.

scala cartesian-product scala-collections

9
推荐指数
3
解决办法
6398
查看次数

在Linq(C#)中将多个不同大小的集合动态交叉连接在一起

我有一个未知数量的桶(集合),每个桶具有未知数量的实体

我需要生成所有实体的笛卡尔积,这样我最终会得到一个具有ARRAYS实体的COLLECTION,并且在每个数组中,每个桶都有1个代表性.

因此,如果我有5个桶(B1..B5),并且桶B1,B2各有1个项目,而桶B3,B4和B5各有4个,8个和10个项目,我将拥有320个阵列的集合,每个数组将有5个项目.

这里唯一的问题是,在开发时,桶的大小和桶的数量都是未知的.

性能在这里并不是非常重要,因为大多数时候,我的桶只有1个实体,而且很少有时候我的桶会包含20-30个项目...而且我通常会有5个30桶

我想在某种程度上使用linq,但是当我试图想象这是如何工作的时候,我的大脑正在变得油腻

c# linq cartesian-product

9
推荐指数
3
解决办法
1790
查看次数

如何在makefile中获取名称列表的笛卡尔积(组合扩展)

使用GNU-make,假设我的Makefile中有两个列表,并且我想将它们组合起来以将其笛卡尔积作为另一个列表,以便我可以将其用作目标列表.

作为一个我不太清楚的语言的例子,R有一个函数expand.grid()可以实现这个目的.

我实际上想出了一种使用Makefile执行此操作的方法:

.PHONY: all

prefix := 1 2

base := A B 

add_prefix = $(addsuffix $(base), $(prefix))

Obj = $(foreach base, $(base), $(add_prefix))

all: 
    @echo $(Obj)
Run Code Online (Sandbox Code Playgroud)

但是,这非常hacky并且不以直观的方式使用addsuffix功能.有没有更好的方法呢?

makefile cartesian-product gnu-make

9
推荐指数
1
解决办法
643
查看次数

Java 8中流的笛卡尔积作为流(仅使用流)

我想创建一个方法来创建一个元素流,这些元素是多个给定流的笛卡尔积(由二元运算符在末尾聚合到相同类型).请注意,参数和结果都是流,而不是集合.

例如,对于{A,B}{X,Y}的两个流,我希望它生成值{AX,AY,BX,BY}的流(简单串联用于聚合字符串).到目前为止,我已经提出了这个代码:

private static <T> Stream<T> cartesian(BinaryOperator<T> aggregator, Stream<T>... streams) {
    Stream<T> result = null;

    for (Stream<T> stream : streams) {
        if (result == null) {
            result = stream;
        } else {
            result = result.flatMap(m -> stream.map(n -> aggregator.apply(m, n)));
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

这是我想要的用例:

Stream<String> result = cartesian(
  (a, b) -> a + b, 
  Stream.of("A", "B"), 
  Stream.of("X", "Y")
);

System.out.println(result.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

预期结果:AX, AY, BX, BY.

另一个例子:

Stream<String> result = …
Run Code Online (Sandbox Code Playgroud)

java set cartesian-product java-8 java-stream

9
推荐指数
1
解决办法
3538
查看次数

改进使用笛卡尔积的算法

问题

假设您有n整数列表,其中每个列表仅包含from 1到的整数n.例如,对于n = 4,我们可能有:

a_1 = [1, 2]
a_2 = [3]
a_3 = [4, 1, 1]
a_4 = [2, 3]
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:我可以勾选这些列表之间1和之间的所有整数,但是一旦我找到一个数字,我就不能再使用该列表来查找后续数字了吗?nn

例如,在上面的示例中n = 4,我可以选择1,from a_1,from a_4,3 from a_2和4 for a_3,因此我填充了从1到4的所有数字,但仅使用每个列表一次.

我无法找到范围(因此应该返回False)的示例将是:

a_1 = [1, 2]
a_2 = [3, 3, 5]
a_3 = [4]
a_4 = [5]
a_5 = [3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

原因是因为如果我从a_1中选择1,我就不能从任何列表中选择2.

途径

这是我目前直截了当的方法.我制作列表的笛卡尔积,并检查是否有任何,排序,将是一个范围.

import itertools

def …
Run Code Online (Sandbox Code Playgroud)

python algorithm optimization cartesian-product

9
推荐指数
1
解决办法
319
查看次数