关于去重复的笛卡尔积

最近在某些项目中用到了需要去除重复的笛卡儿积,总体思路就是全部for循环最后减去重复的

if (_self.arr[0] instanceof Array && _self.arr[1] instanceof Array) {
     if (_self.arr[0].length > 0 && _self.arr[1].length > 0) {
           _self.total = _self.arr[0].length * _self.arr[1].length;
           for (var i = 0; i < _self.arr[0].length; i++) {
                for (var j = 0; j < _self.arr[1].length; j++) {
                    if (_self.arr[0][i] == _self.arr[1][j]) {
                         _self.total -= 1;
                    }
                 }
            }
     } else {
            _self.total = 0;
     }
} else {
     _self.total = 0;
}

以上是两个数组的情况下,下面再发一个三数组的情况

if (_self.arr[0] instanceof Array && _self.arr[1] instanceof Array && _self.arr[2] instanceof Array) {
     if (_self.arr[0].length > 0 && _self.arr[1].length > 0 && _self.arr[2].length > 0) {
         _self.total = _self.arr[0].length * _self.arr[1].length * _self.arr[2].length;
         for (var i = 0; i < _self.arr[0].length; i++) {
              for (var j = 0; j < _self.arr[1].length; j++) {
                   for (var k = 0; k < _self.arr[2].length; k++) {
                        if (_self.arr[0][i] == _self.arr[1][j]) {
                             _self.total--
                        } else if (_self.arr[0][i] == _self.arr[1][k]) {
                              _self.total--
                        } else if (_self.arr[0][j] == _self.arr[1][k]) {
                               _self.total--
                        }
                    }

                }
            }
      } else {
           _self.total = 0;
      }
} else {
     _self.total = 0;
}

总体思路比较笨吧。。。但是蛮好用
### 笛卡尔积的定义与作用 笛卡尔积是指两个或多个集合中所有可能的有序组合,其中每个组合由每个集合中的一个元素组成。例如,给定两个集合 $ A = \{1, 2\} $ 和 $ B = \{a, b\} $,它们的笛卡尔积为 $ A \times B = \{(1, a), (1, b), (2, a), (2, b)\} $。在实际应用中,笛卡尔积常用于数据库查询、组合优化、数据分析等领域,帮助开发者处理多维数据的组合问题 [^2]。 ### 实现多个集合的笛卡尔积的方法 #### 使用递归实现多个集合的笛卡尔积 递归是一种常见的方法,用于计算多个集合的笛卡尔积。其核心思想是通过递归调用逐步构建最终的组合结果。以下是一个使用 Python 实现的示例: ```python def cartesian_product(sets): result = [] def recursive_helper(index, current): if index == len(sets): result.append(current) return for item in sets[index]: recursive_helper(index + 1, current + [item]) recursive_helper(0, []) return result # 示例输入 sets = [['C', 'Z'], ['Q', 'X']] # 调用函数 result = cartesian_product(sets) # 输出结果 print(result) # [['C', 'Q'], ['C', 'X'], ['Z', 'Q'], ['Z', 'X']] ``` 在这个实现中,`recursive_helper` 函数负责递归地构建每一个组合,当索引 `index` 等于集合数量时,表示已经完成了一个完整的组合,并将其添加到 `result` 列表中 [^2]。 #### 使用 `reduce` 方法实现多个集合的笛卡尔积(JavaScript) 在 JavaScript 中,可以使用 `reduce` 方法来实现多个集合的笛卡尔积。这种方法的核心思想是利用数组的 `reduce` 方法逐步合并集合,生成最终的笛卡尔积结果。以下是一个示例代码: ```javascript function cartesianProduct(...sets) { return sets.reduce((acc, set) => { const result = []; acc.forEach(accItem => { set.forEach(setItem => { result.push([...accItem, setItem]); }); }); return result; }, [[]]); } // 示例输入 const sets = [['C', 'Z'], ['Q', 'X']]; // 调用函数 const result = cartesianProduct(...sets); // 输出结果 console.log(result); // [ [ 'C', 'Q' ], [ 'C', 'X' ], [ 'Z', 'Q' ], [ 'Z', 'X' ] ] ``` 该实现通过 `reduce` 方法逐层展开集合,并将每一对元素组合成新的子数组,最终返回完整的笛卡尔积结果 [^1]。 #### 处理嵌套数组的笛卡尔积(Python) 如果输入的数据结构是嵌套数组,可以通过递归方式处理嵌套结构并生成笛卡尔积。以下是一个处理嵌套数组的示例: ```python def nested_cartesian_product(nested_sets): result = [] def flatten_sets(index, current): if index == len(nested_sets): result.append(current) return for subset in nested_sets[index]: flatten_sets(index + 1, current + subset) flatten_sets(0, []) return result # 示例输入 nested_sets = [[['C'], ['Z']], [['Q'], ['X']]] # 调用函数 result = nested_cartesian_product(nested_sets) # 输出结果 print(result) # [['C', 'Q'], ['C', 'X'], ['Z', 'Q'], ['Z', 'X']] ``` 在这个实现中,`flatten_sets` 函数负责处理嵌套结构,并逐步构建最终的笛卡尔积结果 [^1]。 ### 实际开发中的使用技巧 在实际开发中,笛卡尔积的计算可能会涉及大量的数据,因此需要考虑性能优化。对于小规模数据集,可以直接使用递归或 `reduce` 方法;而对于大规模数据集,建议使用迭代代替递归以避免栈溢出问题。此外,还可以结合缓存机制减少重复计算,提高效率 [^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值