2017-02-14 2 views
-3

Ich habe zwei Arrays:Java: Finden Position der Elemente in einer Matrix von einem anderen Array

a = [a1, a2, a3, a4, .., an] in aufsteigenden geordnet;

b = [b1, b2, b3, ..., bm] aufsteigend sortiert;

Ich möchte die Position der Elemente von Array b in Array kennen a.

Gibt es einen schnellen Weg, es zu tun, anstatt eins nach dem anderen zu finden?

+0

Wenn die Arrays Ja sortiert sind. – Gatusko

+0

für jedes b: x können Sie binarySearch aus dem Subarray von a: k zu a: n, wobei k ist indexOf b: x-1 in einem –

+0

Irgendeine Idee über den Algorithmus? – lsl

Antwort

0

Wie erwähnt Arrays sind sortiert, können Sie die binäre Suche durchführen.

import java.util.Arrays; 

class ArrayTest { 
    public static void main(String[] args) { 
     int a[] = { 1, 2, 5, 7 }; 
     int b[] = { -2, 2, 3, 4, 5, 6 }; 
     for (int i = 0; i < b.length; i++) { 
      int position = Arrays.binarySearch(a, b[i]); 
      if (position >= 0) 
       System.out.println("Element " + b[i] + " is at " + position 
         + " in array A"); 
      else { 
       // System.out.println("Element does not exist in array A"); 
       int lower = -1; 
       int upper = -1; 
       for (int j = 0; j < a.length; j++) { 
        if (b[i] > a[j]) { 
         lower = j; 
        } else { 
         upper = j; 
        } 
        if (upper != -1) 
         break; 
       } 
       if (upper <= 0) 
        System.out.println("Element " + b[i] + " is at before 0"); 
       else 
        System.out.println("Element " + b[i] + " is Between " 
          + lower + " and " + upper); 
      } 
     } 
    } 
} 

Ich habe eingebaute Bibliothek für binäre Suche verwendet. Ich hoffe es hilft! Ich habe den Code aktualisiert.

+0

Ich brauche auch die Position von Element b, auch wenn das Element nicht in Array A austritt, so dass die Binärsuche hier nicht funktioniert. – lsl

+0

Wie können Sie sogar die Position von Element von b bekommen, wenn es nicht in Array A existiert. Einfach -1 in else ausgeben anstatt "Element existiert nicht". Oder versuche 'position' in else zu drucken (falls du das willst) –

+0

sorry, "position" hier meine ich, wenn das Element nicht in Array A endet, gibt es die untere und obere Grenze des Elements. Lassen Sie uns das Array in Ihrem Beispiel verwenden, das Element "3" in Array b kommt nicht in Array A, aber ich brauche auch die Grenze von "3" in Array A, also zwischen a [1] und a [2] (a [1] = 2, a [2] = 5). – lsl

0

O (m) + O (n)

//assuming both a and b are sorted in ascending order 
    int startA = 0, startB = 0; 
    int[] a = {2,4,6,8,9}; 
    int[] b = {1,4,9}; 
    int[] result = new int[b.length]; 
    //result[i] suggest position of ith element of array b in array a. you can initialize all elements of result to -1 indicating not present in a 
    int endB = b.length, endA = a.length; 
    while(startB<endB && startA<endA){ 
     if(b[startB]<a[startA]){ 
      startB++; 
     } 
     else if(b[startB]>a[startA]){ 
      startA++; 
     } 
     else{ 
      result[startB]=startA; 
      startB++; 
     } 

    } 
+0

Dies funktioniert nicht, wenn ein Element im Array b größer als ein Element des Arrays a ist. – lsl

+0

Da beide Arrays in aufsteigender Reihenfolge sortiert sind, wenn irgendein Element in B angenommen wird, dass X größer als das letzte Element in A ist, bedeutet dies, dass alle Elemente in B nach X in Array A nicht mehr vorhanden sind diese Elemente. – skY

Verwandte Themen