javascript将算法复杂度从O(n^2)做到O(n)
2017-08-12 20:11
239 查看
compare the difference of two giving array, return results: 1. elements in both array, 2. elements only in one array.
// O(m*n + m*n) -> O(2*m*n) -> O(n^2) function compareArr1(arr1, arr2){ Array.prototype.contains = function(v) { for (var i = this.length - 1; i >= 0; i--) { if (this[i] == v) { return 1; } } return 0; } arr1 = arr1.sort(); arr2 = arr2.sort(); var ein12 = [], ein1 = [], ein2 = []; for (var i = arr1.length - 1; i >= 0; i--) { if(arr2.contains(arr1[i])){ ein12.push(arr1[i]); }else{ ein1.push(arr1[i]); } } for (var i = arr2.length - 1; i >= 0; i--) { if(!arr1.contains(arr2[i])){ ein2.push(arr2[i]); } } return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 } } // a=[1,2,3,2,3]; // b=[2,3,4,3,4]; // compareArr1(a,b);
// O(m*n + m + n) -> O(n^2) function compareArr2(arr1, arr2) { function delDup(arr) { for (var i = arr.length - 1; i >= 1; i--) { if(arr[i]==arr[i-1]){ arr.splice(i,1); } } } arr1 = arr1.sort(); arr2 = arr2.sort(); delDup(arr1); delDup(arr2); var ein12 = [], ein1 = arr1.slice(0, arr1.length), ein2 = arr2.slice(0, arr2.length); for (var i = arr1.length - 1; i >= 0; i--) { for (var j = arr2.length - 1; j >= 0; j--) { if (arr1[i] == arr2[j]) { ein12.push(arr1[i]); ein1.splice(i, 1); ein2.splice(j, 1); break; } } } return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 } } // a=[1,2,3,2,3]; // b=[2,3,4,3,4]; // compareArr2(a,b);
// O(2m+2n+m+n) -> O(3(m+n)) -> O(n) function compareArr3(arr1, arr2){ function arr2obj(obj,arr) { for (var i = arr.length - 1; i >= 0; i--) { obj['_' + arr[i]]=arr[i]; } return obj; } var obj12 = {}, obj1 = {}, obj2 = {}; arr2obj(obj1,arr1); arr2obj(obj2,arr2); arr2obj(obj12,arr1); arr2obj(obj12,arr2); var ein12 = [], ein1 = [], ein2 = []; for(var k in obj12){ if(obj1[k] && obj2[k]) { ein12.push(obj12[k]); }else if(obj1[k]){ ein1.push(obj12[k]); }else{ ein2.push(obj12[k]); } } return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 } } // a=[1,2,3,2,3]; // b=[2,3,4,3,4]; // compareArr3(a,b);
Think more, and you can do better.
相关文章推荐
- 算法的复杂度
- javascript常用经典算法实例详解
- 面试用算法复杂度总结
- 每个程序员都应该收藏的算法复杂度速查表
- JavaScript blog式日历控件新算法
- 如何利用抖音推荐算法,做到从零到万的粉丝?
- 速查表:常用算法和数据结构的复杂度
- 算法复杂度
- Advanced Algorithm Scripting (50 hours)Javascript进阶算法练习
- javascript常用数组算法总结
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 算法的时间复杂度和空间复杂度
- javascript 算法相关,如何利用指针特性求数组并集与交集
- 二叉树面试算法:空间复杂度为 O(1)的Morris遍历法
- javascript算法汇总(持续更新中)
- 算法的时间复杂度计算
- 【算法】二叉树的非递归遍历的简洁写法/迭代器实现/O(1)空间复杂度的Morris遍历
- 算法系列之--Javascript和Kotlin的堆排序算法(原)
- 一棵排序二叉树,令 f=(最大值+最小值)/2, 设计一个算法,找出距离f 值最近、大于f 值的结点。 复杂度如果是O(n2)则不得分
- javascript 散列表(Hashes)算法与说明