Здравствуйте, Kleo, Вы писали:
K>Есть массив M с типом int32, в массиве N элементов. N – очень много. K>Есть комп. с неограниченным объемом памяти. Память можно использовать любым образом. K>Вопрос: K>Циклом в один проход найти 2 и более повторяющихся элементов.
Ну если памяти неограниченно, заведи массив из 2^32 флагов. Вернее, тебе потребуется не битовый флаг (да/нет), а счетчик на 0-1-2. Т.е., по два бита на элемент. В общей сложности хватит 512 мегабайт, не так уж и много по нонешним временам. Но можешь и по байту отвести для простоты, тогда понадобится 2 гигабайта.
Дальше, идешь по своему массиву целых, для каждого очередного числа смотришь на евонный счетчик. Если там 0, кладешь туда 1. Если 1, выводишь число, как найденное повторное, и кладешь туда 2. Если уже 2, ничего уже больше не делаешь.
А вообще, своими мозгами надо учиться думать, а не искать помощи в форуме.
Здравствуйте, Kleo, Вы писали:
K>Помогите написать алгоритм: K>Есть массив M с типом int32, в массиве N элементов. N – очень много. K>Есть комп. с неограниченным объемом памяти. Память можно использовать любым образом. K>Вопрос: K>Циклом в один проход найти 2 и более повторяющихся элементов.
Практически без выделения памяти можно сделать:
arr = [7, 2, 8, 4, 3, 3, 0, 2, 1]
arr_size = len(arr)
for i in range(arr_size):
x = arr[i] % arr_size
arr[x] = arr[x] + arr_size
if arr[x] >= arr_size*2:
print(x)
Помогите написать алгоритм:
Есть массив M с типом int32, в массиве N элементов. N – очень много.
Есть комп. с неограниченным объемом памяти. Память можно использовать любым образом.
Вопрос:
Циклом в один проход найти 2 и более повторяющихся элементов.
K>Вопрос: K>Циклом в один проход найти 2 и более повторяющихся элементов.
Ну и заводи второй массив в 2 гига со счетчиками. Может set заюзать, памяти меньше время поиска индекса счетчика чуть больше.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Kleo, Вы писали:
K>>Есть массив M с типом int32, в массиве N элементов. N – очень много. K>>Есть комп. с неограниченным объемом памяти. Память можно использовать любым образом. K>>Вопрос: K>>Циклом в один проход найти 2 и более повторяющихся элементов.
Pzz>Ну если памяти неограниченно, заведи массив из 2^32 флагов. Вернее, тебе потребуется не битовый флаг (да/нет), а счетчик на 0-1-2. Т.е., по два бита на элемент. В общей сложности хватит 512 мегабайт, не так уж и много по нонешним временам. Но можешь и по байту отвести для простоты, тогда понадобится 2 гигабайта.
Pzz>Дальше, идешь по своему массиву целых, для каждого очередного числа смотришь на евонный счетчик. Если там 0, кладешь туда 1. Если 1, выводишь число, как найденное повторное, и кладешь туда 2. Если уже 2, ничего уже больше не делаешь.
Pzz>А вообще, своими мозгами надо учиться думать, а не искать помощи в форуме.
Спасибо
Здравствуйте, Vzhyk2, Вы писали:
K>>Циклом в один проход найти 2 и более повторяющихся элементов. V>Ну и заводи второй массив в 2 гига со счетчиками. Может set заюзать, памяти меньше время поиска индекса счетчика чуть больше.
у set логарифмическая сложность, если ты про плюсовый set, как мне показалось. undordered_set — линейный
M>у set логарифмическая сложность, если ты про плюсовый set, как мне показалось. undordered_set — линейный
Да пофиг, ты можешь искать или линейно или по дереву (тут будет логарифм).