Nano Hash - криптовалюты, майнинг, программирование

Покрытие 2D-пространства 1D-последовательностью

Я хочу сделать структуру, хранящую значение с двумя ключами - "x" и "y". Я думал, что буду использовать std::map>. Но я думаю, что было бы лучше использовать только один std::map и объединить оба ключа в один ключ (я буду называть его «p»).

Поэтому мне нужна функция p->(x,y) и функция (x,y)->p. И 'x', и 'y' являются целочисленными типами с допустимыми отрицательными значениями.

Я думаю, что это должно быть возможно, но я удивлен, что не нашел тонны статей об этом в Интернете.

У меня есть некоторые идеи о том, как это сделать, но все кажется слишком сложным. Не могли бы вы дать мне несколько советов о том, как это сделать или какие темы почитать об этой проблематике?

Пример возможного сопоставления (но мне нужна математическая форма чего-то подобного): http://i.stack.imgur.com/UbVaM.png

Спасибо за любые советы :-)

09.09.2014

  • Каков диапазон (x, y) ? 09.09.2014
  • X и Y — это просто некоторые целые типы со знаком. Например, «инт». 09.09.2014
  • Почему бы не использовать некоторую сетку (как если бы все значения были положительными с правильным смещением)? 10.09.2014
  • Хм, верно. Я думал о бесконечном количестве значений. Но на самом деле, когда количество значений ограничено, я могу использовать: p=sqrt(max_value(key_type))*x+y ; х=p%max_value(key_type)) ; y=этаж(p/max_value(key_type))) 10.09.2014
  • Если все, что вам действительно нужно, это хеш-функция для пары чисел, то функция хэш-кода Джошуа Блоха для Java имеет хорошую родословную stackoverflow.com/questions/18473071/ У него есть преимущество в том, что он быстрый, что вам нужно для хеш-функции, но это только в одну сторону. 10.09.2014

Ответы:


1

Я бы просто использовал std::map<std::tuple<int,int>, int>, например, где ваш tuple равен (x,y), а значение равно z. В противном случае будет сложно сохранить отображение 1-к-1 p(x,y) на z.

09.09.2014
  • Это выглядит проще, чем мой подход. Но это не работает с std::unordered_map. Есть идеи, как заставить его работать с unordered_map? Я мог бы сделать хеш-функцию для std::tuple‹int,int›, но боюсь, что у меня недостаточно навыков, чтобы быть уверенным, что я не вызову проблем с производительностью. Конечно, я все еще мог бы использовать std::map. 09.09.2014

  • 2

    Как насчет использования союза?

    union p_t {
        p_t(int64_t c) : k(c) {}
        p_t(int32_t a, int32_t b) : x(a), y(b) {}
        int64_t k;
        struct { int32_t x, y; };
    };
    
    std::map<decltype(p_t::k), int> m1;
    std::unordered_map<decltype(p_t::k), int> m2;
    p_t p = p_t(rand(), rand());
    m1[p.k] = rand();
    m2[p.k] = rand();
    

    Живой пример: http://ideone.com/jebyG6

    09.09.2014

    3

    Вы можете попробовать использовать функции, подобные тем, которые используются для демонстрации того, что дробей столько же, сколько целых чисел. Это дает уникальное целое число для каждой дроби и уникальную дробь для каждого положительного целого числа. Это работает так же хорошо для координат x, y. Две функции p->(x,y) и (x,y)->p немного сложны, но их можно написать. Вы можете адаптировать эту идею, используя какую-то спиралевидную форму.

    присвоение целых чисел дробям из википедии Rational_number.

    Изображение из https://commons.wikimedia.org/wiki/File:Diagonal_argument.svg< /а>

    09.09.2014
  • Я пробовал это. Это возможно и не так сложно. Удивительно, но когда я пытаюсь обобщить его как для положительных, так и для отрицательных значений, он становится довольно сложным. 10.09.2014
  • Да, возможно, это не самый простой путь найти формулу. Есть несколько простых способов перейти от целых положительных чисел к полному набору целых чисел. Вы можете сопоставить нечетные числа с отрицательными и четные числа с положительными, так что 0 -> 0, 1 -> -1, 2 -> 1, 3 -> -2, 4 -> 2. Объедините это с приведенным выше, и вы можете получить отображать целые числа в пары целых чисел. 10.09.2014
  • Хорошо, я попробую. Спасибо :-) 10.09.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..