索引集合的(无序)对

2023-12-05

这是一个自动回答的问题,源自这个更具体的问题OP 在选择错误的(恕我直言)答案后似乎失去了兴趣。

我确实检查了之前有关该主题的问题,但似乎没有一个能够解决该问题。

那有什么用呢?

假设您有 4 个人:Abdul、Beatrix、Charlie 和 Daria。
您想要存储有关这些人彼此之间的感受的信息

Abdul and Beatrix are in love
Beatrix and Charlie hate each other
Abdul and Charlie are good friends
Daria and Beatrix don't know each other
etc.

在简洁且缺乏诗意的计算机世界中,这可以翻译为:

relation (Abdul  , Beatrix) = love;
relation (Beatrix, Charlie) = hate;
relation (Abdul  , Charlie) = friendship;
etc.

换句话说,如果你想映射每一对人之间的关系,你将需要一个数据结构,允许你为每一对人维护唯一的值。

尽管有多种方法可以实现合适的数据结构,但在某些情况下,您可能希望该表是一个固定大小的数组,直接由表示给定关系的对进行索引。

一些定义:

given IN the set of the first N natural integers, let's call PN the sequence of all unordered pairs (a,b) of IN such that a <> b, sorted in lexicographic order.

用(希望)不那么神秘的英语,P 列举了 I 的两个元素之间所有可能的关系.

示例(对于 N = 4):

     I4   = (0,1,2,3)
     P4 = ((0,1),(0,2),(0,3),(1,2),(1,3),(2,3))

Note that the cardinality of PN is N(N-1)/2, so
the most compact zero-based index of PN will be in the [0..N(N-1)/2-1] range.

问题:

how can we index PN in a compact and efficient way?

换句话说,

  • define a function pN(a,b) that, given a pair (a,b) of elements of IN, produces a unique index of PN in the range [0..N(N-1)/2-1]
  • define the reverse-indexing function pN-1 that, given an index of PN, will produce the corresponding (a,b) pair

The way PN is arranged is of lesser importance, but a lexicographic order would probably be the most convenient.

example:

     P4 = ((0,1),(0,2),(0,3),(1,2),(1,3),(2,3))
     p4(1,3) = 4
     p4-1(4) = (1,3)


到目前为止,我在这里看到的两个答案都可以很好地完成第一个计算,但向后计算需要循环,这是没有必要的。

考虑以下示例n=5,显示元素的编号方式。

    0   1   2   3   4
  +---+---+---+---+---+
0 |   |   |   |   |   |
  +---+---+---+---+---+
1 | 0 |   |   |   |   |
  +---+---+---+---+---+
2 | 1 | 4 |   |   |   |
  +---+---+---+---+---+
3 | 2 | 5 | 7 |   |   |
  +---+---+---+---+---+
4 | 3 | 6 | 8 | 9 |   |
  +---+---+---+---+---+

给定一个元组(x, y)(假设x < y),列中的第一个索引x是(谁)给的

n-1 + n-2 + ... + n-x = (n-1 + n-x) * x / 2 = (2n - x - 1) * x / 2

该列中的偏移量很简单y - x - 1。这产生了总表达式

p_n(x, y) = (2n - x - 1) * x / 2 + y-x-1 = (2n - x - 3) * x / 2 + y-1

现在,反其道而行之是很棘手的。我们有一些价值观p and n并且需要找到x and y。我们可以通过假设我们正在寻找列中的第一个单元格来使我们的生活更简单,即y = x+1。如果我们将其代入上面的公式,我们得到

p = (2n - x - 1) * x / 2

重写这个公式可以得到

x^2 - (2n-1) * x + 2p = 0

这是一个简单的二次方程,可以解出 x:

x = [(2n-1) - Sqrt((2n-1)^2 - 8p)] / 2

当然,我们可能高估了x,因为我们假设了尽可能低的值y。然而,我们并没有那么远(仍在右列中),因此向下舍入该值足以获得真实值x.

堵住x我们在原始公式中找到的值产生了一个非常简单的方程y:

x = Floor( [(2n-1) - Sqrt((2n-1)^2 - 8p)] / 2 )
y = p - (2n - x - 3) * x / 2 + 1

可以说,取数字的平方根是一个缓慢的操作(这是事实),但对于更大的值,这种方法将优于循环。n.

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

索引集合的(无序)对 的相关文章

  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?

    标准术语顺序 ISO IEC 13211 1 7 2 术语顺序 针对所有术语 包括变量 进行定义 虽然这有很好的用途 想想实施setof 3 这使得 8 4 术语比较中内置函数的许多其他干净且合乎逻辑的使用成为声明式噩梦 到处都是 imps
  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 数字求和的算法?

    我正在寻找一种数字求和的算法 让我概述一下基本原则 假设你有一个号码 18268 1 8 2 6 8 25 2 5 7 7 是我们的最终数字 它基本上是将整个数字中的每个数字相加 直到我们得到一个 也称为 核心 数字 它经常被命理学家使用
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 如何对 HTML 表格进行排序?

    我根本不是 HTML 专家 我对微控制器进行编程并开始切线 我创建了一个 html 文档来显示微控制器寄存器 寄存器地址和寄存器描述的表 我创建了一个包含 3 列和大约 120 行的表 某些寄存器地址是可位寻址的 如果它们的地址以 0 或
  • 整数除法性质

    下面的整数算术性质成立吗 m n l m n l 起初我以为我知道答案 不成立 但现在不确定 它适用于所有数字还是仅适用于某些条件 即n gt l 该问题涉及计算机算术 即q n m q m n 忽略溢出 Case1 assume m kn
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • Java 8 流过滤器 - 基于排序的更新

    我正在尝试对过滤器中的字段进行排序 输入文件 样本记录 DocumentList Document id 5975ff00a213745b5e1a8ed9 u id mailboxcontent id 5975ff00a213745b5e1
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 查找两个大小为 n 的数组中第 n 大数的算法

    我有这个问题 给定两个大小为 n 的排序列表 存储在数组中 找到 O log n 计算并集中第 n 大元素的算法 两个列表 我可以看到这里可能有一个技巧 因为它需要第 n 个最大的元素 并且数组的大小也是 n 但我不知道它是什么 我在想我可
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • Django Admin:引用用户的ForeignKey和ManyToManyField关系的排序

    我有一个使用 Django 的应用程序UserProfile扩展内置的 DjangoUser模型 看起来有点像 class UserProfile models Model user models ForeignKey User uniqu
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 大小为 n 的数组,其中一个元素 n/2 次

    给定一个由 n 个整数组成的数组 其中一个元素出现超过 n 2 次 我们需要在线性时间和恒定的额外空间中找到该元素 YAAQ 又一个数组问题 我有一种偷偷的怀疑 这类似于 在 C 中 We don t need an array publi
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun

随机推荐

  • 如何在 Rust 中打印变量的类型?

    我有以下内容 let mut my number 32 90 如何打印类型my number Using type and type of不工作 还有其他方法可以打印号码的类型吗 您可以使用std any type name功能 这不需要夜
  • 我想使用两个线程打印斐波那契数列。就像第一个数字应该由第一个线程打印,然后第二个数字由第二个线程打印,依此类推

    我希望斐波那契数列由线程打印 该系列的第一个数字应由第一个线程打印 然后第二个数字由第二个线程打印 然后第三个数字由第一个线程打印 第四个数字由第二个线程打印 依此类推 我通过使用数组尝试了此代码 例如使用线程打印数组元素 但我无法在线程之
  • 缩小 png 字体

    有没有办法在启动时以最高质量缩小 opengl 中 png 图像的字体 我试过gluScaleImage但有很多文物 有没有使用 lanczos 或类似的东西 我不想编写着色器或任何缩放运行时的东西 这是基于一种算法 我几十年前从德国复制的
  • 对相同对象同时使用映射和列表

    我尝试使用列表和 unordered map 来存储同一组对象 我是 C 新手 所以仍然对迭代器感到满意 假设我有以下测试代码 class Test public int x int y int z Test int int int Tes
  • 为什么在解析引用时(不是通过反射)Assembly.Load 似乎不影响当前线程?

    如果标题没有意义 我提前道歉 我对应用程序域和程序集加载非常陌生 并且真的不知道如何表达我想问的问题 我一直在摆弄在运行时将嵌入的 DLL 加载到应用程序中 但我似乎无法弄清楚为什么它以一种方式工作 而不是另一种方式 似乎如果您尝试将 DL
  • CKEditor HTML 自动更正问题

    我的数据库中有几行 HTML 我想在CKEditor中编辑内容 但是当我在编辑器中打开它时 HTML 就会崩溃 HTML 被重新排列 下面是数据库中的 HTML span class sec title h1 span Web span E
  • 如何使用字符串作为关键字参数?

    具体来说 我尝试使用字符串来任意过滤 ORM 我尝试过 exec 和 eval 解决方案 但遇到了困难 下面的代码不起作用 但这是我知道如何解释我想要去的地方的最佳方式 from gblocks models import Image f
  • 在 Android 上创建新项目,错误:Studio 未知主机“services.gradle.org”

    安装Android studio并创建新项目后 出现以下错误 未知主机 services gradle org 请确保主机名正确 如果您使用 HTTP 代理 请在 Android Studio 或中配置代理设置 摇篮 有关更多详细信息 请参
  • Firebase + Next.js 无服务器,在 GCP 上 - 如何管理暂存、生产 + 本地

    我使用 React 与 next js 和 Google Cloud 函数来为应用程序提供服务 我也用firebase 我正在寻找自动配置 3 个环境的暂存和生产配置的最佳方法 生产 使用生产凭证 暂存 使用暂存凭证 本地 还使用暂存凭据
  • SSIS API:如何知道将 __COMObject 转换到哪个接口?

    Like 这个帖子 我还尝试从 SSIS 包中提取 SQL 我想我会尝试发布的相同代码 听起来该代码对他有用 但不完整 因为它没有处理所有可能的情况 这是调用过程的代码 var taskHost Microsoft SqlServer Dt
  • PHP fwrite() 期望参数 1 为资源,给定布尔值 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正进入 状态 Warning fwrite expects parameter 1 to be resource boolean given 我有下面给出的代码 data table t
  • c# 从数据库初始化Appsettings

    我们已经有一个现有的控制台应用程序 当前使用基于文件的 AppSettings 所以我的 app config 指向我的实际 appsettings 文件
  • 模型和视图模型的 INotifyPropertyChanged

    我目前离开家 并且还要离开家几周 并且只有一台平板电脑 因此 我无法访问 Visual Studio 来测试我想要学习的内容 MVVM图案 到目前为止 我认为理论已经确定 但我对INotifyPropertyChanged界面 我认为 MV
  • Spring Boot Security hasRole 不起作用

    我无法使用hasRole中的方法 PreAuthorize注解 还request isUserInRole ADMIN gives false 我缺少什么 虽然 hasAuthority ADMIN 工作正常 我正在从数据库为用户分配权限
  • 使用 CSS 或 jQuery 更改每行第一个单词的颜色

    我试图瞄准每行的第一个单词 将颜色更改为仅第一个单词 现在这正在由一个textarea在后端 div class items 67 small businesses has worked with us since the beginnin
  • Google 登录 API 异常 10

    认证已接近最后阶段 但出现问题handleSignInResult方法 它在日志中返回异常代码 10 开发人员错误 谷歌提供了全面的描述 应用程序配置错误 此错误不可恢复 将被视为致命错误 开发商是个白痴 我应该做什么来处理这个问题 获取一
  • 添加实例到weka中的Instances

    我有一些 arff 文件 我想按顺序阅读它们并创建一个大数据集 Instances add Instance inst 不会向实例添加字符串值 因此尝试 setDataset 但即使这样也会失败 有没有一种方法可以实现字符串直观上正确的事情
  • 检查什么 CollectionAssert.AreEquivalent

    我正在阅读有关该方法的内容CollectionAssert AreEquivalent in MSDN 文章根据 MSDN 如果两个集合具有相同数量但任意顺序的相同元素 则这两个集合是等效的 如果元素的值相等 则元素相等 但如果它们引用同一
  • NSString 编码特殊字符,如 !@#$%^&

    我如何编码我的 NSString 以便所有特殊字符例如 变成 amp 和 变成 apos 我不确定编码是否是正确的词 所以如果我错了 请纠正我 Thanks 你所说的叫做HTML 实体 有一个类别声称可以解决这个问题 NS字符串 HTML
  • 索引集合的(无序)对

    这是一个自动回答的问题 源自这个更具体的问题OP 在选择错误的 恕我直言 答案后似乎失去了兴趣 我确实检查了之前有关该主题的问题 但似乎没有一个能够解决该问题 那有什么用呢 假设您有 4 个人 Abdul Beatrix Charlie 和