Finding common elements in two arrays of different size

后端 未结 10 802
隐瞒了意图╮
隐瞒了意图╮ 2020-12-14 18:08

I have a problem to find common elements in two arrays and that\'s of different size.

Take , Array A1 of size n and Array A2 o

相关标签:
10条回答
  • 2020-12-14 18:51

    Try heapifying both arrays followed by a merge to find the intersection.

    Java example:

    public static <E extends Comparable<E>>List<E> intersection(Collection<E> c1,
                                                                Collection<E> c2) {
        List<E> result = new ArrayList<E>();
        PriorityQueue<E> q1 = new PriorityQueue<E>(c1),
                         q2 = new PriorityQueue<E>(c2);
        while (! (q1.isEmpty() || q2.isEmpty())) {
            E e1 = q1.peek(), e2 = q2.peek();
            int c = e1.compareTo(e2);
            if (c == 0) result.add(e1);
            if (c <= 0) q1.remove();
            if (c >= 0) q2.remove();
        }
        return result;
    }
    

    See this question for more examples of merging.

    0 讨论(0)
  • 2020-12-14 18:51
    class SortedArr
    
        def findCommon(a,b)
    
          j =0
          i =0
          l1=a.length
          l2=b.length
    
          if(l1 > l2)
                len=l1
          else
                len=l2
          end
    
    
         while i < len
              if a[i].to_i > b[j].to_i
                  j +=1
              elsif a[i].to_i < b[j].to_i
                  i +=1
              else   
                  puts a[i] # OR store it in other ds
                  i +=1
                  j +=1
              end
         end
      end
    end
    
     t = SortedArr.new
     t.findCommon([1,2,3,4,6,9,11,15],[1,2,3,4,5,12,15])
    
    0 讨论(0)
  • 2020-12-14 18:53

    The Complexity of what I give is O(N*M + N).

    Also note that it is Pseudocode C And that it provides distinct values.

    eg.[1,1,1,2,2,4] and [1,1,1,2,2,2,5] Will return [1,2]

    The Complexity is N*M cause of the for loops

    + N cause of the checking if it already exists in the ArrayCommon[] (which is n size in case Array2[] contains data which duplicate Part of the Array1[] Assuming N is the size of the smaller Array (N < M).

    int Array1[m] = { Whatever };
    int Array2[n] = { Whatever };
    int ArrayCommon[n] = { };
    
    void AddToCommon(int data)
    {
        //How many commons we got so far?
        static int pos = 0; 
        bool found = false;
        for(int i = 0 ; i <= pos ; i++)
        {
            //Already found it?
            if(ArrayCommon[i] == data)
            {
                found = true;
            }
        }
        if(!found)
        {
            //Add it
            ArrayCommon[pos] = data;
            pos++;
        }
    }
    
    for(int i = 0 ; i < m ; i++)
    {
        for(int j = 0 ; j < n ; j++)
        {
            //Found a Common Element!
            if(Array1[i] == Array2[j])
                AddToCommon(Array1[i]);
        }
    }
    
    0 讨论(0)
  • 2020-12-14 18:53

    In Python, you would write set(A1).intersection(A2). This is the optimal O(n + m).

    There's ambiguity in your question though. What's the result of A1=[0, 0], A2=[0, 0, 0]? There's reasonable interpretations of your question that give 1, 2, 3, or 6 results in the final array - which does your situation require?

    0 讨论(0)
提交回复
热议问题