Вера
Вера

Как такое считать быстро?

Есть массив, нужно уметь быстро (logn) отвечать на запросы "Сколько чисел в массиве делятся на x". Думал в сторону разряженных таблиц, но никаких результатов. Может кто-нибудь знает идею алгоритма или ссылку где это объясняется.

В массиве чисел 10^6 сами числа 10^9 Так что разложение на множители каждого не сработает.

ЕА
Елена Арсеньева Арсеньева

Структуры, которые позволяют отсекать от множества ненужные элементы, а потом проверять оставшиеся, не подходят:
Предположим, что вам нужно найти чётные числа в массиве, который состоит ТОЛЬКО из чётных. Структура честно выдаст вам весь массив, а потом вам придётся проверять опять же весь.
То есть верхняя граница - O(n) проверок.
Я допускаю, что можно сделать среднюю оценку O(logN), например словари пар: (делитель->битовый массив) . Но считаю, что ответ всё же не в том, чтобы перебирать элементы, когда нужно найти КОЛИЧЕСТВО.

Тут нужно мозговать какую-то альтернативную систему хранения:
Например: число 20 с индексом i хранить как
2: i, i - отсортированный список делителей 2 с кратностью
5: i - аналогично про 5
Это позволит сократить поиск количества при разбиении x на множители.
Нужно будет оперировать списками-множествами.
Это завязано на длину списков, что сопоставимо с logN (даже меньше получится, так как N тут = корень (10^9), а не 10^6)

СС
Сергей Садовский

log(n) - похоже на дерево. Можно рассортировать их по двоичному дереву, каждый уровень которого представляет делимость на простое число: первый узел - делимость на 2, второй (в обеих ветвях) - на 3, третий (во всех ветвях) - на 5 и т. д. Понадобится O(n) доп. памяти, правда, зато скорость перебора - таки log(n).

АП
Алексей Плотников

log(n)?
Тогда вопрос только в том, как его ЗАРАНЕЕ отсортировать/какие доп структуры данных заранее создать. И, раз речь зашла о 10^6 и 10^9, то требования на доп структуры по памяти лучше тоже ограничить O(10^6). Так?

Поэтому разложение на множители заранее не отметайте. В каком-то виде оно может понадобиться, лишь бы требования соблюсти

ДМ
Даниял Маккаев

ммм, может не так понимаю, но если числа целые O(n):

std::size_t count = 0;
for (std::size_t i = 0;i < arraysize(input); ++i) {
if (input[i] % x == 0) {
++count;
}
}

можно цикл распараллелить? [чепуха, читать ответы ниже]

На
Наталья

а как долго у вас считается? если быстрее, вставляйте асм+MMX команды проца

Похожие вопросы
Как вы считаете что такое ПЕРДЫНЯ?)
как разделить (разрезать )видео пополам.?? быстро и просто? ? быстро и просто?
Как считать в делфи?
что быстрее? Как вы считаете, какой из телефонов"бегает"по Интернету быстрее: Айфон или Самсунг Гэлекси?
Как привыкнуть быстро считать в уме?
Люди каким считаете сайт для коталога вещей? что бы быстрый был, движок там, язык какой, подскажите! Спасибо.
Какая птица считается самой быстрой в мире?
Кто быстрее в таких гонках?
Как быстро считать устно без калькулятора?
Будет ли считаться вложенностью?