yigal_s: (Default)
yigal_s ([personal profile] yigal_s) wrote2007-01-29 06:54 pm
Entry tags:

программизм: вот такая задачка образовалась

Дан массив из N элементнов. Ну, к примеру, integers
Делается копия этого массива, элементы в ней случайно перемешиваются, а 4 элемента просто выкидываются.
Теперь у нас имеется два массива - из N и N-4 элементов.
-----
Требуется - быстро найти значения удаленных четырёх элементов.

Upd: дополнительное условие - не аллоцировать дополнительных массивов.

[identity profile] igorbor.livejournal.com 2007-01-29 05:10 pm (UTC)(link)
А что-нибудь еще про массив известно? уникальные ли в нем числа, в каком диапазоне, то, се? или в самом общем виде?

[identity profile] igorbor.livejournal.com 2007-01-29 11:33 pm (UTC)(link)
Ну, если произвольный, то можно, наверное, сложить для обоих массивов все числа, их квадраты, кубы и четвертые степени. Получится система из четырех уравнений с четырьма неизвестными. Я сходу не помню, как ее решать, но тут уже можно что-нибудь придумать.

А в реальной жизни - сортировать :)

[identity profile] oblomov-jerusal.livejournal.com 2007-01-29 05:14 pm (UTC)(link)
Посчитать суммы двух, массивов, суммы квадратов, суммы кубов и суммы четвертых степеней. Разности дадут суммы удаленных элементов и их степеней. Получится система из четырех уравнений с четырьмя неизвестными. Если ֶa_1...a_4 наши неизвестные, то коэффициенты многочлена (t-a_1)(t-a_2)(t-a_3)(t-a_4) можно выразить через полученные суммы. Четыре корня многочлена и будут нашими неизвестными.

В лоб

[identity profile] dimrub.livejournal.com 2007-01-29 05:24 pm (UTC)(link)
Загоняем значения из меньшего массива в хэш. Затем ищем в этом хэше значения из второго массива. Которые не нашли - те наши. Если с повторениями - та же идея, но клетки хэша содержат также счетчик повторений, который во время второго прохода уменьшается.

Re: В лоб

[identity profile] dimrub.livejournal.com 2007-01-29 07:35 pm (UTC)(link)
Если бы не хватало одного числа, можно было бы сделать ксор всем числам, и получить на выходе недостающее. А так результатом будет ксор этих четырех чисел. Но точно так же мы можем узнать их сумму, произведение и, скажем, сумму квадратов. Дальше решаем систему уравнений, и находим их.

Re: В лоб

[identity profile] igorbor.livejournal.com 2007-01-29 11:30 pm (UTC)(link)
То есть Вы предполагаете, что обьем хеша будет меньше обьема массива? Это, по-моему, в общем случае неверно. А если обьем хеша мал, то цена поиска в нем будет не меньше, чем цена сортировки изначального массива.

Для смеха

[identity profile] profi.livejournal.com 2007-01-29 05:56 pm (UTC)(link)
Я не программист. Да и арифметику подзабыл. :-)

Просто, чтобы проверить себя. Если оба массива упорядочить по одному и тому же закону, а потом вычесть поэлементно. Все ненулевые значения в массиве разности - это удаленные. Да? Нет? Только не бейте сапогами по голове! :-)))))

Re: Для смеха

[identity profile] dimrub.livejournal.com 2007-01-29 06:09 pm (UTC)(link)
Упорядочить - это O(n log n). Что, может быть, и не так уж плохо (в зависимости от специфики вопроса), но по умолчанию в такого рода задачах предполагается оптимальное асимптотическое решение (например - линейное).

Re: Для смеха

[identity profile] profi.livejournal.com 2007-01-29 06:22 pm (UTC)(link)
Да, конечно. Я просто привык к софту типа Ориджин, в качестве пользователя. А вот о том, что там внутри работает - забываю.

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

Re: Для смеха

[identity profile] haraz-bey.livejournal.com 2007-01-29 06:22 pm (UTC)(link)
Оба упорядочить по одному закону и сравнивать (вычитать) почленно. При каждом фолсе (ненулевом значении вычитания) текущий член большего массива заносится в список вычтенных, а счетчик меньшего массива вместо одного накручивает два.

[identity profile] haraz-bey.livejournal.com 2007-01-29 07:13 pm (UTC)(link)
Это да. Я имел в виду, что если сравнивать таким образом, то нужен сдвиг. Можно было бы проверить каждый элемент из первого массива на наличие во втором, но это действительно для двух любых массивов, значит, мы теряем преимущество, заключающееся в дополнительных данных, известных о конкретных массивах. А вот как его использовать - надо еще подумать :)

[identity profile] dr-tambowsky.livejournal.com 2007-01-29 07:51 pm (UTC)(link)
Упорядочивать долго, но если не пользоваться никаким упорядочиванием (или чем-то в данном контексте эквивалентным типа хэш-таблицы, как предлагалось выше), то, казалось бы, время должно быть О(N^2), что всяко ещё хуже. Разве не так?

[identity profile] haraz-bey.livejournal.com 2007-01-29 08:27 pm (UTC)(link)
Разве что математический путь. У нас есть четыре неизвестных, есть их сумма (сумма одного массива минус сумма второго), есть суммы их же степеней. Но не знаю, намного ли это будет быстрее (особенно для программиста).

[identity profile] vladiv.livejournal.com 2007-01-29 08:56 pm (UTC)(link)
Отсортирован ли исходный массив? Если нет, отсортировать бинарной сортировкой. Второй массив (копию) отсортировать в любом случае. Дальше двигаться последовательно по первому массиву (i). сравнивая его с копией (j=i). Несравнение по некоторому индексу (i) означает, что этот элемент, выброшен из второго массива. Нарастить i и продолжать сравнение.
Лучшего алгоритма я пока не вижу, но, возможно, он есть.

[identity profile] occuserpens.livejournal.com 2007-02-10 02:55 pm (UTC)(link)
Отсортировать оба массива на месте и сравнить

[identity profile] occuserpens.livejournal.com 2007-02-11 01:50 am (UTC)(link)
Это единственно разумное программистское решение. Придумывать какие-либо оптимизации этого способа - это теория, которая к практике никакого отношения не имеет.

[identity profile] thornik.livejournal.com 2007-03-29 03:07 pm (UTC)(link)
А вы специально указали "integers", чтобы притянуть задачу к арифметической или вас интересовал алгоритм со, скажем, строками?