Вопрос

в КАДЕМЛИЯ Протокол Идентификаторы узла - 160 битов. Узлы хранятся в ведрах, ведро 0 хранит все узлы, которые имеют одинаковый идентификатор, что и этот узел, за исключением самого последнего бита, Bucket 1 сохраняет все узлы, которые имеют одинаковый идентификатор, что и этот узел, за исключением последних 2 битов, кроме последних 2 битов на всех 160 ведрах.

Какой самый быстрый способ найти, какое ведро я должен вставить новый узел?

У меня есть мои ведра, просто хранящиеся в массиве и нуждаются в методе, как так:

Bucket[] buckets; //array with 160 items

public Bucket GetBucket(Int160 myId, Int160 otherId)
{
    //some stuff goes here
}

Очевидный подход состоит в том, чтобы работать от самого значительного бита, по сравнению с битом, пока не найду разницы, я надеюсь, что есть лучший подход, базирующийся вокруг умных битов.

Практическое примечание: My INT160 хранится в байтовом массиве с 20 элементами, решениями, которые хорошо работают с таким структурой.

Это было полезно?

Решение

Вы были бы готовы рассмотреть массив из 5 32-битных целых чисел? (или 3 64-битных целых числа)? Работая со всеми словами может дать вам лучшую производительность, чем работать с байтами, но метод должен работать в любом случае.

XOR соответствующие слова двух идентификаторов узлов, начиная с наиболее значимых. Если результат XOR равен нулю, перейдите к следующему наиболее значимым слову.

В противном случае найдите наиболее значимый бит, который установлен в этом результате XOR с использованием Метод постоянного времени от восторга хакера.. Отказ Этот алгоритм приводит к 32 (64), если настроен наиболее значимый бит, а 1, если настроен наименее значимый бит, и так далее. Этот индекс в сочетании с индексом текущего слова будет скажет вам, какой бит другой.

Другие советы

Для начала вы могли бы сравнить байт Byte-Byte (или Word-ky-Word), и когда вы найдете разницу в этом байте (или Word) для первой биты разницы.

Мне кажется смутно неправдоподобным для того, что добавление узла на массив ведерков будет настолько быстрым, что это имеет значение, делаете ли вы умный бит-Twidling, чтобы найти первую бит разницы в байте (или Word), или просто взлом в петле до char_bit (или что-то). Возможно, хотя.

Кроме того, если IDS по сути случайно с равномерным распределением, то вы найдете разницу в первых 8 битах около 255/256 от времени. Если все, что вы заботитесь о том, это поведение среднего случая, не в худшем случае, то просто сделайте глупую вещь: очень маловероятно, что ваш цикл будет работать долго.

Для справки, однако, первая разница между числами x и y первый бит набор в x ^ y. Отказ Если вы программировали в GNU C, __builtin_clz Может быть твой друг. Или, возможно, __builtin_ctz, Я вроде сонный ...

Твой код выглядит как Java, хотя, поэтому я думаю, что Bitfoo вы ищете, это Целочисленный журнал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top