Rank 和 unrank 与约束的组合

2023-12-23

我想使用元素距离约束对组合进行排名和取消排名。所选元素不能重复。

例如:

n := 10元素选择

k := 5被选择的元素

d := 32 个选定元素之间的最大距离

1,3,5,8,9匹配约束条件

1,5,6,7,8与约束不匹配

如何对具有给定距离约束的组合进行排序,其中1,2,3,4,5小于1,2,3,4,6?有没有一种方法可以在不计算 Rank 较小的组合的情况下进行排名?


您可以通过首先创建并填充一个二维数组来完成此操作,我将其称为NVT对于“有效尾数”,记录从给定值的某个位置开始的有效“尾数”的数量。例如,NVT[4][6] = 3,因为位置 #4 中有 6 的组合可以以 3 种不同的方式结束:(…, 6, 7)、(…, 6, 8) 和 (…, 6, 9) 。

  • 填充NVT, 从...开始NVT[k][…],这只是一行全 1。然后回到之前的位置;例如,NVT[2][5] =NVT[3][6] +NVT[3][7] +NVT[3][8],因为从位置 #3 开始、值为 5 的“尾部”将由该 5 加上从位置 #4 开始、值为 6、7 或 8 的“尾部”组成。
  • 请注意,我们并不关心是否确实存在有效的方法reach给定的尾巴。例如,NVT[4][1] = 3,因为有效的尾部 (1, 2)、(1, 3) 和 (1, 4),即使没有complete(…, 1, _) 形式的组合。

完成此操作后,您可以计算组合的排名C如下:

  • 对于位置 #1,计算从位置 #1 开始且值小于的所有有效尾部C[1]。例如,如果C从 3 开始,那么这将是NVT[1][1] +NVT[1][2],代表以1或2开头的所有组合。
  • 然后对所有后续位置执行相同操作。这些将代表以相同方式开始的组合C直到给定位置,但随后在该位置具有较小的值。
  • 例如,如果C是 (1, 3, 5, 8, 9),结果是
    0 +
    (NVT[2][1] +NVT[2][2]) +
    (NVT[3][1] +NVT[3][2] +NVT[3][3] +NVT[3][4]) +
    (NVT[4][1] +NVT[4][2] +NVT[4][3]+NVT[4][4]+NVT[4][5]+NVT[4][6] +NVT[4][7]) + (NVT[5][1] +NVT[5][2] +NVT[5][3] +NVT[5][4] +NVT[5][5] +NVT[5][6] +NVT[5][7] +NVT[5][8]).

反之,你可以找到组合C具有给定的排名r如下:

  • 创建临时变量rr,对于“剩余排名”,最初等于r.
  • To find C[1] — 位置 #1 中的值 — 从位置 #1 开始计算有效尾数,从最小可能值(即 1)开始,一旦超过则停止rr。例如,自从NVT[1][1] = 66 且NVT[1][2] = 27,排名为 75 的组合必须以 2 开头(因为 75 ≥ 66 且 75 rr(在本例中剩下 75 − 66 = 9)。
  • 然后对所有后续位置执行相同的操作,确保记住考虑到前一个位置的最小可能值。继续我们的例子r = 75, C[1] = 2,并且rr= 9,我们知道C[2] ≥ 3;自从NVT[2][3]=23>rr,我们立即发现C[2] = 3.

复杂度分析:

  • Space:
    • NVT需要O(nk) space.
    • 返回一个组合作为长度k数组本质上需要O(k) 空间;但是如果我们一次返回一个值的组合(通过调用回调或打印到控制台或其他东西),那么计算本身实际上并不依赖于这个数组,只需要O(1)额外空间。
    • 除此之外,其他一切都可以在其中管理O(1) 空间;我们不需要任何递归或临时数组或任何东西。
  • Time:
    • 人口增加NVT takes O(nkd) 时间。 (注:如果d大于n,那么我们可以设置d等于n.)
    • Given NVT,计算给定组合的排名采用最坏情况O(nk) time.
    • Given NVT,计算给定排名的组合采用最坏情况O(nk) time.

实现说明:上面的细节有点繁琐;如果您没有具体的数据可供查看,那么很容易出现相差一的错误,或者混淆两个变量,或者诸如此类的情况。由于您的示例只有 168 个有效组合,因此我建议生成所有组合,以便您可以在调试期间引用它们。


可能的额外优化:如果您期望n如果相当大,并且您希望执行大量查询来“排名”和“取消排名”组合,那么您可能会发现创建第二个数组很有用,我将其称为NVTLT对于“有效尾数小于”,记录从某个位置开始的有效“尾数”的数量少于给定值。例如,NVTLT[3][5]=NVT[3][1] +NVT[3][2] +NVT[3][3] +NVT[3][4],或者如果您愿意,NVTLT[3][5]=NVTLT[3][4] +NVT[3][4]。 (您可以将其作为就地转换来执行,完全覆盖NVT,所以这是一个O(nk)通过,没有额外的空间。)使用NVTLT代替NVT对于您的查询,您可以对值进行二分搜索,而不是线性搜索,给出最坏的情况O(k log n) 时间而不是O(nk) 时间。请注意,此优化比上述优化更加棘手,因此即使您打算执行此优化,我也建议从上述开始,使其完美运行,然后再添加此优化。

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

Rank 和 unrank 与约束的组合 的相关文章

  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • PHP中的反转数组

    array 7 0 gt array 2 id gt string 1 9 roi gt float 0 1 gt array 2 id gt string 1 1 roi gt float 0 2 gt array 2 id gt str
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 如何将事物的组合映射到关系数据库?

    我有一个表 其记录代表某些对象 为了简单起见 我假设该表只有一列 这是唯一的ObjectId 现在我需要一种方法来存储该表中的对象组合 组合必须是唯一的 但可以是任意长度 例如 如果我有ObjectIds 1 2 3 4 我想存储以下组合
  • 将 int 复制到 byte[] 的最简单方法

    我有一个 byte 我正在迭代 int 列表 和其他数据 我想将 int 复制到我的 byteArray index 4 我该怎么做 BitConverter http msdn microsoft com en us library sy
  • char 数组声明中字符串文字周围的大括号有效吗? (例如 char s[] = {"Hello World"})

    偶然间我发现这条线char s Hello World 已正确编译并且似乎被视为相同char s Hello World 不是第一个 Hello World 一个包含一个 char 数组元素的数组 因此 s 的声明应为char s 事实上如
  • 如何将多维数组传递给 C 和 C++ 中的函数

    include
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任

随机推荐