На днях встретился с задачей. Пусть имеется массив целых чисел и известно, что одно число в этом массиве дублируется. Т.е. все числа в массиве разные, но одно число встречается в нем дважды. Необходимо найти это число самым оптимальным способом. Для решения используется платформа .NET Framework.
( Читать дальше...Свернуть )
На ум первым приходит следующее решение, которое по сути является полным перебором:
Немного поразмыслив можно придти к такому решению:
Т.е. использовать предварительную сортировку с последующим поиском дублирующихся элементов.
Так какой же метод оптимальнее с точки зрения использования памяти и с точки зрения процессорного времени? На первый взгляд кажется, что оптимальнее будет первый вариант, т.к. в нем используется только поиск, без сортировки. Но если хорошенько подумать и вспомнить университетский курс "Структуры и алгоритмы обработки данных", то будет понятно, что трудоемкость первого метода равна трудоемкости пузырьковой сортировки, т.е. O(n2).
Если мы используем предварительную сортировку методом
то фактически запускаем встроенный в .NET Framework оптимизированный алгоритм Быстрой сортировки, трудоемкость которого O (n log n). После этого фактически останется только пройти линейно по массиву и найти дублирующийся элемент. Т.е. итоговая трудоемкость второго метода составит O (n log n + n).
Таким образом, мы предположили, что более оптимальным будет второй метод поиска дублирующегося элемента. Проверим это на реальном примере:
Т.е. заполним массив элементами, при этом, один элемент посередине добавим дважды. Полученные результаты впечатляют:
( Читать дальше...Свернуть )
На ум первым приходит следующее решение, которое по сути является полным перебором:
private static int FindDupl(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
int tmp = arr[i];
for (int j = i+1; j < arr.Length; j++)
{
if (arr[j] == tmp) return tmp;
}
}
throw new ArgumentException("Array does not have duplicates");
}
{
for (int i = 0; i < arr.Length; i++)
{
int tmp = arr[i];
for (int j = i+1; j < arr.Length; j++)
{
if (arr[j] == tmp) return tmp;
}
}
throw new ArgumentException("Array does not have duplicates");
}
Немного поразмыслив можно придти к такому решению:
private static int FindDupl2(int[] arr)
{
Array.Sort(arr);
for (int i = 0; i < arr.Length -1; i++ )
{
if (arr[i] == arr[i + 1]) return arr[i];
}
throw new ArgumentException("Array does not have duplicates");
}
Т.е. использовать предварительную сортировку с последующим поиском дублирующихся элементов.
Так какой же метод оптимальнее с точки зрения использования памяти и с точки зрения процессорного времени? На первый взгляд кажется, что оптимальнее будет первый вариант, т.к. в нем используется только поиск, без сортировки. Но если хорошенько подумать и вспомнить университетский курс "Структуры и алгоритмы обработки данных", то будет понятно, что трудоемкость первого метода равна трудоемкости пузырьковой сортировки, т.е. O(n2).
Если мы используем предварительную сортировку методом
Array.Sort(arr);
то фактически запускаем встроенный в .NET Framework оптимизированный алгоритм Быстрой сортировки, трудоемкость которого O (n log n). После этого фактически останется только пройти линейно по массиву и найти дублирующийся элемент. Т.е. итоговая трудоемкость второго метода составит O (n log n + n).
Таким образом, мы предположили, что более оптимальным будет второй метод поиска дублирующегося элемента. Проверим это на реальном примере:
List<int> lArr = new List<int>();
for (int i = 100000; i > 0; i-- )
{
lArr.Add(i);
}
lArr.Add(50000);
Stopwatch sWatch = new Stopwatch();
sWatch.Start();
int d = FindDupl(lArr.ToArray());
sWatch.Stop();
Console.WriteLine("FindDupl (milliseconds): " + sWatch.ElapsedMilliseconds);
Console.WriteLine("Dupl: " + d);
sWatch = new Stopwatch();
sWatch.Start();
d = FindDupl2(lArr.ToArray());
sWatch.Stop();
Console.WriteLine("FindDupl2 (milliseconds): " + sWatch.ElapsedMilliseconds);
Console.WriteLine("Dupl: " + d);
Т.е. заполним массив элементами, при этом, один элемент посередине добавим дважды. Полученные результаты впечатляют:
FindDupl (milliseconds): 28691
Dupl: 50000
FindDupl2 (milliseconds): 5
Dupl: 50000
Dupl: 50000
FindDupl2 (milliseconds): 5
Dupl: 50000
Обалдеть, нашел свою тачку на Yandex Панормае улиц))
http://maps.yandex.ru/-/CFrRIsD
http://maps.yandex.ru/-/CFrRIsD
Слабоумные кастраты ненавидят Фирму и продукцию Фирмы этого Человека, потому что люто завидуют. Так всегда было. Слабые и бедные завидуют богатому и успешному. Целые мусорные народы в драных регионах завидуют пай-народам и чистеньким регионам. Они называют эту зависть патриотизмом. Пока мусорные народы размазывают злые слезы по длинным соплям - они останутся мусорными! Они делают то же, что и ты - дают себе великие обещания
процветать уже завтра! И это вместо того чтобы научиться мыть руки после туалета! Так вот, этот фантастический человек так много сделал для биомассы - что его богатство - это самое малое, чем человечество могло бы его отблагодарить. Поэтому я решил сделать Биллу дополнительный подарок и отдельно сказать ему спасибо. Спасибо тебе, Билл!

Почему Билл не вставляет в свои системы атомные бомбы, портящие его произведения или форматирующие твой хард при несанкционированном доступе? Помилуйте, ограниченное воровство просто выгодно Биллу, поскольку создает культуру Microsoft, которая заставляет тратить на нее деньги тех, у кого их раньше не было, и он воровал, а теперь есть и он покупает. Сделайте абсолютную защиту в программах Майкрософт, и от Майкрософт останется только эхо - рванут на Линукс, да всегда есть куда рвануть!
процветать уже завтра! И это вместо того чтобы научиться мыть руки после туалета! Так вот, этот фантастический человек так много сделал для биомассы - что его богатство - это самое малое, чем человечество могло бы его отблагодарить. Поэтому я решил сделать Биллу дополнительный подарок и отдельно сказать ему спасибо. Спасибо тебе, Билл!
Почему Билл не вставляет в свои системы атомные бомбы, портящие его произведения или форматирующие твой хард при несанкционированном доступе? Помилуйте, ограниченное воровство просто выгодно Биллу, поскольку создает культуру Microsoft, которая заставляет тратить на нее деньги тех, у кого их раньше не было, и он воровал, а теперь есть и он покупает. Сделайте абсолютную защиту в программах Майкрософт, и от Майкрософт останется только эхо - рванут на Линукс, да всегда есть куда рвануть!
На днях пришла рассылка от Микрософт. Предлагают отправить резюме в Microsoft Research и, возможно, меня возьмут это подразделение на летнюю стажировку (работа в одном из исследовательских центров Microsoft: в Рэдмонде, Кремниевой долине или Кэмбридже). Так сказать отбирают талантливых студентов. В частности один российский студент прошлым летом проходил стажировку в Редмонде.

Вот ссылка на его блог
В этой статье я решил описать программы Микрософт, в которых можно попытать свои силы студентам.

Вот ссылка на его блог
В этой статье я решил описать программы Микрософт, в которых можно попытать свои силы студентам.
По долгу своей работы приходится использовать всякие защищенные ключевые носители. А недавно компания Актив сделала новый продукт со страшно брутальным названием "КриптоПро Рутокен CSP".

Тем, кто занимается информационной безопасностью, эти слова должны быть знакомы. В общем, не в этом суть, а суть в том, что там на халяву раздают КриптоПро CSP (примерная стоимость 1000 руб.) и Рутокен ЭЦП (примерная стоимость 1000 руб.). Комплект можно заказать по почте или забрать в офисе (г. Москва). Так что не теряйте времени даром, я уже один комплект для себя получил;)
Подробности на офф. сайте Рутокен
Тем, кто занимается информационной безопасностью, эти слова должны быть знакомы. В общем, не в этом суть, а суть в том, что там на халяву раздают КриптоПро CSP (примерная стоимость 1000 руб.) и Рутокен ЭЦП (примерная стоимость 1000 руб.). Комплект можно заказать по почте или забрать в офисе (г. Москва). Так что не теряйте времени даром, я уже один комплект для себя получил;)
Подробности на офф. сайте Рутокен
Сегодня улыбнула одна статья про программистов в журнале "Хакер", на мой взгляд написана правильно (рекомендую прочитать), программисты действительно захватят мир бу-га-га *злорадные раскаты смеха*
( Читать дальше...Свернуть )
( Читать дальше...Свернуть )
Комментарии
Это как если пекарь печет булки и получает с каждой булки 10р.
Потом он создает некое устройство, позволяющие без особого труда сделать такие же булки и…