Чтобы добавить к ответу Web_Designer, Если вы хотите, чтобы ваш div был шириной, отличной от 100%, вам понадобится другой обертывающий div, на котором нужно установить ширину: Недавно я использовал что-то похожее на трюк с изображениями Эллиота, чтобы позволить мне использовать мультимедийные запросы CSS для обслуживания другого файла логотипа в зависимости от разрешения устройства, но все же масштабировать пропорционально, как это делал div.ar-outer{
width: 60%; /* container; whatever width you want */
margin: 0 auto; /* centered if you like */
}
div.ar {
width:100%; /* 100% of width of container */
padding-bottom: 75%; /* 75% of width of container */
position:relative;
}
div.ar-inner {
position: absolute;
top: 0; bottom: 0; left: 0; right: 0;
}
(Я устанавливаю логотип в качестве фонового изображения на прозрачный .png с правильным соотношением сторон). Но решение Web_Designer избавит меня от HTTP-запроса.
Некоторые языки (C, Java 5) позволяют Вам получать доступ к двоичному значению своих плаваний. Таким образом, можно извлечь первые биты N мантиссы (игнорирующий последние несколько битов, которые доставляют неприятности во время, выдерживают сравнение), и вычислите хеш от этого.
Я преобразовал бы значения плавающие в целые числа как это:
unsigned int IntValue = (int)(floatValue * MULT) + MULT;
, таким образом, Вы получаете некоторые первые цифры и затем используете
const MULT1 = (MULT << 1) + 1;
unsigned long long HashValue = (xIntValue * MULT1 * MULT1) + (yIntValue * MULT1) + zIntValue;
как значение хэш-функции (использующий (MULT * 2) + 1, потому что IntValues будет между 0 и MULT * 2 содержащих).
необходимая память будет в зависимости от multiplicator MULT. Например, использование 32 Вы получите хеш-таблицу с помощью 64 * 64 * 64 * (Размер объекта хеша) = 262144 * (Размер объекта хеша) байты.
Можно ли уточнить проблему?
Предположение, что Вы используете hashmap для отображения некоторых дополнительных данных на определенные векторы, Вы могли просто использовать XOR двоичных представлений компонентов (если это возможно на Вашем предпочтительном языке). Тогда используйте столько LSBs (для сокращения коллизий), сколько Вам нужно для карты хеша. Это, конечно, имело бы свойство, что два равных (по сравнению с плавающей точкой) векторы не могли бы иметь того же хеша (например, плавающая точка IEEE 0 равняется-0, но у них есть другой знаковый бит).
Однако, если Вы - планирование использования векторов, которые являются результатами различных вычислений, чтобы сделать поиск хеша, Вы принимаетесь до возможности не наличия соответствия хэш-кодам из-за погрешностей округления, и необходимо, вероятно, использовать что-то еще так или иначе.
Я думаю, что Вы ищете, не непосредственно возможно. Одно важное свойство равенства - то, что это является переходным. (т.е. Если == b и b == c, то == c). С мерой по расстоянию, тем не менее, Вы действительно не хотите это свойство. Пример:
Берут единственное плавание (для простоты). Предположим, что мы хотим хешировать каждое плавание так, чтобы плавания меньше, чем 1e-3 далеко были тем же значением. Теперь, предположите, что мы добавляем к этим плавающим значениям хэш-таблицы 1000 весь 1e-4 независимо. Любое граничение с 2 значениями должно хешировать к тому же плаванию, так как они ближе, чем 1e-3. Однако из-за транзитивности, соседи тех значений должны также иметь к тому же значению и их соседям и так далее. В результате все 1 000 значений, включая пар дальше, чем 1e-3 независимо, хешировали бы к тому же целому числу. Если необходимо было потянуть эти точки на изображении:
A B C D E F G H ... Y Z
предположим все разрывы являются < 1e-3 независимо, но A и Z> 1e-3 независимо (для не масштабирования!). Это не может быть удовлетворено, потому что, если хеш (A) == хеш (B) и хеш (B) == хеш (C) и так далее для всех пар, (так как они - < 1e-3 независимо), чем хеш (A) должен == хеш (Z).
Один возможный вариант состоит в том, чтобы определить регионы Вашего векторного пространства, в котором все векторы хешировали бы к тому же значению (т.е. вокруг них прежде, чем хешировать их), но Вы могли все еще получить 2 вектора на краях их соответствующих пробелов, которые являются близко друг к другу, но хеш к другому значению. Вы могли обойти это путем поиска всех соседних пробелов вектор. (т.е. в 1-d случае выше, Вы были бы вокруг всех векторов к ближайшему несколько 1e-3, и затем ищите соседей, таким образом, 5.3e-3 искал бы 5e-3, 4e-3 и 6-e3. В более многомерных случаях необходимо было бы искать соседей во всех размерах.)
не знаю, насколько быстро это может быть, но поскольку у вас есть единичные векторы, все они лежат на поверхности сферы. преобразовать в http://en.wikipedia.org/wiki/Spherical_coordinate_system . затем используйте фи и тета, чтобы выбрать ведро. ложных срабатываний не будет. вы можете поискать в соседних ячейках ложные негативы.
Нужна ли вам быстрая хеш-таблица или подойдет древовидная структура?
Мне кажется, что было бы проще найти совпадающие числа с плавающей запятой в дереве поиска некоторых Сортировать. B-дерево минимизирует количество промахов в кэше, предполагая, что вы выбрали правильный размер узла. Это должно сделать это довольно быстро на практике.