以一种独特且确定性的方式将两个整数映射到一个

2024-01-08

想象两个正整数 A 和 B。我想将这两个组合成一个整数 C。

不能有其他整数 D 和 E 组合成 C。 因此将它们与加法运算符结合起来是行不通的。例如 30 + 10 = 40 = 40 + 0 = 39 + 1 连接也不起作用。例如“31”+“2”= 312 =“3”+“12”

这种组合操作也应该是确定性的(使用相同的输入总是产生相同的结果)and应该总是在整数的正数或负数上产生一个整数。


康托配对功能 http://en.wikipedia.org/wiki/Cantor_pairing_function考虑到它的简单、快速和空间效率,它确实是最好的之一,但 Wolfram 上发布了更好的东西作者:Matthew Szudzik,这里 http://szudzik.com/ElegantPairing.pdf。康托配对函数(相对)的局限性是编码结果的范围并不总是保持在2N位整数(如果输入是两个)N位整数。也就是说,如果我的输入是两个16位整数范围为0 to 2^16 -1,那么有2^16 * (2^16 -1)可能的输入组合,因此显而易见鸽巢原理 http://en.wikipedia.org/wiki/Pigeonhole_principle,我们至少需要一个大小的输出2^16 * (2^16 -1),等于2^32 - 2^16,或者换句话说,一张地图32理想情况下位数应该是可行的。这在编程世界中可能具有不小的实际重要性。

康托配对功能:

(a + b) * (a + b + 1) / 2 + a; where a, b >= 0

两个最大 16 位整数(65535、65535)的映射将为 8589803520,如您所见,它无法适合 32 位。

Enter 苏兹克函数:

a >= b ? a * a + a + b : a + b * b;  where a, b >= 0

(65535, 65535) 的映射现在将为 4294967295,如您所见,这是一个 32 位(0 到 2^32 -1)整数。这就是该解决方案的理想之处,它只是利用该空间中的每个点,因此没有什么可以提高空间效率。


现在考虑到我们通常在语言/框架中处理不同大小的数字的签名实现,让我们考虑一下signed 16位整数范围为-(2^15) to 2^15 -1(稍后我们将看到如何将输出扩展到有符号范围)。自从a and b必须是积极的,它们的范围是0 to 2^15 - 1.

康托配对功能:

两个最大 16 位有符号整数 (32767, 32767) 的映射将为 2147418112,这刚好低于有符号 32 位整数的最大值。

Now 苏兹克函数:

(32767, 32767) => 1073741823,小得多..

让我们考虑负整数。这超出了我知道的最初问题,但只是为了帮助未来的访客而详细阐述。

康托配对功能:

A = a >= 0 ? 2 * a : -2 * a - 1;
B = b >= 0 ? 2 * b : -2 * b - 1;
(A + B) * (A + B + 1) / 2 + A;

(-32768, -32768) => 8589803520,即 Int64。 16 位输入的 64 位输出可能是如此不可原谅!

苏兹克函数:

A = a >= 0 ? 2 * a : -2 * a - 1;
B = b >= 0 ? 2 * b : -2 * b - 1;
A >= B ? A * A + A + B : A + B * B;

(-32768, -32768) => 4294967295,对于无符号范围是 32 位,对于有符号范围是 64 位,但仍然更好。

现在,输出始终为正。在签名的世界里,如果我们可以将一半的输出转移到负轴,会更节省空间。对于 Szudzik's,你可以这样做:

A = a >= 0 ? 2 * a : -2 * a - 1;
B = b >= 0 ? 2 * b : -2 * b - 1;
C = (A >= B ? A * A + A + B : A + B * B) / 2;
a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1;

(-32768, 32767) => -2147483648

(32767, -32768) => -2147450880

(0, 0) => 0 

(32767, 32767) => 2147418112

(-32768, -32768) => 2147483647

我做什么:施加重量后2到输入并遍历该函数,然后我将输出除以二,并将其中一些乘以负轴-1.

查看结果,对于有符号范围内的任何输入16位编号,输出位于有符号的限制内32位整数,这很酷。我不确定如何以相同的方式实现康托配对功能,但没有尝试太多,因为它效率不高。此外,康托配对函数涉及更多计算,意味着其速度也较慢.

这是一个 C# 实现。

public static long PerfectlyHashThem(int a, int b)
{
    var A = (ulong)(a >= 0 ? 2 * (long)a : -2 * (long)a - 1);
    var B = (ulong)(b >= 0 ? 2 * (long)b : -2 * (long)b - 1);
    var C = (long)((A >= B ? A * A + A + B : A + B * B) / 2);
    return a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1;
}

public static int PerfectlyHashThem(short a, short b)
{
    var A = (uint)(a >= 0 ? 2 * a : -2 * a - 1);
    var B = (uint)(b >= 0 ? 2 * b : -2 * b - 1);
    var C = (int)((A >= B ? A * A + A + B : A + B * B) / 2);
    return a < 0 && b < 0 || a >= 0 && b >= 0 ? C : -C - 1;
}

由于中间计算可能超出限制2N有符号整数,我用过4N整数类型(最后除以2将结果返回到2N).

我在替代解决方案上提供的链接很好地描述了利用空间中每个点的函数图。令人惊奇的是,您可以将一对坐标可逆地唯一编码为单个数字!神奇的数字世界!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以一种独特且确定性的方式将两个整数映射到一个 的相关文章

  • 创建横幅交换算法来轮播广告

    我正在构建广告横幅轮播脚本基于印象整个月均匀地显示广告 每次请求显示广告时都会进行计算 所以这将是即时完成的 广告应显示为一个接一个轮流播放 而不是仅显示一个广告 1000 次展示 然后显示另一个广告 1000 次展示 大多数情况下 它应该
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • 在二维空间中从 A 点前往 B 点?

    我正在开发一个项目 需要我计算从可变点 A 到可变点 B 的 0 360 度航向 以使 A 点的物体面向 B 点 现在 我不确定如何实现这一目标 我用谷歌搜索但没有找到任何好的解决方案 在任何情况下 如何计算二维空间中从 A 点到 B 点的
  • 三次贝塞尔曲线逆 GetPoint 方程:float for Vector <=> Vector for float

    给定结果值和四个点是否可以取回 float t 如果是这样 怎么办 public static Vector3 GetPoint Vector3 p0 Vector3 p1 Vector3 p2 Vector3 p3 float t t M
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 二进制字符串到十进制字符串

    下午好 如何将字符数多于语言最大整数类型中位数的二进制字符串转换为十进制字符串 换句话说 假设你有字符串 111001101001110100100 1001001111011100100 并且您不能先将其转换为整数 那么您将如何以 10
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预
  • 如何对数组进行排序(索引)以使用这些索引将原始数组从最小到最大值排序

    例如我有这个数组 int a 6 10 16 11 7 12 3 9 8 5 我想像这样对其索引进行排序 6 9 0 4 8 7 1 3 5 2 所以我可以使用索引将 a 从最小到最大值排序 在我的代码中我得到了这个 6 9 4 8 7 4
  • CPU是如何做减法的?

    我有一些基本的疑问 但每次我坐下来尝试面试问题时 这些问题和我的疑问就会出现 假设 A 5 B 2 假设A和B都是4字节 那么CPU是怎么做的呢 A B添加 我知道 A 的符号位 MSB 为 0 表示正值 B 的符号位为 1 表示负整数 现
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • 以一定角度遍历二维数组

    通常我们按行或列遍历数组 但这里我想以角度遍历它 我会尝试解释我的意思 因此 假设角度是 45 度 那么它会搜索为 0 0 then 0 1 1 0 then 0 2 1 1 2 0 等等 抱歉 无法上传图像 因为我是新用户 不允许这样做
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 用圆形雷达数学方法表示点

    我正在编写一个简单的应用程序 它可以向您显示您周围的朋友 但不是在法线地图中 而是在像 UI 这样的真正圆形雷达上 https i stack imgur com Au3IP png https i stack imgur com Au3I
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege

随机推荐

  • 自动调整 SVG 大小?

    这里有一个代码演示 http jsfiddle net y59MR 1 我有一个高度未知的 SVG 我可以在加载 json 并使用 javascript math 后弄清楚它 但是有没有可以使用的 css 来动态调整它的大小 css svg
  • UTF-8 与 Latin1 mysql,UTF-8 上未使用索引

    我尝试使用 UTF 8 和 Latin1 字符集创建 mysql 表 当我使用 Latin1 时 会使用索引 而当我使用 UTF 8 时 选择 限制记录时不会使用索引 我的字符集是否缺少某些内容导致发生这种情况 Cheers Ke 仅当表达
  • .gitattributes 中没有扩展名的文件

    我正在尝试处理 gitattributes 中没有扩展名的文件 text auto eol lf py eol lf 显然没有帮助 git check attr all foo输出 foo 文本 自动 如何才能做到这一点 我认为您必须为所有
  • 迭代 CSV 文件中的列 (PHP)

    我需要编写一个函数 以年份和温度作为输入 并返回给定年份中温度等于或低于给定温度的天数 由于数据是关于小时而不是天 因此需要找到小时数并将其除以 24 示例 getDaysUnderTemp 2019 10 返回 13 92 CSV 文件如
  • ng2-smart-table 缺少依赖项完成程序

    我正在使用 Ng2SmartTable 并且出现此错误 目标入口点 ng2 smart table 丢失时出现错误 依赖项 akveo ng2 completer 我已经尝试过以下命令 但它不起作用 1 npm install save n
  • 在 C++ 中分配和使用无类型内存块的正确方法是什么?

    到目前为止 我对这个问题得到的答案有两种完全相反的答案 它是安全的 和 它是未定义的行为 我决定完全重写这个问题 以便为我和任何可能通过谷歌到达这里的人获得一些更好的澄清答案 另外 我删除了C标签 现在这个问题是 C 特定的 我正在制作一个
  • chrome.storage.sync.set 不保存值

    因此 我在 Google Chrome 上的本地存储方面遇到了一些障碍 根据我的研究 我的语法似乎是正确的 但由于某种原因该值没有被保存 这是我的代码 chrome storage sync get accName function dat
  • 如何手动将 dns 条目添加到由 AWS ECS 服务发现管理的托管区域?

    我正在 AWS ECS 中的私有托管区域中使用容器服务发现staging example com 现在 在容器旁边 我想将 AWS RDS 数据库映射到db staging example com 但是 我无法修改 Route53 托管区域
  • 如何使用 Android Studio 2.2.3 调试外部本机库的 C++ 源代码?

    我有一个在Windows 10下由Android Studio 2 2 3创建的android项目 该项目通过其包装jar 通过JNI 使用本机库 本机库是由 qmake 在 Android Studio 之外构建的 它将使用 androi
  • 如何将文本文件转换为ARFF格式?

    我正在使用 WEKA 工具进行文本分类 并且必须将纯文本文件转换为 ARFF 格式 但是 我不知道该怎么做 谁能帮我将文本文件转换为 ARFF 格式 谢谢伦克劳夫的回复 我不明白这些要点 由于像记事本这样的文本编辑器只允许有限数量的列 因此
  • 错误:‘$’未定义。[no-undef]

    我想用一些 jQuery 来做一个粘性导航栏但我得到了错误 ERROR is not defined no undef ERROR document is not defined no undef 并且代码不起作用 有人可以帮助我为什么会出
  • 我可以在不使用好友的情况下从班级外部访问私人成员吗?

    免责声明 是的 我完全意识到我所问的问题是完全愚蠢的 任何希望在生产代码中尝试这样的事情的人都应该被解雇和 或枪杀 我主要是想看看是否can做完了 现在这已经不成问题了 有什么方法可以从类外部访问 C 中的私有类成员吗 例如 有什么方法可以
  • 解析 JSON 数组并加载到 hive 表中

    我有一个如下所示的 Json 数组 Name xxxx Machine Machine1 Name yyyy Machine Machine2 Name zzzz Machine Machine3 我需要解析该数据并加载到如下所示的配置单元
  • 循环内分配内存与循环外分配内存

    在循环的每次迭代中分配大块堆内存是否会带来明显的性能损失 当然 我在每次迭代结束时释放它 另一种方法是在进入循环之前分配一次 在所有迭代中重复使用它 并最终在退出循环后释放它 请参阅下面的代码 allocation inside loop
  • PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection

    我创建了一个模拟HttpsURLConnection基于一个堆栈交换答案 https stackoverflow com a 25334710 939250 import java net URL import javax net ssl
  • 如何通过ajax调用获取JSON数据

    我想得到JSON来自 ajax 调用的 php 页面的数据 php 页面正在返回AJAX字符串 现在我必须得到它JSON数据和显示值分开 我怎样才能做到这一点 这是我正在使用的代码 当我运行此代码来获取数据product id 时 它显示警
  • Django 中如何发送电子邮件

    我有设置 py Email settings EMAIL BACKEND django core mail backends smtp EmailBackend EMAIL HOST smtp gmail com EMAIL HOST US
  • 通过Java从.class文件中获取ByteCode(依赖)信息

    我想分析一下 class文件并获取有关哪个类使用哪个其他类的信息 jdeps是一个命令行工具 它允许您在控制台中显示一些信息 但我想避免调用外部工具并抓取命令行输出 所有依赖项都记录在类文件的中心位置 即常量池 因此 为了有效地处理所有依赖
  • 格式化 C# 代码片段的文字参数

    有什么方法可以更改代码片段的文字在代码片段生成的代码中使用时的呈现方式吗 具体来说 我想知道是否可以有一个名为 PropertyName 的文字 然后让代码片段引擎渲染 PropertyName 其中第一个字符为小写 我买不起 R 请帮忙
  • 以一种独特且确定性的方式将两个整数映射到一个

    想象两个正整数 A 和 B 我想将这两个组合成一个整数 C 不能有其他整数 D 和 E 组合成 C 因此将它们与加法运算符结合起来是行不通的 例如 30 10 40 40 0 39 1 连接也不起作用 例如 31 2 312 3 12 这种