Хэш-функция, возвращающая номер интервала
От: RolandD  
Дата: 01.09.10 07:29
Оценка:
Допустим, есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D.

Можно ли сделать хэш-функцию, которая по числу f из D скажет номер интервала за константное время?

Заранее благодарю!
хэш
Re: Хэш-функция, возвращающая номер интервала
От: Pavel Dvorkin Россия  
Дата: 01.09.10 07:37
Оценка:
Здравствуйте, RolandD, Вы писали:

RD>Допустим, есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D.


RD>Можно ли сделать хэш-функцию, которая по числу f из D скажет номер интервала за константное время?


RD>Заранее благодарю!


Если область значений — целые числа и диапазон не слишком велик, то

Создаем массив a[min..max], прописываем a[i] = номер интервала.
Используем теперь f как индекс в этом массиве.
With best regards
Pavel Dvorkin
Re[2]: Хэш-функция, возвращающая номер интервала
От: RolandD  
Дата: 01.09.10 07:50
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Используем теперь f как индекс в этом массиве.


Прошу прощения, забыл сказать — f вещественное число.
Re: Хэш-функция, возвращающая номер интервала
От: ilnar Россия  
Дата: 01.09.10 08:01
Оценка:
Здравствуйте, RolandD, Вы писали:

RD>Допустим, есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D.


RD>Можно ли сделать хэш-функцию, которая по числу f из D скажет номер интервала за константное время?


RD>Заранее благодарю!


если нужен именно хеш, то можно смотреть в сторону фильтра Блума, но он не дает 100% точного ответа, да и в вашем случае вовсе неэффективен
тут проще было бы сделать дерево интервалов и проверять быстрее чем морочиться с подсчетом хеш функций
Re: Хэш-функция, возвращающая номер интервала
От: andy1618 Россия  
Дата: 01.09.10 08:56
Оценка: 2 (1)
Здравствуйте, RolandD, Вы писали:

RD>Допустим, есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D.

RD>Можно ли сделать хэш-функцию, которая по числу f из D скажет номер интервала за константное время?

Насколько я понимаю, задача сводится к поиску числа в отсортированном массиве из вещественных чисел.
При простейшем бинарном поиске сложность будет O(logN), что уже весьма неплохо.

В теории, можно попробовать привести число f к целому числу соответствующей разрядности и маской вырезать
из него наиболее значимые биты (знак, экспоненту и старшую часть мантиссы), на основе этих битов
сделать lookup-табличку, сужающую поиск до 1-2 интервалов в массиве.
Если интервалы будут разумной ширины — должно прокатить.
Re: Хэш-функция, возвращающая номер интервала
От: cvetkov  
Дата: 01.09.10 10:00
Оценка: 3 (1) +1
строим функцию которая имет следующи характеристики

строго возрастает. имеет на границах интервала целые значения совпадающие с номером интервала который начинается на этой границе.

вычисляем значение функции берем целую часть и вот результат.

в качестве такой функции можно взять полином который всегда можно подобрать.

правда бинарный поиск будет наверняка быстрее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[2]: Хэш-функция, возвращающая номер интервала
От: LelicDsp Россия  
Дата: 03.09.10 02:25
Оценка:
PD>Создаем массив a[min..max], прописываем a[i] = номер интервала.
PD>Используем теперь f как индекс в этом массиве.

А если интервал удалить надо?
Re[3]: Хэш-функция, возвращающая номер интервала
От: Pavel Dvorkin Россия  
Дата: 03.09.10 04:43
Оценка:
Здравствуйте, LelicDsp, Вы писали:

LD>А если интервал удалить надо?


>есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D


Если удалить — это станет неверным.
With best regards
Pavel Dvorkin
Re[4]: Хэш-функция, возвращающая номер интервала
От: LelicDsp Россия  
Дата: 03.09.10 05:12
Оценка:
LD>>А если интервал удалить надо?

>>есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D


PD>Если удалить — это станет неверным.

Почему? они же могут перекрываться
Re[5]: Хэш-функция, возвращающая номер интервала
От: Pavel Dvorkin Россия  
Дата: 03.09.10 06:09
Оценка:
Здравствуйте, LelicDsp, Вы писали:


LD>Почему? они же могут перекрываться


Если они перекрываются, то как можно вообще вернуть номер интервала ? Их много может быть, номеров.
With best regards
Pavel Dvorkin
Re: Хэш-функция, возвращающая номер интервала
От: wildwind Россия  
Дата: 03.09.10 07:53
Оценка:
Здравствуйте, RolandD, Вы писали:

RD>Допустим, есть N интервалов разной длины, полностью закрывающую некую допустимую область значений D.

RD>Можно ли сделать хэш-функцию, которая по числу f из D скажет номер интервала за константное время?

Разбиваем D на M равных интервалов. Делаем хэш-таблицу на M слотов. Пусть Dmin, Dmax — нижня и верхняя границы D. Хэш функцией будет
H(f) = [(f - Dmin) / M]

Заносим в таблицу интервалы; понятно что большие попадут в несколько слотов, будет оверхед по памяти. M подбираем, исходя из допустимого количества коллизий. Можно даже анализировать конкретный набор интервалов перед построением, если на это есть время.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.