Sparse vector multiplication

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的扫描中内置一个切换二分搜索的机制。???????

      

猜你喜欢

转载自www.cnblogs.com/tobeabetterpig/p/9450360.html
今日推荐