Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: [С++] поиск дубля в массиве - в чем ошибка?  (Прочитано 33065 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 28-09-2009 13:51 » 

Привет!

Объясните, пожалуйста, в чем ошибка.

Есть массив целых чисел, принимающих значения  от 0 до M.
И только один элемент повторяется.
Надо найти этот элемент.

Вот решение:

Код:
#include <iostream>
using namespace std;

const int N=15;  

typedef unsigned __int64 MyInt64;

MyInt64 iarray[N]={43, 34, 958, 124, 1234, 82, 623, 73, 9518, 10500, 4389, 515, 9661, 890, 515};


MyInt64 Foo(MyInt64 *m, const int size)
{
for( int i = 0; i < size - 1; i++ )
for( int j= i + 1; j < size; j++ ) if( m[i] == m[j] ) return m[i];
return 0;
}


« Последнее редактирование: 30-09-2009 06:14 от The Nameless One » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 28-09-2009 14:06 » 

и где ошибка? В чем выражается?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 28-09-2009 14:10 » 

всё нормально, только два исправления:

1)  for( int i = 0; i+1 < size; i++ )
2) прототип функции

Код:
bool Foo(MyInt64 *m, const int size,MyInt64& retVal)
{
   for( int i = 0; i+1 < size; i++ )
   {
      for( int j= i + 1; j < size; j++ )
      {
         if( m[i] == m[j] )
         {
              retVal=m[i];
              return true;
         }
      }
   }
   return false;
}
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-09-2009 14:29 » 

Алексей1153++, спасибо!


Sla, я просто успел поправить (size - 1), до этого был просто size.
Мне сказали, что у меня ошибка в алгоритме. Я подумал, что кроме выхода за пределы должно быть ещё что-то.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 28-09-2009 14:38 » 

The Nameless One, в таких случаях, чтоб не путаться, делается всё просто: поскольку j подставляется в индекс массива, а j у нас == i+1 , то нужно индекс и проверить на выход за границу:

i+1<size
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 28-09-2009 14:53 » 

Хорошо, учту) Спасибо!

Можно вдогонку вопрос, слегка не в тему?

Как работодатель отнесётся к предложению поработать бесплатно в качестве программиста С++ первое время в целях получения опыта?
т.е. на полную ставку бы не взяли из-за отсутсвия опыта, а так - не слишко ли это тупо предложить?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 28-09-2009 15:13 » 

не избалуй работодателя только Ага И обязательно требуй 2-разовое питание + сончас.
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 28-09-2009 15:23 » 

Вся понятно)) Не избалую)
Просто как иначе получить опыт в своих краях - не знаю)
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-09-2009 06:12 » 

Пообщался. Им нужны только опытные разработчики.

И все равно сказали, что в алгоритме ошибка - они даже детали реализации не смотрели :0


Может в этом дело: поиск повторяющегося элемента должен происходит за время O(N).

N - число элементов.
« Последнее редактирование: 29-09-2009 06:14 от The Nameless One » Записан
sss
Специалист

ru
Offline Offline

« Ответ #9 : 30-09-2009 03:22 » 

Блин, голову сломал. Минимально чего могу придумать O( N log(N)). кто-нибудь знает как сделать O(N) ?
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 30-09-2009 03:37 » 

у меня приходит в голову только - составлять список уже встреченных элементов (ключ - сам элемент). Когда в очередной раз будет попытка добавить уже существующий в списке элемент, поиск завершён - будет даже меньше, чем ОДИН проход массива , только затраты на работу со списком остаются, правда
Записан

wildCroissant
Гость
« Ответ #11 : 30-09-2009 05:23 » 

2The Nameless One,

честно говоря твой "шеф" прав, у тебя симплифицированная задача, такой в чистом виде в природе не встретишь, и в ТЗ стоит найти ЭЛЕМЕНТ, а ты возвращаешь его ЗНАЧЕНИЕ что не есть хорошо. Алгорит поиска у тебя правильный и самый быстрый и простой, все остальное будет медленнее.
На самом деле тебя проверяют не на умение програмировать, а на умение понимать ТЗ так чтоб шефу не пришлось тебе его обьяснять.

Удачи!
Записан
sss
Специалист

ru
Offline Offline

« Ответ #12 : 30-09-2009 05:54 » 

wildCroissant, такое ощущение что это Вы дали то ТЗ... Интересно - что значит элемент массива?
Индекс ? Или понятие индекс элемента имеет право на существование?

Алексей1153++,  N^2 будет в худшем случае с дополнительным списком... Я тут думал об алгоритме быстрой сортировки... Причем тоже N^2 будет в худшем случае. Вот! Если дополнительный список упорядоченное б-дерево - тогда log(N). Чёрт, дайте кто-нибудь решение за O(N)!

« Последнее редактирование: 30-09-2009 05:59 от sss » Записан

while (8==8)
wildCroissant
Гость
« Ответ #13 : 30-09-2009 06:10 » 



решение за O(N)-> такого решения не было и не будет! Если увлекаетесь алгоритмами то читайте книжки с таковыми (cookbooks)
« Последнее редактирование: 30-09-2009 06:15 от Sla » Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 30-09-2009 06:13 » 

Удачи!

Спасибо)
Записан
wildCroissant
Гость
« Ответ #15 : 30-09-2009 08:59 » 

алгоритмами не увлекаемся. Мы ими зарабатываем ))) А увлекаемся девушками

ну прям мушкетеры, один за всех и все за одного, одному пишешь, другие за него отвечают........
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 30-09-2009 09:03 » 

еще что нибудь в сторону флуда -  все нахрен удалю Жаль
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 30-09-2009 09:08 » 

решение за O(N)-> такого решения не было и не будет!
Смотря что считать решением за O(N). Например, если система управления памятью позволяет считать, что выделение обнулённой памяти под вспомогательный массив выполняется за O(C), то алгоритм O(N) существует. Один из вариантов предложил Алексей1153++, также есть и другие алгоритмы (например, "обмен A[i] и A[A[j]] до первой коллизии").
« Последнее редактирование: 30-09-2009 09:10 от Вад » Записан
wildCroissant
Гость
« Ответ #18 : 30-09-2009 09:44 » 

Смотря что считать решением за O(N). Например, если система управления памятью позволяет считать, что выделение обнулённой памяти под вспомогательный массив выполняется за O(C), то алгоритм O(N) существует. Один из вариантов предложил Алексей1153++, также есть и другие алгоритмы (например, "обмен A[i] и A[A[j]] до первой коллизии").

и перфоманц в ms будет O(N)?

.....имелось ввиду машинные циклы........

2Вад, хотя ты прав, что подразумевать, все под конкретный случай смотреть надо
« Последнее редактирование: 30-09-2009 09:53 от Джон » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 30-09-2009 10:02 » 

Ну, по крайней мере, если мы говорим о тестовом задании, то задание вполне могло подразумевать просто поиск подобных решений. Которые в реальной жизни едва ли могут дать 100% O(n) для всех случаев (но может реально дать их какой-то частной ситуации, типа N~=M). Но которые, во всяком случае, показывают, что соискатель способен предложить что-то нетривиальное, в сравнении с исходным O(n^2).
Записан
wildCroissant
Гость
« Ответ #20 : 30-09-2009 10:45 » 

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

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 30-09-2009 11:11 » 

По-моему, сложность исходного решения представляет в худшем случае сумму Sum{1, n}(n-i) = n^2 - Sum{1,n}(i) = n^2 - n*(n+1)/2 ~=n(n-1)/2. O(n^2), разве нет? Средний случай, на глаз, будет в 4 раза меньше (Sum{1,n/2}[(n-i)/2]). Даже если не в 4 - всё равно, в не зависящее от n число раз.

Я не говорю, что "нетривиальное" решение означает "мы вот тут используем вставку в map, и плевать на время вставки". Речь идёт исключительно о решениях за один-два прохода по массиву, где любые вспомогательные действия типа вставки в список имеют сложность O(1). Все затраты, выходящие за O(n), находятся за рамками основных манипуляций с массивом, на этапе инициализации.
« Последнее редактирование: 30-09-2009 11:14 от Вад » Записан
wildCroissant
Гость
« Ответ #22 : 30-09-2009 11:36 » 

в общем точно говоря число итераций в исходном варианте равно n(n-1)/2.......
опять таки если разрешается производить инкапсуляцию, то напишем класс, скинем ему поинтер от масива и все решается в одну строчку, сам класс запаковать в длл предоставить как необходимое приложение:))))
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 30-09-2009 20:12 » 

Так почему меня не взяли, как считаете?
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 30-09-2009 20:12 » 

Ещё ,там речь шла об удалёнке, она мне очень нужна, как воздух. И не взяли  Жаль
Просто выпустил свой шанс из рук. Второго такого шанса можно годами ждать.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #25 : 30-09-2009 21:32 » 

Тут вопрос. Какой именно максимальное значение может принимать M, в условиях задания
Цитата
Есть массив целых чисел, принимающих значения  от 0 до M.
Если где то 65536, то скорее всего задание можно решить за один проход массива Улыбаюсь.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #26 : 30-09-2009 21:53 » 

Ну собственно и код
Код:
#include <iostream>
#include <string.h>
using namespace std;

const int N=16;  
const int M=10500;



int array[N]={43, 34, 958, 124, 1234, 82, 623, 73, 9518, 10500, 4389, 515, 9661, 890, 515,74};


int Foo(int *m, const int size)
{
   int res=-1;
   if ((m != NULL) && (size >0))
   {
      char matr[M+1];
      memset(matr, 0, M+1);
      int beg=0;
      while ((beg<size) && (matr[m[beg]] == 0))
      {
         matr[m[beg]]=1;
         beg++;
      }
      if (beg<size) res=m[beg];
   }
   return res;
}

int main()
{
   cout << Foo(array, N) << endl;
   return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 30-09-2009 22:07 » 

Так почему меня не взяли, как считаете?
Ну, зависит от того, что ты в итоге показал. Вполне возможно, что у нанимателей есть какие-то свои идеи насчёт того, какие именно способности должен демонстрировать человек, выполняя такое задание. А может, просто решили не рисковать. Сейчас, всё-таки, кризис, некоторые поджимаются, и с наймом стажёров, насколько я наблюдаю, не всё радужно. Ума не приложу, куда сейчас идут работать свежеиспечённые выпускники моего ВУЗа.
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 30-09-2009 22:57 » 

Finch, класс! Фиг бы я до такого допер! Спасибо.
Единственно, о максимальном значении M ничего не сказано.

Вад, мда, печально. А что за ВУЗ?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #29 : 01-10-2009 02:50 » new

Finch, прикольно... Вот и решение O(N), как я и просил.

P.S.: А вот если надо вернуть индексы совпадающих элементов ? (так, из вредности)
Записан

while (8==8)
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines