Программа на Java для проверки, является ли массив подмассивом другого класса массива

// Function to check if an array is 
// subarray of another array 
static boolean isSubArray(int A[], int B[],  
                               int n, int m) 
{ 
    // Two pointers to traverse the arrays 
    int i = 0, j = 0; 
  
    // Traverse both arrays simultaneously 
    while (i < n && j < m) 
    { 
  
        // If element matches 
        // increment both pointers 
        if (A[i] == B[j]) 
        { 
  
            i++; 
            j++; 
  
            // If array B is completely 
            // traversed 
            if (j == m) 
                return true; 
        } 
          
        // If not, 
        // increment i and reset j 
        else
        { 
            i = i - j + 1; 
            j = 0; 
        } 
    } 
    return false; 
} 
  
// Driver Code 
public static void main(String arr[]) 
{ 
    int A[] = { 2, 3, 0, 5, 1, 1, 2 }; 
    int n = A.length; 
    int B[] = { 3, 0, 5, 1 }; 
    int m = B.length; 
  
    if (isSubArray(A, B, n, m)) 
        System.out.println("YES"); 
    else
        System.out.println("NO"); 
} 

Таким образом, эта программа будет проверять, содержит ли данный массив определенный подмассив. У меня вопрос: какова будет временная сложность этой программы? Я попытался вычислить его, проверив все утверждения, поскольку переменная i может быть сброшена, я не могу увидеть, является ли ее полиномиальной или линейной.

0
Anthony Danielsson 25 Ноя 2020 в 13:36

1 ответ

Лучший ответ

Сложность по времени равна O(n * m) : начиная с каждого из n элементов в массиве A мы проходим m следующие элементы.

Если вы перепишете код следующим образом, будет намного проще увидеть эту временную сложность:

for (i = 0..n - m)
  for (j = 0..m - 1)
    if (A[i + j] != B[j]) break
  if (j == m) return true  
return false

И пример «плохих» массивов, для которых мы сделаем максимальное количество итераций:

A = [a, a, a, a, a, a] 
B = [a, a, b]
1
Flame239 25 Ноя 2020 в 11:03