Сап двач. Есть массив. В нем N+1 чисел. Все числа принимают значения от 1 до N. Нужно указать, какой элемент в массиве повторяется. Повторений может быть сколько угодно.
Нужно это сделать за линейное время и константу памяти
Можно сделать за один проход с выделением памяти под ещё один такой же массив. Итерируешь исходный массив, во второй массив кладешь 1 по индексу значения этого элемента. Если там уже есть 1 - значит повтор
>>153852574 >>153852628 Дурацкий двач. Ну так что, уёбок? Чем тебе развернуть массив на максимальное число не константно? Хэш-функция F: x->x. Это же не метод цепочек какой-нибудь.
>>153851859 (OP) >Все числа принимают значения от 1 до N Суммируешь массив, затем вычитаешь из него сумму чисел от 1 до N (формула n*(n-1)/2), получаешь искомый ответ.
>>153852771 Это как, блядь? У тебя по условию может повторяться только одно число (одно - 1). Или ты хочешь сказать, что одно число может повторяться несколько раз?
Вообще вангую что у задачи нет решения, тут раньше был такой анон, который создавал подобные треды с нерешаемой задачкой, пока наконец кто-то не накормил его хуями с пруфами что решить ее невозможно с теми ограничениями памяти и времени что он указывал.
>>153852783 Где он прав, блядь? Ксор поможет только если в массиве все числа имеют пару, кроме одного искомого. Тогда ксор уберёт пары и останется результат. У опа задача совершенно противоположная.
>>153851859 (OP) Квиксорт с тремя партишнами. = O(n) Проходимся по массиву и проверяем єлемент с предидущим = O(n) 2O(n) = O(n) Правда костанта памяти не війдет, так как квиксори O(n)
>>153852689 Поясни механику решения. Я ее не совсем могу раздуплить. Мы пробегаемся от 1 до N, берем элемент массива, стоящего по этому номеру, затем берем элемент массива, стоящего по номеру предыдущего элемента и умножаем на -1, а затем проверяем, что если элемент больше нуля - то он повторяется. Почему оно работает?
>>153853291 Здесь нету никакой логики. Это как олимпиадные задачки. Где нужно найти хакерское решение из предоставляемых данных. Ок, есть всякие разделяй-охуевай, динамическое программирование, метод ветвей и границ, бектракинг, рекурсия, гридди-алгоритмы, битовая магия, однопроходные алгоритмы. Тут нет логики. Ты сам должен её придумать, опираясь на свои знания и опыт в построении алгоритмов.
>>153853291 Смотри, если бы не было ограничения на память, то задача решалась бы так. Есть массив чисел от 0 до N. Мы выделяем массив размером N и заполняем его нулями. Далее итерируем по исходному массиву и для каждого встреченного числа m мы увеличиваем счётчик во втором массиве по индексу m на единицу. Та ячейка массива, где значение больше единицы, соответствует числу, которое повторялось. Поскольку у опа есть ограничение на память, мы можем использовать исходный массив для хранения счётчика (вернее, его кастрированной формы - видели число чётное количество раз - знак плюс, нечётное - минус). Поскольку нас интересуют только значения 1 (не повторяется) и 2 (повторяется как минимум два раза), этого достаточно.
>>153851859 (OP) Берем переменную-аккумулятор равную нулю. Пробегаемся по массиву и ксоким аккумулятор с индексом элемента и со значением по этому индексу.
>Нужно указать, какой элемент в массиве повторяется. А вообще вы похоже неправильную задачу решаете. Нужно указать элемент, а не значение. То есть ответом должны быть индексы.
>>153857003 >Возьмем массив [1, 1, 1] Так ты бери который имеет смысл по условию. n = 3, {1,2,2} 1+2+2 = 5 3(4)/2 = 6 6-5 = 1 1+5 = 6 6/2 = 3 Ответ: третий элемент. ОЧЕВИДНО ЖЕ
>>153857250 В условии сказано что количество повторений может быть любым. Из этого следует что числа не обязаны принимать каждое значение, они только МОГУТ.
>>153857548 >>> a = [0,1,2] >>> for i in a: ... a.pop(i) ... 0 Traceback (most recent call last): File "<console>", line 2, in <module> IndexError: pop index out of range
>>153857548 >https://ideone.com/dsYRDh Ты про эту хуйню? За такой код в продакшене тебя отпиздят после работы. Код должен быть читабельным, а не макачьими плясками. Уволен нахуй, уёбок.
>>153858044 Но ведь если ты не можешь прочитать простенький код, то дебил - это ты. Зачем вообще ты сидишь в треде по алгоритмам? Пиши на пыхе что-нибудь, запихивай данные в базу. На это ты сгодишься.
>>153851859 (OP) n = rand(1,100); a = generate_rand_array(1,n); for i 1 to n+1 do { if (a > n) { z = a - n; } else { z = a; } if (a[z] > n) { echo i . 'пиймав на вила'; } else {a[z] = a[z] + n} } не прогонял. z - твоя константа, время линейное
>>153860600 n = rand(1,100); a = generate_rand_array(1,n); for i 1 to n+1 do { if (a > n) { z = a - n; } else { z = a; } if (a[z] > n) { echo i . 'пиймав на вила'; } else {a[z] = a[z] + n} } быстрофикс
>>153860698 сука йобаная вакаба не ест скобочки с i
n = rand(1,100); a = generate_rand_array(1,n); for p = 1 to n+1 do { if (a[ p ] > n) { z = a[ p ] - n; } else { z = a[ p ]; } if (a[ z ] > n) { echo i . 'пиймав на вила'; } else {a[ z ] = a[ z ] + n} }
>>153851859 (OP) Не знаю ОП тут ли ты. Решается хэш таблицей. Хэш таблица это такая штука... короч, в шарпе есть хэш таблица и при добавлении в нее элемента, она (функция Add) выдает тру если элемент в таблице уже был. Считаешь Тру перебором значений первичного массива. Радуешься жизни.
Циклически проходишь по массиву, каждый непосещенный элемент a ставишь на место a[a], элемент с его места переставляешь так же. Когда очередное попадает в ячейку, где стоит такое же число, как и должно быть, ты нашёл повтор (одно число стоит на месте, другое ты переместил). Линейное время работы (одна операция с каждым элементом), две переменные (указатель на элемент массива и временная переменная).
>>153867558 Ну, вот если бы оно работало для произвольных чисел а не для [1..n], вот тогда это хотя бы как-то можно было назвать. Охуеть, блядь, алгоритм.
>>153867708 ТИМЛИД ВРЫВАЕТСЯ В ПОМЕЩЕНИЕ @ СЫЧЁВ БЛЯДЬ СРОЧНО У НАС ПРОЕКТ НЕ ЗАКРЫТ ПИШИ ЕБАНЫЙ МОДУЛЬ @ КИДАЕТ ТЗ НА СТОЛ, ЗАТЯГИВАЕТСЯ ВЕЙПОМ, ХЛОПАЕТ ДВЕРЬЮ @ ВЕЧЕРОМ ВВАЛИВАЕТСЯ В ОФИС, ПРОСИТ ПОКАЗАТЬ, ЧТО СДЕЛАЛ ЗА ДЕНЬ @ А НУ НОРМ НО ЧОТ МОГЛО БЫТЬ ЛУЧШЕ, ТЫ НЕ МОГ СДЕЛАТЬ ЧТОБ ПОД ЛЮБЫЕ ВХОДНЫЕ РАБОТАЛО А НЕ ТОЛЬКО КАК В ТЗ? @ ПРЕМИЮ ТВОЮ ВЫПИШУ НА СЕБЯ
>>153867171 лел. конечно собъется когда вдруг на месте i сгенерится число i. >>153851859 (OP) создаешь зануленный массив длинной N+1 проходишь по оригинальному массиву, i во втором массиве сравниваешь с нулем. если да - меняешь на единичку, если нет - каунтер повышаешь на единичку.
>>153872414 Единственно что нужно добавить. Что после сравнения и перемещения нужно снова проверить перемещенный с того места элемент и если его i не совпадает - переместить(т.е. запустить рекурсию по элементу до тех пор пока либо не переберется весь массив (тогда значение в ячейкие совпадет с порядковым номером) либо пока не найдём равное значение. Тогда из рекурсии выходим и идём к следующему элементу
>>153851859 (OP) Если в массиве повторяется только одно число, а все остальные от 1 до Н, то элементарно - считаем за константу арифметическую последовательность от 1 до Н, затем за линейное время считаем сумму всех элементов и за константу вычитаем одно из другого. Это ответ.
сверяешь первый со вторым и до конца массива - учитываешь результат (строишь алгоритм так чтоб при совпадении не попало в повторное сравнение). сверяешь второй с третьим и до конца массива (строишь алгоритм так чтоб при совпадении не попало в повторное сравнение). и так далее.
>>153876773 У любого алгоритма (обычно имеется ввиду однообразно повторяющиеся, циклические штуки) есть сложность. Например, если обработка 10 элементов (цифр, например) требует 100 циклов вычислений, то алгоритм имеет степень сложности nn - квадратичный. "Линейная" сложность - это когда на n элементов нужно n+a или, в худшем случае, na при a<n циклов.
Константа памяти - конкретно здесь значит хуйню, но в общем случае имеется ввиду, что памяти для решения выделяется конечное количество, причём логически "подходящее" под условие задачи, чтобы для итерации 10 целочисленных значений твоей проге не требовалось 10 Гб памяти.
>>153877366 >конкретно здесь значит хуйню Конкретно здесь это означает, что нельзя создать контейнер размера N, в котором отмечать, встречалось такое число или нет.
>>153851859 (OP) Достаточно попробовать выстроить массив по порядку. Если a != i, то меняем местами элементы a и a[a], если они равны, то печатаем результат и выходим
Нужно это сделать за линейное время и константу памяти