Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с алгоритмом 
:(
    Опции темы
knut
Дата 28.2.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



добрый день

помогите с алгоритмом.

задача.

есть два неупорядоченных массива a и b. 
b отличается тем что в нем отсутствует 2 элемента, (т.е их удалили) 
наиболее оптимальным методом найти эти два элемента.

Пример.
1 4 5 2 6 7 3 10
1 5 6 7 2 3 

10 и 4


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Lipetsk
  Дата 28.2.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



отсортируйте один из массивов
берите по очереди элементы из второго массива и ищите их в первом, если нашли, то вычеркивайте из первого

PM   Вверх
Akina
Дата 28.2.2013, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Какие имеются ограничения на элементы массива?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zmaster555
Дата 28.2.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.1.2013

Репутация: нет
Всего: нет



Думаю довольно неплохим тут будет следующий алгоритм.

Для начала сортируем оба массива (по возрастанию, например). Если в неполный массив подставить 2 отсутствующих элемента, то он будет полностью идентичен первому массиву, соответственно эти два недостающих элемента и в отсортированных массивах должны будут находится на одних и тех же местах. Следовательно, просто остается сравнить каждый элемент первого массива с соответствующим элементом второго (неполного) массива. Пример:

1 4 5 2 6 7 3 10 {1 массив}
1 5 6 7 2 3        {2 массив}

1 2 3 4 5 6 7 10 {1 отсортированный массив}
1 2 3 5 6 7        {2 отсортированный массив}

Пусть полный массив это A, неполный - B, дальше смотрим:

A[1]=B[1], все норм, совпадают
A[2]=B[2], тоже
A[3]=B[3], тоже
A[4]!=B[4], а вот тут нет, элемент неполного массива не совпадает => отсутствует элемент, равный A[4], т.е. четверка. И тут либо вставляем этот элемент в неполный массив и продолжаем, либо убираем этот элемент из полного массива.

Ну и так далее. Извини за много букв, люблю все разжевывать до мелочей.

Это сообщение отредактировал(а) Zmaster555 - 28.2.2013, 16:02
PM MAIL   Вверх
knut
Дата 28.2.2013, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



сложность алгоритма o(n) + m  и можно использовать дополнительную память только для одной переменной


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Akina
Дата 28.2.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



knut, повторяю
Цитата(Akina @  28.2.2013,  16:25 Найти цитируемый пост)
Какие имеются ограничения на элементы массива? 

Могут они быть отрицательными? дробными? тысячезначными? повторяющимися? 




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
knut
Дата 28.2.2013, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Akina, натуральные положительные числа ,нет они не повторяются.
спасибо.


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Akina
Дата 28.2.2013, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



knut, ты способен отвечать на вопрос ПОЛНО? Есть ли верхняя граница? или, просмотрев весь список, можно в конце обнаружить число из миллиона цифр?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
knut
Дата 28.2.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Akina
Цитата

Есть ли верхняя граница? или, просмотрев весь список, можно в конце обнаружить число из миллиона цифр?


Цитата

Есть ли верхняя граница?

нет

Цитата

или, просмотрев весь список, можно в конце обнаружить число из миллиона цифр
  
число не одно а два. да можно обнаружить в конце.


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Akina
Дата 28.2.2013, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Ок.

Первый проход. Находим самое большое число.
Второй проход. Зная диапазон, XORим числа обоих списков общим потоком, используя память для одной переменной. Результат равен XORу двух отсутствующих во втором списке чисел.
Как действовать дальше, не имея доп. памяти, пока не придумал.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Pavia
Дата 28.2.2013, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



knut
Цитата(knut @  28.2.2013,  16:58 Найти цитируемый пост)
Есть ли верхняя граница?нет

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

Добавлено через 1 минуту и 42 секунды
Akina
По моему автор путает цифры с числами.
PM MAIL   Вверх
Akina
Дата 28.2.2013, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Pavia @  28.2.2013,  18:56 Найти цитируемый пост)
По моему автор путает цифры с числами. 

На такие мелочи я не стал обращать внимание... в его словах всё ещё несколько нестыковок и нелепиц...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
volatile
Дата 1.3.2013, 00:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



за O(n) проходов можно решить c 2-мя переменными (достаточной точности.)

S = 0;
P = 1;

for (i = 0; i < size; ++ i)
{  S += first [i] - second [i];
   P *= first [i] / second [i];
}

пробегаем весь массив.
В результате имеет сумму и произведение двух оставшихся неизвестных чисел. 

решить  элементарное уравнение

x + y = S
x * y = P

труда, думаю уже не составит. smile 

PM MAIL   Вверх
Lipetsk
Дата 1.3.2013, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



volatile, классная идея
только не хватает пары if, т.к. размеры массивов разные
PM   Вверх
Akina
Дата 1.3.2013, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



volatile, теоретически алгоритм верен. Практически же... Если на стадии суммирования-вычитания можно принять меры к тому, чтобы не возникло вычислительных проблем (например, в зависимости от текущей суммы и следующих членов рядов - либо вычитать, либо прибавлять), то вот с умножением и делением будет большая проблема - потеря точности... даже принимая специальные меры, можно за счёт неточного представления промежуточного произведения получить неверный результат.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 1.3.2013, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Вот только что промоделировал на случайном массиве из 64к элементов в пределах unsigned long.
Если вычисления проводить в double - ну более-менее, хотя один расчёт из двадцати дал ошибку на единицу (102201990, расчётно 102201989).
Счас попробую в single (он, как и ulong, 4 байта)... боюсь, будет грустно.

Это сообщение отредактировал(а) Akina - 1.3.2013, 09:11


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 1.3.2013, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Один расчёт из 10 дал ошибку - 17123904, расчётно 17123903...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 1.3.2013, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



думаю, лучше считать вместо произведения сумму квадратов - ошибки меньше будут


--------------------
qqq
PM WWW   Вверх
Akina
Дата 1.3.2013, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(maxim1000 @  1.3.2013,  12:19 Найти цитируемый пост)
думаю, лучше считать вместо произведения сумму квадратов 

1*1+8*8=4*4+7*7=65
аналогично с кубами 
1*1*1+12*12*12=9*9*9+10*10*10=1729
То же и с остальными степенями... не пойдёть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 1.3.2013, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Akina @  1.3.2013,  11:36 Найти цитируемый пост)
1*1+8*8=4*4+7*7=65
аналогично с кубами 
1*1*1+12*12*12=9*9*9+10*10*10=1729
То же и с остальными степенями... не пойдёть. 

то, что квадраты требуют больше места, чем числа - ожидаемо

просто, если среди чисел нет уж очень большого неравенства (типа, одно огромное, а остальные маленькие), то в случае с квадратами результирующее число будет меньше

понятно, что это уже использует какие-то предположения о числах...


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 1.3.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



о...

если предположить, что в дополнительных переменных у нас достаточно бит для хранения любого числа из массива, то можно найти числа по половинкам:
1. сначала рассматриваем младшую половину бит каждого элемента, считаем для них суммы и суммы квадратов - всё поместится, находим пару младших половинок
2. то же самое для старших - находим пару старших половинок

чтобы понять, какую младшую половинку соединить с како старшей, просто пробуем оба варианта, проверяем, какой подходит


--------------------
qqq
PM WWW   Вверх
volatile
Дата 1.3.2013, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(Akina @  1.3.2013,  08:14 Найти цитируемый пост)
с умножением и делением будет большая проблема - потеря точности... 

Цитата(volatile @  1.3.2013,  00:05 Найти цитируемый пост)
можно решить c 2-мя переменными (достаточной точности.)

а точнее, 
переменная P Должна быть в 2 раза длиннее чем типы массива.
переменная S Должна иметь на 1 бит больше чем типы массива.

Тогда решаецца строго, для любых данных. (при аккуратном программировании).

double не подойдет для 32 разрядов, так как там 56 бит (если не ошибаюсь.) а нужно 64 битов мантисы.
float тем более.

long double в gcc, должен подойти.  long double у M$ не пойдёт.
Ну или делать как предлагает maxim1000, длинную арифметику вручную.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.