2016-04-09 25 views
0

У меня возникли проблемы с определением большого значения этого решения. Я придумал вопрос CTCI. . Сложность пространства должна быть O (1) , но это время выполнения НА)? Это похоже на O (N^2) из-за цикла while. Но цикл while не запускает N раз для каждого элемента внутри цикла for.Пробег и пространственная сложность этого кода

public static int[] missing_two(int [] n){ 

     for(int i=0;i<n.length;i++){ 
      while(n[i]!=i){ 
       int temp=n[i]; 
       n[i]=n[n[i]]; 
       n[temp]=temp; 
      } 
     } 

    } 

Может ли 6,0,1,2,3,4,5 быть примером наихудшего случая здесь? Цикл while будет запускаться n раз по первому индексу. и 0 после этого. Следовательно, это не должно быть O (2n) => O (n)?

+0

Вы уверены, что код работает? Я могу разобрать его неправильно, но если 'n [i] == i', то' n [i] == n [n [i]] ', поэтому ваше условие выхода' n [i]! = I + 1' получает вы застряли в бесконечном цикле. – xvan

+0

ahh спасибо, что указал. Вы правы в этом – Nych

ответ

1

Мое понимание состоит в том, что для обозначения верхнего предела или сценария наихудшего сценария используется большая нотация O. Вопрос, который вы должны сделать сами: Может ли вектор ввода n иметь такие значения, что, по крайней мере, в одном случае для всех значений входного вектора n цикл while полностью выполняется? Тогда правильная нотация Big O была бы O (N^2), если бы она не была закрытой, то, по-видимому, O (N^2) была бы лучшей оценкой, чем O (N), так как O (N) для верхней границы были бы уже превышены.

Теперь, когда вы отредактировали этот вопрос и получили больше информации об этом, я согласен с вами. Это O (N)

+0

Да можно, например, 6,0,1,2,3,4,5. Однако при первом индексе. он будет выполнять n циклов, но весь следующий индекс будет 0 циклов. поэтому я думаю, что он больше к 2n. – Nych

+0

Если возможно, предположим, что у n вектора имеется 10 выборок, то для называется 10 раз, и каждый раз для for называется while, называется еще 10 раз, не делает ли это 100 вместо 20? – VMMF

+0

Я верю в худшем случае. Цикл while будет только петля 10 раз на одном из элементов. в течение этих 10 циклов. он сортирует остальную часть массива. Условие запуска цикла while: n [i]! = I (ранее я ошибся в своем коде). После этого первого цикла остальная часть элемента не будет запускать цикл while. На примере, о котором я рассказывал. 6,0,1,2,3,4,5. По первому индексу он поменяет 6, с 5. затем 5 с 4 и т. Д., Пока не станет 0,1,2,3,4,5,6. Когда он перейдет к следующему индексу. n [1] = 1, поэтому он не будет запускать цикл while. – Nych