数组取交集、并集与补集

  1. 交集

    集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。

  2. 并集

    给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。

  3. 补集

    一般指绝对补集,即一般地,设S是一个集合,A是S的一个子集,由S中所有不属于A的元素组成的集合,叫做子集A在S中的绝对补集。在集合论和数学的其他分支中,存在补集的两种定义:相对补集和绝对补集。

800003022.jpg

这样一个需求,原数组arr1,组件返回数组arr2,最后需要目标数组targetArr

目标数组targetArr中包含arr1与arr2相同的部分,并且删除arr1不在arr2中的元素

分析:

  1. 创建一个新的数组,取arr1与arr2的交集
  2. 再创建一个数组,取arr2在arr1中的补集
  3. 合并两个创建的数据,得到targetArr
        let arr1 = [{ id: 1, name: '123' }]
        let arr2 = [{ id: 1, name: '123' },{ id: 2, name: '222' }]
        const arr1Ids = arr1.map(d => d.id)
        const arr2Ids = arr2.map(d => d.id)
        const arr3 = arr2.map(t => {
          if (!arr1.includes(t.id)) {
            return t
          }
        })
        // arr3即为两个数组的差集
        const arr4 = arr1.map(t => {
         if (arr2Ids.includes(t.id)) {
              return t
            }
        })
        // arr4为arr2在arr1中的补集
        this.form.dtoList = [...arr3.filter(a => a), ...arr4.filter(a => a)]

这样一个例子,是项目中常用到的一个算法,也许会有更简单的,目前这是我自己的想法。

guozhi-web\src\pages\slcs\viewService\adminActivity\SlcsCreate.vue — 217

在C++中,我们可以使用一维数组来模拟合的数据结构,然后通过循环和条件判断来实现交集的操作。这里我将给出一个简单的示例,使用`bool`类型的数组表示元素是否存在。请注意,这仅适用于整数合,因为数组下标通常用于存储整数值。 **1. (Union):** ```cpp #include <iostream> void unionSet(int arr1[], int n1, int arr2[], int n2) { for (int i = 0; i < n2; ++i) { if (!arr1[arr2[i]]) { // 如果元素不在第一个合中,添加到中 arr1[arr2[i]] = true; } } } // 示例数组 bool arr[50] = {false}; // 假设数组大小足够大 int main() { int arr1[] = {1, 2, 3, 4, 5}; int n1 = sizeof(arr1) / sizeof(arr1[0]); int arr2[] = {4, 5, 6, 7}; unionSet(arr1, n1, arr2, sizeof(arr2) / sizeof(arr2[0])); // 输出内的元素 std::cout << ": "; for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) { if (arr[i]) { std::cout << i+1 << " "; } } return 0; } ``` **2. 交集(Intersection):** ```cpp void intersectionSet(int arr1[], int n1, int arr2[], int n2) { for (int i = 0; i < n2; ++i) { if (arr1[arr2[i]]) { // 如果元素在第一个合中,更新第二个合也存在 arr2[i] = true; } else { arr2[i] = false; } } } // 示例 intersectionSet(arr1, n1, arr2, sizeof(arr2) / sizeof(arr2[0])); std::cout << "交集: "; for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) { if (arr[i] && arr2[i]) { std::cout << i+1 << " "; } } ``` **3. (Complement):** 由于没有现成的函数可以直接获另一个合的,我们可以先计算两个合的,然后再从结果中删除原合的元素来得到。这里假设`arr1`是我们要找到的对象: ```cpp void complementSet(int arr1[], int n1, bool &arr2[]) { // 先计算 unionSet(arr1, n1, arr2, sizeof(arr2) / sizeof(arr2[0])); // 删除原合的元素 for (int i = 0; i < n1; ++i) { if (arr1[i]) { arr2[arr1[i]-1] = false; } } } // 示例 complementSet(arr1, n1, arr2); std::cout << ": "; for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) { if (!arr[i]) { std::cout << i+1 << " "; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值