2017-02-14 3 views
-3

У меня есть два массива:Java: положение элементов в массиве из другого массива

а = [a1, a2, a3, a4, .., ап] упорядочены по возрастанию;

b = [b1, b2, b3, ..., bm] упорядочено по возрастанию;

Я хочу знать положение элементов массива b в массиве a.

Есть ли быстрый способ сделать это, а не искать один за другим?

+0

Если массивы сортируются да. – Gatusko

+0

для каждого b: x вы можете бинарный поиск из подматрицы a: k в a: n, где k - indexOf b: x-1 в –

+0

Любая идея об алгоритме? – lsl

ответ

0

Как упоминалось, массивы отсортированы, вы можете выполнять двоичный поиск.

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); 
      } 
     } 
    } 
} 

Я использовал встроенную библиотеку для бинарного поиска. Надеюсь, поможет! Я обновил код.

+0

Мне также нужна позиция элемента b, даже элемент не выходит в массив A, поэтому бинарный поиск здесь не работает. – lsl

+0

Как вы можете получить позицию элемента b, если она не существует в массиве A. Просто напечатайте -1 в другом вместо «Элемент не существует». Или попробуйте напечатать 'position' в противном случае (если это то, что вы хотите) –

+0

извините,« позиция »здесь я имею в виду, если доза элемента не выйдет в массив A, это даст нижнюю и верхнюю границу элемента. Давайте используем массив в вашем примере, элемент «3» в массиве b не выходит из массива A, но мне также нужна граница «3» в массиве A, которая находится между [1] и [2] (a [1] = 2, a [2] = 5). – lsl

0

O (м) + О (п)

//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

Это не работает, если элемент в массиве b больше любого элемента массива a. – lsl

+0

Поскольку оба массива сортируются в порядке возрастания, если любой элемент из B, то X больше, чем последний элемент в A, что означает, что все элементы из B после X не будут присутствовать в массиве A. поэтому массив результатов будет содержать -1 для всех эти элементы. – skY

Смежные вопросы