笛卡尔积 算法_酷算法:计算笛卡尔积的任何索引!

本文介绍了如何在有限存储条件下,通过算法高效地获取笛卡尔积的特定索引。算法适用于处理大型数据集,避免生成完整笛卡尔积导致的内存问题。通过示例解释了算法的工作原理,并提供了伪代码。此外,还提到了Python、Java等编程语言的实现示例。
摘要由CSDN通过智能技术生成

笛卡尔积 算法

是否曾经尝试过生成42个大集合/序列的笛卡尔乘积,只是为了获得乘积的236指数?

技巧问题:您没有足够的存储空间! (大概)

值得庆幸的是,有一种算法可以快速获取您想要的任何索引!

有时,您只需要计算非常大的笛卡尔乘积即可使用结果中的少数索引。 问题在于,生成整个事物的过程很慢,而且常常是很多次,以至于您的内存甚至无法处理。

这就是促使我想出这个算法,显然这是真的很难找到在互联网(至少我无法找到它)上。 因此,我继续询问其他人,他们也证实,尽管许多人都知道该算法,但在互联网上找不到它。 所以我在这里发布帖子,希望人们以后可以找到:)

它有什么作用?

假设我们有3个序列-

  • 答: {1, 2, 3}
  • B: {2, 6, 7, 9}
  • C: {1, 7}

只需调用get_tuple_by_index并传递序列的列表/数组(即[A, B, C]{A, B, C} )和所需结果的索引。
对于C (编程语言),您还需要传递序列数 (在这种情况下为3 )和包含每个序列的长度数组 (在这种情况下 {3, 4, 2} )。

例如,如果我们用笛卡尔积A x B x C第六个索引 (从0开始)调用get_tuple_by_index ,我们将得到(1, 9, 1) get_tuple_by_index (1, 9, 1)

它是如何工作的?

对于此演示,我们将使用上面提到的序列作为示例

  • 我们希望笛卡尔积在这种情况下为[A, B, C]{A, B, C}的序列list / array被反向迭代。
  • 在每次迭代中, result tuple都从向后填充。
  • 在每次迭代中, result tuplecurrent element将是当前集合的index % length_of_current_set th。
  • 此外,在每次迭代中, index都设置为index // length_of_current_set其中//表示整数除法。因此,在这种情况下,在第一次迭代中,对于index = 6current element将为C[6 % 2]C[0]1 。 现在将其添加为result tuple最后一个元素 。 现在看起来像-> (1)

index现在设置为6 // 23

在第二次迭代中, current element将为B[3 % 4]B[3]9
现在将其添加为result tuple 倒数第二个元素 。 现在看起来像-> (9, 1)

index现在设置为3 // 40

在第三次迭代中, current element将为A[0 % 3]A[0]1
现在将其添加为result tuple 倒数第三个元素 (在本例中为第一个元素)。 现在看起来像-> (1, 9, 1)

代码

太酷了! 这是一些伪代码来演示算法-

getNthTuple(sets, pos):
    tuple = ()
    for i in [(|sets|-1)..0]:
        set = sets[i]
        elem = set[pos mod |set|]
        tuple = (elem, tuple)
        pos = pos // |set|
    return tuple

如果您想以真实的编程语言查看示例,可以在这里找到javapythonC版本!

翻译自: https://dev.to/totally_chase/cool-algorithm-calculating-any-index-of-a-cartesian-product-1g8i

笛卡尔积 算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值