2009-04-23 2 views
3

Может ли кто-нибудь помочь с временной сложностью этого алгоритма и почему это O (n^2). Пошаговое объяснение было бы полезно, спасибо!Алгоритм разделения - сложность времени

function divide(x,y) 
    Input: Two n-bit integers x and y, where y >= 1 
    Output: The quotient and remainder of x divided by y 

    if x = 0: 
     return (q,r) = (0,0) 

    (q,r) = divide(x/2, y) 
    q = 2q 
    r = 2r 

    if x is odd: 
     r = r + 1 

    if r >= y: 
     r = r - y 
     q = q + 1 

    return (q,r) 
+0

Не могли бы вы добавить код в свой код? Сейчас читать довольно сложно. – Skurmedel

+0

Необходимые разъяснения - это арифметические операции, работающие с базовым типом данных (например, int) или с массивами из них (например, массив BigInt ints)? – paxdiablo

+0

нет его нет, его экзаменационный вопрос и я пересматриваю для предстоящего экзамена. У меня есть решения здесь, но я не понимаю: при каждом вызове алгоритма мы теряем один бит. Так будет n + 1 звонков. Каждый вызов включает не более 2 умножений на 2 (сдвиг влево), два дополнения на 1 и вычитание на y, которое является всем O (n). Следовательно, общая сложность равна O (n2) – KP65

ответ

2

Из-за рекурсии divide() вызывается до n раз.

Предположим, что простая арифметика на n-битовых целых числах принимает O (n) время. (Это верно во всех реализациях большого числа, о которых я знаю - в Python, например, добавление 1 к большому целому числу копирует все это.)

Затем мы имеем конечное число операций O (n) до n раз. Это занимает время O (n^n).

def divide(x, y): 
    assert y >= 1 
    if x == 0: 
     return 0, 0 
    q, r = divide(x // 2, y) 
    q *= 2 
    r *= 2 
    if x & 1: 
     r += 1 
    if r >= y: 
     r -= y 
     q += 1 
    return q, r 
+0

Я думаю, что у вас запутался ваш n. Арифметика на одно n-битовое целое будет O (1), а не O (n), так как я полагаю, что n говорит о значении x, переданном функции. divide() НИКОГДА не вызывается до n раз. Передача в 1024 приведет к делению только на 10 раз. – paxdiablo

+0

Но Pax, ваше сообщение говорит, что x и y - «Два n-битовых целых числа». –

+0

N в O (N) является либо значением x, либо числом битов n - оно не может быть одновременно. Я поставил вопрос, что он представляет собой единую целочисленную единицу (int), а не общий массив из них (int []), которые делают bigO зависимым от двух входных переменных. Нужно уточнить вопрос. – paxdiablo

1

В худшем случае, где каждый бит х равен 1 (например, 0xFFFF), представляет собой О (п). Трюк состоит в том, чтобы преобразовать рекурсию в итерацию.

+0

@splicer, я думаю, что худший случай, когда бит * top * , не обязательно все биты. Но теперь мы установили, что n - это число бит, а не значение x, O (n) - правильный ответ, несмотря на вопрос. +1 и удаление моего ответа, предполагая, что n было значением x, а не битком. – paxdiablo

+0

@Pax - Да, вы правы: худший случай - когда установлен MSB. – splicer

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

  • Нет связанных вопросов^_^