2009-10-29 3 views
0

Может ли кто-нибудь сказать мне сложность алгоритма ниже? Этот алгоритм должен выполнять следующие операции:порядок сложности алгоритма в нотации O

Учитывая несортированный массив целых чисел с повторяющимися числами, напишите наиболее эффективный код для печати уникальных значений в массиве.

Я также хотел бы знать Каковы некоторые плюсы и минусы в контексте использования аппаратной реализации этого

private static void IsArrayDuplicated(int[] a) 
    { 
     int size = a.Length; 
     BitArray b = new BitArray(a.Max()+1); 
     for (int i = 0; i < size; i++) 
     { 
      b.Set(a[i], true); 
     } 

     for (int i = 0; i < b.Count; i++) 
     { 
      if (b.Get(i)) 
      { 

       System.Console.WriteLine(i.ToString()); 

      } 
     } 
     Console.ReadLine(); 
    } 
+2

Это пахнет домашней работой. – whaley

+3

O (N). Но этого недостаточно. Вы должны понимать * почему *.Кстати, ваш алгоритм может быть очень интересным дискуссионным вопросом с вашим лектором, когда вы знаете, почему, потому что его можно защитить, хотя его трудно представить себе значение n, где фиксированная стоимость становится доступной. – Will

ответ

5

У вас есть две for петли, один длиной a.Length и один длины (если я правильно поняли код) a.Max() + 1. Таким образом, ваша алгоритмическая сложность O(a.Length + a.Max())

+0

Забавно, как правильный ответ не получил заслуженных авансов. :-( – phoku

0

У вас есть две петли, каждая из которых основана на размере n. Я согласен с whaley, но это должно дать вам хорошее начало.

4

Сложность алгоритма линейная.

Поиск максимума линейный. Установка битов является линейной.

Однако алгоритм также неверен, , если только ваши целые числа не могут быть положительными.

У этого также есть проблема с большими целыми числами - вы действительно хотите выделить MAX_INT/8 байт памяти?

Название, кстати, заставляет меня съеживаться. IsXYZ() всегда должен возвращать bool.

Я бы сказал, попробуйте еще раз.

Исправление - правильный ответ pavpanchekha.

0

Сложность вашего алгоритма O (N), но алгоритм не является правильным.

  1. Если числа отрицательны это не будет работать
  2. В случае большого числа вы будете иметь проблемы с памятью

я предлагаю вам использовать этот подход:

private static void IsArrayDuplicated(int[] a) { 
    int size = a.length; 
    Set<Integer> b = new HashSet<Integer>(); 
    for (int i = 0; i < size; i++) { 
     b.add(a[i]); 
    } 

    Integer[] T = b.toArray(new Integer[0]); 

    for (int i = 0; i < T.length; i++) { 
     System.out.println(T[i]); 
    } 

} 
1

O (n), вероятно, возможно только для конечной/малой области целых чисел. Все думают о bucketsort. Подход Hashmap в основном не O (n), а O (n^2), поскольку вставка худшего случая в хэшмап есть O (n) и NOT constant.

Как насчет сортировки списка в O (n log (n)), а затем через него и печати дубликатов значений. В результате получается O (n log (n)), что, вероятно, является подлинной сложностью проблемы.

1
HashSet<int> mySet = new HashSet<int>(new int[] {-1, 0, -2, 2, 10, 2, 10}); 
foreach(var item in mySet) 
{ 
    console.WriteLine(item); 
} 
// HashSet guarantee unique values without exception 

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

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