На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Организация кэша
    Проблема вот в чем:
    Имеется довольно долго вычисляемая функция f(x), x - дворд, функцию эту считать надо очень-очень много раз в секунду, причем довольно часто для одних и тех же значений x, не подскажут ли знающие люди хороший способ организации кэша значений f(x) для ускорения вычислений?

    Имеется следующий алгоритм(прочитал в какой-то доке по архиваторам): сочиняем простую хэш-функцию h(x), возвращающую значение в интервале от 0 до H и массив C[0..H] содержащий в каждом элементе пару (x, y = f(x)) причем h(C[i].x) == i

    Т.е. когда надо посчитать значение f(x) находим элемент C[h(x)] и проверяем, действительно ли C[h(x)].x == x, если да - соответственно берем значение из кэша C[h(x)].y, если нет, имеем типа кэш-промах, считаем f(x) напрямую.
    Так вот я думаю может получше способы есть, а? Заранее спасибо.
      Примерно так и надо делать. ПРИМЕРНО.
      То есть никто не заставляет сразу заполнять весь массив. При промахе заполняй нужную ячейку вычисленным значением. Ещё можно при промахе проделывать некоторую фиксированную операцию над хэшем и перепроверять ячейку по новому адресу. Сколько раз это делать -- зависит от отношения скоростей вычисления хэша и вычисления собственно функции.
      Способ эффективнее вряд ли возможен. Можно, конечно, завести массив на 2^34 байт, но сомнительно, что у тебя 16Гб памяти  ;)
      Да, и если можно как-то разделить аргументы по предполагаемой частоте использования -- так и вообще замечательно. Но не всегда возможно  :(
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0.0647 ]   [ 15 queries used ]   [ Generated: 8.10.26, 00:52 GMT ]