Sparse vector multiplication // unsorted . time complexity is O(M*N) public int sparseMultiplication(ArrayList<ArrayList<Integer>> a, ArrayList<ArrayList<Integer>> b){ if(a == null || b == null || a.size() == 0 || b.size() == 0) return 0; int result = 0; int m = a.size(); int n = b.size(); for(int i = 0; i < m; i++){ pairA = a.get(i); for(int j = 0; j < n; j++){ pairB = b.get(j); if(pairA.get(0) == pairB.get(0)){ result += pairA.get(1) * pairB.get(1); break; } } } return result; } // sorted by index , time complexity is o(m+n) public int sparseMultiplication(ArrayList<ArrayList<Integer>> a, ArrayList<ArrayList<Integer>> b){ if(a == null || b == null || a.size() == 0 || b.size() == 0) return 0; int result = 0; int m = a.size(); int n = b.size(); Collections.sort(a, new Comparator<Pair>() {///////???? @Override public int compare(Pair p1, Pair p2) { if (p1.get(0) == p2.get(0)) { return 0; } return p1.get(0) < p2.get(0)? -1 : 1; } while ( int i < m && int j < n){ ArrayList<Integer> pairA = a.get(i); ArrayList<Integer> pairB = b.get(j); if(pairA.get(0) == pairB.get(0)){ result += pairA.get(1) * pairB.get(1); i++; j++; }else if (pairA.get(0) < pairB.get(0)){ i++; }else{ j++; } } return result; } } // sorted by index , one input is much larger than another one // time complexity is mlogn, m is the size of shorter one, // n is the size of the larger one public int sparseMultiplication(ArrayList<ArrayList<Integer>> a, ArrayList<ArrayList<Integer>> b){ if(a == null || b == null || a.size() == 0 || b.size() == 0) return 0; int result = 0; int m = a.size(); int n = b.size(); Collections.sort(a, new Comparator<Pair>() {///////???? @Override public int compare(Pair p1, Pair p2) { if (p1.get(0) == p2.get(0)) { return 0; } return p1.get(0) < p2.get(0)? -1 : 1; } for(int i = 0; i < m; i++){ ArrayList<Integer> pairA = a.get(i); index = pairA.get(0); j = search(index, 0, n -1, b); ArrayList<Integer> pairB = b.get(j++); if (pairA.get(0) == pairB.get(0)){ result += pairA.get(1) * pairB.get(1); } } private search(int index, int start, int end, ArrayList<ArrayList<Integer>> b){ while(start <= end){ int mid = start + (end - start) / 2; if( b.get(mid).get(0) == index){ return mid; }else if(b.get(mid).get(0) < index){ start = mid; }else{ end = mid; } } return mid; ////////?????? 如果找不到呢,如何优化 } } //////// ????? 又问如果两个数组一样长,且一会sparse一会dense怎么办。他说你可以在two pointer的扫描中内置一个切换二分搜索的机制。???????
Sparse vector multiplication
猜你喜欢
转载自www.cnblogs.com/tobeabetterpig/p/9450360.html
今日推荐
周排行