The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Хеш с нечеткими условиями для perl, !*! Solotony, 07-Июл-05, 10:30  [смотреть все]
существует-ли по perl модуль, реализующий хеш с условием вида "<=" ?

Есть пары ключ=>значение, ключи дискретны (time), но значения определены только для некоторых ключей. При задании произвольного ключа Kx надо найти существующеее значение для максимального ключа, не превышающего заданный.

  • Хеш с нечеткими условиями для perl, !*! ihor, 12:11 , 07-Июл-05 (1)
    можно использовать qdbm (http://qdbm.sourceforge.net/), Villa API, но придётся подправить C-й код (добавить свою функцию сравнения) и скомпилировать модуль заново.


    • Хеш с нечеткими условиями для perl, !*! Solotony, 12:34 , 07-Июл-05 (2)
      а такое решение, не повлияет на остальные вещи, использующие gdbm?
      • Хеш с нечеткими условиями для perl, !*! ihor, 12:52 , 07-Июл-05 (3)
        я имею в виду именно QDBM, а не GDBM, то есть на GDBM это никак не повлияет. что же касается QDBM, то при использовании API Villa, конструктор базы принимает в качестве аргумента указатель на функцию сравнения (в С), или одну из предопределённых констант (Perl). то есть мы в С описываем свою новую функцию сравнения, и указатель на неё експортируем в Perl в виде ещё одной константы (переменной). т.о. мы ничего не нарушаем из того, что было до нас, просто добавляем что-то новое, что будет использоваться только по желанию и только для конкретных баз.

        (
        http://qdbm.sourceforge.net/plapidoc/Villa.pm.html
        http://qdbm.sourceforge.net/spex.html#villaapi
        )

        • Хеш с нечеткими условиями для perl, !*! Solotony, 13:05 , 07-Июл-05 (4)
          спасибо, а gdbm я действительно тормознул.

          • Хеш с нечеткими условиями для perl, !*! ihor, 14:31 , 07-Июл-05 (5)
            хотя, я подумал, это тоже не выход. в функции сравнения проверку на <= реализовать можно, но для поиска max, придётся перебирать всех, кто <=. а если это большое число, то получим полный перебор всего.
            применить hash-функции также не удасться (а значит и классичеккие хеши), понятно почему. т.ч. выход один -- имитировать хеши через массивы + сортировка + бинарный поиск (к примеру).


            • Хеш с нечеткими условиями для perl, !*! ihor, 14:56 , 07-Июл-05 (6)
              фактически, тебе нужно строить b-tree и потом реализовывать спуск до нужного  узла. QDBM его и реализует, но к сожалению, нужной функции нет, т.ч. можно реализовать бинарный поиск по базе на C и експортироавать эту функцию в Perl.
            • Хеш с нечеткими условиями для perl, !*! Solotony, 15:07 , 07-Июл-05 (7)
              да, в том-то и дело, что не хочется делать полный перебор. так ведь хэш и так строится строится по принципу бинарного дерева? или не бинарного?
              • Хеш с нечеткими условиями для perl, !*! ihor, 16:42 , 07-Июл-05 (8)
                нет, классические хеши (если точнее, ассоциативные массивы) строятся с использованием т.н. хеш-функций. идея такая: придумываем какую-нибудь функцию, кот. по нашим предполагаемым ключам будет строить числовые значения (хеши). разным ключам может соотв. один и тот же хеш. главное, чтобы таких ключей было не очень много. + важно, чтобы область значений такой функция была конечной.
                напр. любые ключи отображаются в диапазон 0..N.
                теперь на С хеш можно пострить таким образом:
                заводим массив размером в N+1 елемент
                елементы массива - указатели на списки
                теперь, если нам нужно вставить (ключ, значение), мы по ключу вычисляем хеш (допустим это будет x).
                идём в елемент с номером х, последовательно проходим по списку и смотрим есть ли в списке такой ключ. если нет - вставляем новый елемент в конец списка.

                поэтому важно, чтобы хеш функция давала хорошее распределение, чтобы кол.-во элементов в каждом списке было как можно меньше, и поиск ключа в списке занимал бы "константное" время.

  • Хеш с нечеткими условиями для perl, !*! Аноним, 06:53 , 08-Июл-05 (9)



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру