交,差,并集,加减法

**

交,差,并集,加减法

**

var crypto = require("crypto");
/**
 *  方法名 :array_remove_repeat
 *  作  用 :去重
 *  @param :
 *  @return:
 *  @date  :2016年11月3日
 */
function array_remove_repeat(a) { //去重
    var r = [];
    for(var i = 0; i < a.length; i++) {
        var flag = true;
        var temp = a[i];
        for(var j = 0; j < r.length; j++) {
            if(temp === r[j]) {
                flag = false;
                break;
            }
        }
        if(flag) {
            r.push(temp);
        }
    }
    return r;
};
/**
 *  方法名 :arrayOperation
 *  作  用 :交集
 *  @param :
 *  @return:
 *  @date  :2016年11月3日
 */
exports.arrayOperation = function() {
    var len = arguments.length;
    var res = [],
        commonArr = [],
        intersection = [];
    for(var i = 0; i < len; i++) {
        if(arguments[i].length == 0) {
            return intersection;
        }
        Array.prototype.push.apply(res, uniqueArray(arguments[i]));
    }
    for(var i = 0; i < res.length; i++) {
        var count = 0;
        for(var j = i; j < res.length; j++) {
            if(res[i] == res[j]) {
                count++;
            }

        }
        commonArr.push([res[i], count]);
    }
    for(var i = 0; i < commonArr.length; i++) {
        if(commonArr[i][1] === len) {
            intersection.push(commonArr[i][0]);
        }
    }
    return intersection;
}

function uniqueArray(data) { //去除数组里相同的数
    data = data || [];
    var a = {};
    for(var i = 0; i < data.length; i++) {
        var v = data[i];
        if(typeof(a[v]) == 'undefined') {
            a[v] = 1;
        }
    };
    data.length = 0;
    for(var i in a) {
        data[data.length] = i;
    }
    return data;
}

/**
 *  方法名 :sum
 *  作  用 :并集
 *  @param :
 *  @return:
 *  @date  :2016年11月3日
 */
exports.sum = function(a, b) { // 并集   
    return array_remove_repeat(a.concat(b));
};
/**
 *  方法名 :set
 *  作  用 :差集
 *  @param :
 *  @return:
 *  @author:zkz
 *  @date  :2016年11月3日
 */
exports.set = function(arr1, arr2) {
        var arr3 = [];
        for(var i = 0; i < arr1.length; i++) {
            var flag = true;
            for(var j = 0; j < arr2.length; j++) {
                if(arr2[j] == arr1[i]) {
                    flag = false;
                }
            }
            if(flag) {
                arr3.push(arr1[i]);
            }
        }
        return arr3;
    }
    /**
     *  方法名 :accAdd
     *  作  用 :加法运算
     *  @param :
     *  @return:
     *  @date  :2016年11月3日
     */
exports.accAdd = function(arg1, arg2) {
        if(arg1 < 0) {
            var c;
            c = arg1;
            arg1 = arg2;
            arg2 = c;
        } else {}
        var r1, r2, m, c;
        try {
            r1 = arg1.toString().split(".")[1].length;
        } catch(e) {
            r1 = 0;
        }
        try {
            r2 = arg2.toString().split(".")[1].length;
        } catch(e) {
            r2 = 0;
        }
        c = Math.abs(r1 - r2);
        m = Math.pow(10, Math.max(r1, r2));
        if(c > 0) {
            var cm = Math.pow(10, c);
            if(r1 > r2) {
                arg1 = Number(arg1.toString().replace(".", ""));
                arg2 = Number(arg2.toString().replace(".", "")) * cm;
            } else {
                arg1 = Number(arg1.toString().replace(".", "")) * cm;
                arg2 = Number(arg2.toString().replace(".", ""));
            }
        } else {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", ""));
        }
        return(arg1 + arg2) / m;
    }
    /**
     *  方法名 :Subtr
     *  作  用 :减法运算
     *  @param :
     *  @return:
     *  @date  :2016年11月3日
     */
exports.Subtr = function(arg1, arg2) { //减法运算
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch(e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch(e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    //last modify by deeka
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return((arg1 * m - arg2 * m) / m).toFixed(n);
};
### 算法的实现与原理 #### 1. **算法** 是指两个集合中共有的元素组成的集合。为了高效地求解,可以通过排序和双指针技术来减少时间复杂度。 如果输入数组未排序,则首先对其进行排序[^1]。随后使用双指针分别指向两个数组的第一个位置,逐步移动指针直到找到相同的元素为止。这种方法的时间复杂度主要由排序决定,即 \(O(n \log n)\),而查找过程为线性的 \(O(m+n)\)[^4]。 以下是基于排序的算法伪代码: ```python def intersection_sorted_arrays(arr1, arr2): i, j = 0, 0 result = [] while i < len(arr1) and j < len(arr2): if arr1[i] == arr2[j]: # 防止重复加入相同元素 if not result or result[-1] != arr1[i]: result.append(arr1[i]) i += 1 j += 1 elif arr1[i] < arr2[j]: i += 1 else: j += 1 return result ``` #### 2. **算法** 是指两个集合中的所有不同元素组成的集合。同样可以利用排序后的数组特性,在一次遍历过程中将不重复的元素依次加入结果中。 对于未排序的数组,先将其排序后再应用上述逻辑。此方法的时间复杂度同样是 \(O((n+m) \log (n+m))\) 的排序开销加上 \(O(n+m)\) 的合成本[^3]。 下面是基于排序的算法伪代码: ```python def union_sorted_arrays(arr1, arr2): i, j = 0, 0 result = [] while i < len(arr1) and j < len(arr2): if arr1[i] == arr2[j]: if not result or result[-1] != arr1[i]: result.append(arr1[i]) i += 1 j += 1 elif arr1[i] < arr2[j]: if not result or result[-1] != arr1[i]: result.append(arr1[i]) i += 1 else: if not result or result[-1] != arr2[j]: result.append(arr2[j]) j += 1 # 添加剩余部分 while i < len(arr1): if not result or result[-1] != arr1[i]: result.append(arr1[i]) i += 1 while j < len(arr2): if not result or result[-1] != arr2[j]: result.append(arr2[j]) j += 1 return result ``` #### 3. **哈希表优化** 除了排序外,还可以借助哈希表(如 Python 中的 `set` 或 Java 中的 `HashSet`)快速完成去重和运算。这种方案无需预排序,适合于随机访问性能较高的场景。 ##### 使用哈希表的算法: ```python def hash_intersection(arr1, arr2): set1 = set(arr1) result = [x for x in arr2 if x in set1] return list(set(result)) ``` ##### 使用哈希表的算法: ```python def hash_union(arr1, arr2): return list(set(arr1).union(set(arr2))) ``` 以上两种方式均具有平均情况下 \(O(n + m)\) 的时间复杂度,但由于涉及额外的空间存储,空间消耗较高。 --- ### 总结 无论是采用排序还是哈希表的方法,都可以有效解决问题。具体选择取决于实际需求:当内存资源有限时可优先考虑排序;而对于大规模数据且允许更多内存占用的情况下,推荐使用哈希表以获得更优的速度表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值