Я бы хотел предварительно вычислить массив значений некоторой унарной функции f
.
Я знаю, что мне понадобятся только значения для f(x)
, где x
имеет вид a*b
, где оба значения a
и b
являются целыми числами в диапазоне 0..N
.
Очевидный оптимизированный по времени выбор - просто создать массив размером N*N
и просто предварительно рассчитать только те элементы, которые я собираюсь прочитать позже. Для f(a*b)
я бы просто проверил и установил tab[a*b]
. Это самый быстрый из возможных методов, однако он займет много места, так как в этом массиве много индексов (начиная с N+1
), которые никогда не будут затронуты.
Другое решение - создать простую древовидную карту ... но это сильно замедляет сам поиск очень , вводя множество ветвей. Нет.
Интересно - есть ли решение сделать такой массив менее разреженным и меньшим, но все же быстрым O (1) без ветвления при поиске?
редактировать
Я могу услышать много комментариев о хэш-карте ... Я перейду к тесту, как он ведет себя (Я ожидаю значительного падения производительности по сравнению с обычным поиском из-за ветвления; меньше, чем в деревьях, но все же. .. посмотрим, прав ли я!) .
Я хотел бы подчеркнуть: я бы в основном оценил аналитическое решение , в котором бы использовался какой-то умный способ (?), Чтобы воспользоваться тем фактом, что используются только индексы "продукта". Я чувствую, что этот факт может быть использован для получения лучшего результата, чем обычная функция хэш-карты, но я сам вне идей.
редактировать
Следуя вашим советам, я попробовал std::unordered_map
из gcc 4.5. Это было немного медленнее, чем простой поиск в массиве, но на самом деле намного быстрее, чем основанный на дереве std::map
- в конечном счете, я в порядке с этим решением. Теперь я понимаю, почему невозможно сделать то, что я изначально хотел; спасибо за объяснения!
Я просто не уверен, действительно ли хеш-карта экономит память! :) Как описал @Keith Randall, я не могу получить объем памяти ниже N*N/4
и подход треугольной матрицы описанный @Sjoerd дает мне N*N/2
. Я думаю, что для хэш-карты вполне возможно использовать больше N*N/2
пространства, если размер элемента небольшой (зависит от накладных расходов контейнера) - что сделало бы самый быстрый подход и наиболее эффективным с точки зрения памяти! Я постараюсь проверить это.
Хотел бы я принять 2 ответа ...