Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 实现笛卡尔积,从而可以跳过迭代_Algorithm_Language Agnostic - Fatal编程技术网

Algorithm 实现笛卡尔积,从而可以跳过迭代

Algorithm 实现笛卡尔积,从而可以跳过迭代,algorithm,language-agnostic,Algorithm,Language Agnostic,我想实现一个函数,它将返回集合的笛卡尔积,重复给定的数字。比如说 input: {a, b}, 2 output: aa ab bb ba input: {a, b}, 3 aaa aab aba baa bab bba bbb 但是,我实现它的唯一方法是首先对2个集合(“ab”、“ab”)进行cartesion乘积,然后从集合的输出中添加相同的集合。以下是伪代码: function product(A, B): result = [] for i in A:

我想实现一个函数,它将返回集合的笛卡尔积,重复给定的数字。比如说

input: {a, b}, 2
output:
aa
ab
bb
ba

input: {a, b}, 3
aaa
aab
aba
baa
bab
bba
bbb
但是,我实现它的唯一方法是首先对2个集合(“ab”、“ab”)进行cartesion乘积,然后从集合的输出中添加相同的集合。以下是伪代码:

function product(A, B):
    result = []
    for i in A:
        for j in B:
            result.append([i,j])
    return result
function product1(chars, count):
    result = product(chars, chars)
    for i in range(2, count):
        result = product(result, chars)
    return result
我想要的是直接开始计算最后一个集合,而不计算它之前的所有集合。这是可能的,也是一个可以给我类似结果的解决方案,但笛卡尔积是不可接受的。
我在阅读大多数通用编程语言时没有问题,因此,如果您需要发布代码,您可以使用任何您喜欢的语言来完成。

这里有一个递归算法,它在不首先构建s^(n-1)”的情况下构建s^n“。想象一棵无限的k元树,其中| S |=k。使用S元素的标签,每个边将任何父对象连接到其k个子对象。S^m的元素可以被认为是从根开始的任意长度为m的路径。按照这种思路,集合S^m就是所有这些路径的集合。现在,查找S^n的问题是枚举长度为n的所有路径的问题-我们可以通过考虑从开始到结束的边标签序列来命名路径。我们希望直接生成S^n,而不首先枚举所有S^(n-1),因此修改深度优先搜索以查找深度n处的所有节点似乎是合适的。以下算法基本上就是这样工作的:

// collection to hold generated output
members = []

// recursive function to explore product space
Products(set[1...n], length, current[1...m])

    // if the product we're working on is of the
    // desired length then record it and return
    if m = length then
        members.append(current)
        return

    // otherwise we add each possible value to the end
    // and generate all products of the desired length
    // with the new vector as a prefix
    for i = 1 to n do
        current.addLast(set[i])
        Products(set, length, current)
        currents.removeLast()

// reset the result collection and request the set be generated
members = []
Products([a, b], 3, [])

现在,广度优先方法的效率不亚于深度优先方法,如果你仔细想想,它与你已经在做的事情没有什么不同。事实上,生成S^n的方法必须至少生成一次S^(n-1),因为这可以在S^n的解决方案中找到。

你已经有的东西有什么问题吗?我想跳过迭代,因为上面的算法正在使用前一个集合,所以如果我想生成{a,b}8,首先pc必须计算{a,b}x{a,b}然后({a,b}x{a,b})x{a,b}。。。直到8点,你实际上是在试图解决一个问题(真正的瓶颈?)还是仅仅是“为了好玩而优化”?为了好玩而解决问题算不算?这将有助于我与其他项目很多,但它不是必要的。我也不确定这个问题是否已经解决了,我的意思是,解决这个问题对于meIt(有时)OK来说是不可能“为了好玩”地寻找优化的,但我总是想提醒人们我是用python实现的,结果似乎是列表中包含空列表。更让我烦恼的是,我不明白这是如何跳过迭代的。这是我的python代码:@DeyanGeorgiev在伪代码中很明显,除非其长度为3,否则不能向成员添加任何内容。因此,如果它包含空列表,Python正在做伪代码在语义上没有暗示的事情。我的钱在上面,通过引用而不是值传递列表,分配引用而不是值。你能告诉我调试器里发生了什么吗?如果是对象,则始终将current的副本传递给Products。我修复了代码,我需要复制“current”,因为current.pop正在删除其元素。但是我还是不明白algorithm@DeyanGeorgiev添加一些讨论。