1

最近、和に等しい配列内の整数を見つけるために、この C コードに出くわしました。

int subArraySum(int arr[], int n, int sum)

{

/* Initialize curr_sum as value of first element
   and starting point as 0 */
int curr_sum = arr[0], start = 0, i;

/* Add elements one by one to curr_sum and if the curr_sum exceeds the
   sum, then remove starting element */
for (i = 1; i <= n; i++)
{
    // If curr_sum exceeds the sum, then remove the starting elements
    while (curr_sum > sum && start < i-1)
    {
        curr_sum = curr_sum - arr[start];
        start++;
    }

    // If curr_sum becomes equal to sum, then return true
    if (curr_sum == sum)
    {
        printf ("Sum found between indexes %d and %d", start, i-1);
        return 1;
    }

    // Add this element to curr_sum
    if (i < n)
      curr_sum = curr_sum + arr[i];
}

// If we reach here, then no subarray
printf("No subarray found");
return 0;

}

私の質問では、このアルゴリズムの実行時間は O(n) として与えられます。これは、最悪の場合に arr[] のすべての要素に対して実行された操作の数を数えることで証明できます。私が見る限り、O(n^2) アルゴリズムのように見えます。私は何かを学ぶのを逃したかもしれませんが、これが O(n) である場合、これがどのように O(n) であるかを説明できますか?

4

1 に答える 1