Причина в том, что когда массив имеет длину 1, время является постоянным, а если оно имеет длину n, то используются 2 рекурсивных вызова с половиной массива.
Немного более формально, используя индукцию по длине n массива. В базовом случае малый размер массива равен 1, и, очевидно, количество операций является константой (это соответствует O (nlog n) ... и все).
В общем индуктивного случае с длиной массива п, оба рекурсивные вызовы product right side array
и product left side
включают N/2 элементов (разделить массив в 2-х частей), и, следовательно, количество операций
н/2 (log n/2) + n/2 (log_2 n/2) = n/2 (log n -1) + n/2 (log n -1) = n log n -2.
В этом случае операция if рассчитывается как 1 дополнительная операция, а сам продукт * - еще один, что дает в общей сложности n log n, но добавление константы не имеет значения.
Вы также можете думать, что рекурсивные вызовы product(product right side array * product left side)
имеют «глубину» log n (в случае, начиная с 256, «глубина» рекурсивных вызовов будет равна 8), так как каждый раз, когда размер array - это половина начальной. Так, наконец, п элементы возвращаются это дает O (N журнал (п))
Итак, что, думаю, должно быть? –
Подумайте, почему алгоритмы логарифмичны? Подсказка: запустите этот код на листе бумаги и посмотрите, что произойдет. Затем измените размер ввода и посмотрите, сколько еще/меньше времени вам потребуется для запуска кода на бумаге. (Посмотрите, как проблемы делятся на небольшие проблемы) – nem035
Как реализованы «правая сторона продукта» и «левая сторона продукта»? Это делает глубокую копию массива? – templatetypedef