当前位置: 首页 > 面试题库 >

如何迭代计算笛卡尔积?

欧阳乐生
2023-03-14
问题内容

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

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

l = [ [1,2,3], [4,5], [6,7], [8,9,10], [11,12], [13] ]

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

[ [1,4,6,8,11,13], [1,4,6,8,12,13], [1,4,6,9,11,13], [1,4,6,9,12,13], ... ]

我将继续递归。例如,在快速脏Python中,

def cartesianProduct(aListOfLists):
    if not aListOfLists:
        yield []
    else:
        for item in aListOfLists[0]:
            for product in cartesianProduct(aListOfLists[1:]):
                yield [item] + product

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

(注意:答案不一定要使用python,无论如何,我知道在python中,itertools可以更好地完成此工作


问题答案:

1)在各自的列表中创建一个索引列表,初始化为0,即:

indexes = [0,0,0,0,0,0]

2)从每个列表(在本例中为第一个)中产生适当的元素。

3)将最后一个索引增加一个。

4)如果最后一个索引等于最后一个列表的长度,则将其重置为零并携带一个。重复此操作,直到没有进位。

5)返回步骤2,直到索引回绕到[0,0,0,0,0,0]

它与计数工作原理类似,不同之处在于每个数字的基数可以不同。

这是上述算法在Python中的实现:

def cartesian_product(aListOfList):
    indexes = [0] * len(aListOfList)
    while True:
        yield [l[i] for l,i in zip(aListOfList, indexes)]
        j = len(indexes) - 1
        while True:
            indexes[j] += 1
            if indexes[j] < len(aListOfList[j]): break
            indexes[j] = 0
            j -= 1
            if j < 0: return

这是使用模数技巧实现它的另一种方法:

def cartesian_product(aListOfList):
    i = 0
    while True:
        result = []
        j = i
        for l in aListOfList:
             result.append(l[j % len(l)])
             j /= len(l)
        if j > 0: return
        yield result
        i += 1

请注意,这以与您的示例稍有不同的顺序输出结果。可以通过以相反顺序遍历列表来解决此问题。



 类似资料:
  • 我有以下收藏类型: 我希望根据集合中每个键的单个值为每个创建唯一的组合。

  • 本文向大家介绍javascript笛卡尔积算法实现方法,包括了javascript笛卡尔积算法实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript笛卡尔积算法实现方法。分享给大家供大家参考。具体分析如下: 这里可根据给的对象或者数组生成笛卡尔积 希望本文所述对大家的javascript程序设计有所帮助。

  • 本文向大家介绍PHP笛卡尔积实现算法示例,包括了PHP笛卡尔积实现算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP笛卡尔积实现算法。分享给大家供大家参考,具体如下: 最终输出格式 Array (     [0] => 1,3,76     [1] => 1,3,6     [2] => 1,3,1     [3] => 1,3,0     [4] => 1,5,76    

  • 主要内容:Oracle CROSS JOIN子句简介,Oracle Cross Join示例在本教程中,您将学习如何使用Oracle 创建连接表的笛卡尔积。 Oracle CROSS JOIN子句简介 在数学中,给定两个集合和,的笛卡尔乘积是所有有序对(,)的集合,属于,属于。 要在Oracle中创建表的笛卡尔乘积,可以使用子句。 以下说明了子句的语法: 与其他连接(如或)不同,没有连接谓词的子句。 当执行两个没有关系的表的交叉连接时,将得到两个表的行和列的笛卡尔乘积。 当您想要生成大量

  • 问题内容: 我有两个pandas数据框: 获得其笛卡尔积的最佳实践是什么(当然不用像我这样明确地编写它)? 问题答案: 如果每行都有一个重复的键,则可以使用merge生成笛卡尔乘积(就像在SQL中一样)。 输出:

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维

  • 问题内容: 我对SQL还是很陌生,并且正在为查询而苦苦挣扎(使用Access,FWIW)。我已经搜索并搜索了StackOverflow,但没有看到这种确切的情况。(这也可能是因为我不知道正确的搜索词。) 我有两个非常简单的表,其中包含相似的数据。 我想要的是在两个表以及该人所在的每个表的网络中找到匹配的每个人/州组合: 此人在每个表中可能位于多个网络中。我想查看此人所属的每个网络(从两个表中)。

  • 是否有任何算法有助于最佳地找到包含分布在笛卡尔曲面上的一定数量的项目的最小矩形数(每个项目是一个具有x的点)