2015-06-20 2 views
2

Как я могу сравнить сложность этих двух методов O?Как сравнить сложность двух методов в Java?

Вот первый способ:

protected static List<Integer> removeDuplicates1(List<Integer> source) { 
    List<Integer> tmp = new ArrayList<Integer>(); 
    for (Integer element : source) { 
     if (!tmp.contains(element)) { 
      tmp.add(element); 
     } 
    } 

    //Collections.sort(tmp); 
    return tmp; 
} 

И второй один:

protected static List<Integer> removeDuplicates2(List<Integer> source) { 
    return new ArrayList<Integer>(new HashSet<Integer>(source)); 
} 

UPD

Я не знаю, как вычислить сложность O обоих методов ,

UPD2

Хорошо, временная сложность первого метода является O(n^2), второй O(n). А как насчет использования памяти? Кто более жадный и почему?

+0

Посмотрите на источник, если вы не можете затем подавать огромные списки и измерять время (по крайней мере, для временной сложности). Есть инструменты, которые отслеживают использование кучи/стека, одна из самых простых построена в jdk «jconsole», расположенной в bin directory – Palcente

+0

Вы знаете, как вычислить сложность O каждого из них? Если да, то сравнение их должно быть довольно простым. Если вы этого не сделаете, то, пожалуйста, отредактируйте свой вопрос, чтобы отразить это, потому что формулировка, кажется, предполагает, что вы это делаете. Я не уверен, какой вопрос на самом деле. – yshavit

+0

@Palcente Я всегда думал, что сложность алгоритма - это вещь, связанная с какой-то теорией, а не с практикой. – JohnWinter

ответ

2

Второй лучше O(n) сложность (O(n^2) для первого).

Для первых вы идете по списку в цикле (n) и для каждой операции запуска , который в свою очередь проходит через список TMP, чтобы найти, является ли элемент существует (еще один n).

Для второго метода операции добавления в Set постоянны, так что фактически только один n.

+0

Все это изучено, глядя на реализацию ArrayList и HashSet (или полагая, что говорит Javadoc). Можно было бы добавить что-то в ArrayList, который будет содержать O (1). – laune

+1

@laune no. contains() для списка проверяет все элементы. Фактически итерации по списку. Конечно, можно что-то добавить ... но это не будет ArrayList – StanislavL

+0

Конечно, я знаю, что делает java.util.ArrayList.contains. Пожалуйста, прочитайте то, что я написал: я сказал **, это было бы возможно ** и что вам нужно быть уверенным в реализации **. ОП, похоже, сомневался в необходимости взглянуть на реализацию. Добавление чего-то в ArrayList не заставит его потерять контракт, т. Е. Его реализованные интерфейсы. – laune

0

Второй метод работает лучше, поскольку его сложность O(n) в отличие от первого, где он работает в O(n^2).

Сложность второго решения в случае нотации Big O - это O (n), поскольку она проходит через список только один раз. В то время как в первом случае он сначала для циклов работает один раз, но внутренний содержит mehtod снова работает во временном списке. Таким образом, сложность в этом случае равна O (n^2).

0

Не пытайтесь делать это на Java, просто попробуйте сделать это в псевдокоде.

В первом вопросе у вас есть два списка целых чисел; два списка номеров. Если нет других правил, мы можем предположить, что оба списка имеют длину около n элементов.

Вы прокладываете путь через один из списков и делаете что-то для каждого числа в нем. Если n чисел, это n шагов. Для каждого из этих n шагов вы говорите: «У другого списка есть этот номер?»

Чтобы проверить, есть ли в списке номер, наихудший случай - это не значит, что вам нужно проверить каждый элемент в списке, чтобы узнать. Это также n шагов, если второй список может быть примерно таким же большим, как первый.

Составляя их вместе: Просматривая список из n элементов и делая n вещей по каждому предмету.

Дайте мне знать, что вы думаете, что подходит, и после этого я отредактирую этот ответ.

Для второго фрагмента кода разделите его.

Прежде всего, вы создаете HashSet, используя все элементы ввода. Сколько времени требуется, чтобы вставить один элемент в HashSet? Если вы вставляете n элементов, умножьте время на одну вставку на n.

Второе, что происходит, это новый ArrayList. Проверка API, чтобы быть уверенным в том, что он делает: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)

Это создает ArrayList, используя все элементы коллекции HashSet. Сколько времени требуется, чтобы вставить в список массивов? Умножьте это на количество элементов (n), чтобы получить ответ.

Поскольку это происходит как отдельные шаги, это разные вещи. Какая бы ни была более высокая сложность большого О, является доминирующей, и вы можете игнорировать другую. Если они оба имеют одинаковую сложность с большими O, это ответ; вы можете его игнорировать, так как O (2n) имеет ту же сложность, что и O (n); константы (например, 2x) теряются.

+0

Если вы собираетесь спускать вниз, пожалуйста, дайте мне знать, почему я могу улучшить его? –

+0

Вы удалили что-то неправильно во время редактирования, поэтому я втягиваю -1. – laune