Как разделение по школьным учебникам является алгоритмом O (n ^ 2)? - PullRequest
6 голосов
/ 21 марта 2010

Предпосылка:

Эта страница Википедии предполагает, что вычислительная сложность длинного деления "Учебник" равна O (n ^ 2) .

Удержание:

Вместо того, чтобы брать два n-значных числа, если я беру одно n-значное число и одно m-значное число, то сложность будет O (n * m) .

Противоречие:

Предположим, что вы делите 100000000 (n цифр) на 1000 (m цифр), вы получаете 100000, для достижения которого требуется шесть шагов .

Теперь, если вы разделите 100000000 (n цифр) на 10000 (м цифр), вы получите 10000. Теперь для этого нужно всего пять шагов .

Вывод:

Итак, похоже, что порядок вычислений должен быть примерно таким: O (n / m) .

Вопрос:

Кто не прав, я или Википедия и где?

Ответы [ 6 ]

11 голосов
/ 21 марта 2010

Вы ошибаетесь, и это потому, что вы не учитываете операции с каждой цифрой.Вместо этого вы считаете, что вы можете сделать вычитание из N-значного числа в O (1).В общем, вы не можете;требуется O (N).

6 голосов
/ 21 марта 2010

Попробуйте еще раз с номерами, такими как 12341234 и 43214321.

Большая буква O является предельной сложностью для всех случаев, а не для особо легкой.

2 голосов
/ 21 марта 2010

Я думаю (не доказал, поэтому не уверен), что ваш вывод является верным утверждением, но на самом деле он не вытекает из вашей предпосылки. Если все, что вы знаете, это то, что деление двух n-значных чисел - это O (n ^ 2), все, что вы можете сделать из n- и m-значных чисел, - это то, что это O (max (n, m) ^ 2), не то чтобы это O (n * m). Это потому, что число из n цифр также может рассматриваться как число из n + 1 с ведущим 0, заменяя операцию на ту, с которой мы знаем сложность.

Например, который не является O (n m): используя длинное умножение, вычисление A ^ 2 + B ^ 2 равно O (n ^ 2), если A и B являются n-значными числами. Однако это не O (n m), если A - это n цифр, а B - это m цифр. Чтобы увидеть это, исправьте B = 1, следовательно, m = 1 и обратите внимание, что вычисление A ^ 2 + 1 с помощью длинного умножения определенно не является O (log (A)) [*].

Ваше «противоречие» не противоречит ни вашей предпосылке, ни вашему выводу. Нотация Big-O - это асимптотическое поведение, которое стремится к бесконечности. Тот факт, что f (3) = 12 для некоторой функции f абсолютно ничего не говорит о предельных значениях big-O для f. Даже если f (n) = 12 для всех нечетных n, это все равно ничего не говорит вам об оценках big-O, потому что вы не знаете, как быстро функция растет на четных числах. Наличие быстрых особых случаев не означает, что функция быстрая.

[] На самом деле, я сам там злоупотреблял нотацией. Если функция с двумя переменными f (n, m) равна O (n m), из этого не следует (как я предположил), что f (n, 1) равно O (n). Но из этого следует, что для достаточно большого m f (n, m) равно O (n), поэтому замените 1 на «некоторую большую постоянную или другую».

0 голосов
/ 30 июля 2014

Да, это O (N ^ 2) из-за всех умножения и вычитания плюс деление, которое должно быть сделано, и по мере того, как числа растут, необходимое для работы время в квадратичной диаграмме увеличивается из-за этого, например, 4/2 занимает одну единицу времени, в то время как 2342677/39 занимает намного больше времени.

0 голосов
/ 07 мая 2010

Ну, в книге Кормена говорится следующее: Рассмотрим обычный алгоритм «бумага и карандаш» для длинного деления: деление a на b, который дает частное q и остаток r. Покажите, что этот метод требует O ((1 + lg q) LG б) битовые операции.

0 голосов
/ 21 марта 2010

Хорошо, рассмотрим этот случай:

Сортировка массива [1, 2, 3, 4, ..... , 10000000] занимает ровно один шаг . Вряд ли ~nlogn шагов, как вы ожидаете от оптимального алгоритма сортировки.

Недостаток вашей логики в том, что Big-O является асимптотической границей для всех входов. Вы не можете сделать простой ввод и вывести из этого противоречие.

...