2017-02-14 76 views
-3

我有兩個陣列:爪哇:查找從另一個數組的數組元素的位置

A = [A1,A2,A3,A4,...,一個]有序的升序;

b = [b1,b2,b3,...,bm]按升序排列;我想知道數組a中的數組b的元素的位置。

有沒有一個快速的方法來做到而不是一個一個找?

+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

即使元素不在數組A中,我也需要元素b的位置,所以二進制搜索在這裏不起作用。 – lsl

+0

當數組A中不存在元素時,您甚至可以獲得元素的位置。只需在else中打印-1而不是「元素不存在」。或者嘗試在其他位置打印位置(如果這是你想要的) –

+0

對不起,這裏的「位置」是指如果元素不在數組A中退出,它將給出元素的上邊界和下邊界。讓我們用你的例子中的數組,數組b中的元素「3」不會在數組A中退出,但是我還需要數組A中的「3」的邊界,即在[1]和[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

如果數組b中的元素大於數組a的任何元素,則這不起作用。 – lsl

+0

由於兩個數組都按升序排列,如果B中的任何元素比方說X大於A中的最後一個元素,這意味着B之後的B中的所有元素都不會出現在數組A中,所以結果數組將包含-1這些元素。 – skY

相關問題