【问题标题】:Covering 2D space with 1D sequence用一维序列覆盖二维空间
【发布时间】:2014-09-10 05:58:16
【问题描述】:

我想用两个键——'x'和'y'来创建结构存储值。我想我会使用 std::map>。但我认为最好只使用一个 std::map 并将两个键组合成一个键(我将其称为“p”)。

所以我需要函数 p->(x,y) 和函数 (x,y)->p。 'x' 和 'y' 都是允许负值的整数类型。

我认为这应该是可能的,但我很惊讶我没有在互联网上找到大量关于它的文章。

我对如何做到这一点有一些想法,但一切似乎都太复杂了。能否请您给我一些建议,告诉我如何去做或阅读哪些主题来解决这个问题?

可能的映射示例(但我需要类似的数学形式):http://i.stack.imgur.com/UbVaM.png

感谢您的任何建议:-)

【问题讨论】:

  • (x, y)的范围是多少?
  • X 和 Y 只是一些有符号整数类型。例如'int'。
  • 为什么不使用一些网格(好像所有值都是正数且偏移量正确)?
  • 嗯,对。我在考虑无限数量的值。但实际上,当只有有限数量的值时,我可以使用: p=sqrt(max_value(key_type))*x+y ; x=p%max_value(key_type)) ; y=floor(p/max_value(key_type)))
  • 如果你真正想要的是一个数字对的哈希函数,那么 Joshua Bloch 的 Java 哈希码函数具有良好的血统stackoverflow.com/questions/18473071/… 它的优点是速度快,这正是你想要的哈希函数但这只是一种方式。

标签: c++ math mapping space


【解决方案1】:

例如,我将只使用std::map<std::tuple<int,int>, int>,其中您的tuple(x,y),值为z。否则很难保持p(x,y)z 的一对一映射。

【讨论】:

  • 这看起来比我的方法更容易。但这不适用于 std::unordered_map。任何想法如何使它与 unordered_map 一起工作?我可以为 std::tuple 创建散列函数,但恐怕我不够熟练,无法确保不会导致任何性能问题。当然,我仍然可以使用 std::map。
【解决方案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

【讨论】:

    【解决方案3】:

    您可以尝试使用类似于用于显示分数与整数一样多的函数。这为每个分数提供一个唯一的整数,为每个正整数提供一个唯一的分数。它同样适用于 x、y 坐标。 p->(x,y) 和 (x,y)->p 这两个函数有点复杂但可以编写。您可以使用某种螺旋形状来调整这个想法。

    图片来自https://commons.wikimedia.org/wiki/File:Diagonal_argument.svg

    【讨论】:

    • 我试过了。这是可能的,并不难。令人惊讶的是,当我尝试将它概括为正值和负值时,它变得相当复杂。
    • 是的,它可能不是找到公式的最简单途径。从正整数到整组整数有几种简单的方法。您可以将奇数映射为负数,将偶数映射为正数,因此 0 -> 0, 1 -> -1, 2 -> 1, 3 -> -2, 4 -> 2。将其与上述结合,您可以获得从整数映射到整数对。
    • 好的,我试试。谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多