- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个排序的数字数组。第一个数组是一组 n 个整数,它们是在数组边界之间等距分布的目标。第二个数组有 n 个整数的大倍数,也是一个集合。我想从第二个数组中找到最接近第一个数组中所有目标的 n 个整数,条件是第二个数组中只有一个整数可以匹配第一个数组中的任何目标。也就是说,所有匹配都是互斥的。
感谢您的帮助!
编辑:
抱歉缺少细节。这是对实际问题的简化。
具有常规目标的第一个简单数组示例:[0x0,0x7FFFFFFF,0xFFFFFFF]
第二个数组本质上是没有重复的随机数据,均匀分布在第一个数组的范围内。也就是说,在 0x0 和 0xFFFFFFFF 之间可能有 2000 个整数。我需要第二个数组中最接近第一个数组中的目标的三个整数。在实际问题中,目标将具有更小的范围和更多的目标,并且总是有规律地间隔开。
编辑:更多上下文。
一个大数组 B 是一个随机的 32 字节散列流,这些散列已经排序并被装入 n 叉树中。对于每个节点,都有已知的限制 u 和 v。数组 A 是通过将 u 和 v 分成 n-1 个步幅来构造的。对于 u 和 v 之间的每个 B 子集,尝试找到 B 中最接近 n-1 个步幅之一的成员。然后使用这些选定的成员进一步过滤 B 下面的每个子节点。它基本上是用于平衡包含随机数据的树的启发式方法。深度节点需要考虑的 B 逐渐变小。 A 总是固定长度。
最佳答案
首先让我尝试正式地说明问题。调用第一组数字 A 和第二组 B。我们想要一个单射映射 f : A -> B(单射意味着 x != y 意味着 f(x) != f(y))最小化一些目标函数来衡量所有 x f(x) 与 x 的接近程度。有多种合理的选择,所以我会为你选择一个:让我们最小化 sum_{x in A} |f(x) - x|。 (这个答案的其余部分在某种程度上与确切的目标无关,只要某个最佳 f 是递增函数即可。)
贪婪算法(定义,对于 A 中的所有 x,值 f(x) 是 B 中的 y 最小化 |x - y|)失败,因为它选择的 f 可能不是单射的。通常的修复技术是动态规划,它有效但需要二次而不是线性时间。这是一个未经测试的 Python 示例,它应该计算最佳目标值。 table[(i, j)]
的值是将 A
的前 i
元素映射到第一个 的最佳成本
元素。B
的 j
def assign(A, B):
m = len(A)
n = len(B)
table = {(0, j): 0 for j in range(n + 1)}
for i in range(1, m + 1):
table[(i, 0)] = 1e309 # infinity
for j in range(1, n + 1):
table[(i, j)] = min(table[(i - 1, j - 1)] + abs(A[i - 1] - B[j - 1]),
table[(i, j - 1)])
return table[(m, n)]
为了在最后恢复匹配,我们扩展代码以在每个表中创建另一个条目,指示采用了 min 的哪个分支,然后将决策追溯到 (0, j)
条目。
现在,我不知道你的问题有多大,也不知道你想要多快的结果,但我们假设无论出于何种原因,二次时间都是 Not Acceptable 。一般来说,上面的代码考虑了许多彼此相距很远的元素之间明显愚蠢的匹配。下面我将“显然很傻”做成一个技术术语,有一个有效的定义和一个线性时间算法。然后我们可以用更小的东西替换内部循环中考虑的 j
的范围,希望平均为线性大小,因为 B 比 A 密集得多并且呈半合理分布。运行时间相应减少。
请注意,将 A 中的最小值 x 与任何大于 min {y : y in B, y >= x} 的值匹配是没有意义的,我将其称为 x 的上邻域。如果我们这样做了,并且 f 正在增加,那么我们可以将 f(x) 更改为 x 的上邻居并在不违反约束的情况下提高目标值。如果我们贪婪地将 A 中的每个元素 x' 从最小到最大分配给 B 中不小于 x' 的最低可用 y',那么我们可以通过归纳证明存在一个最优解,其中每个 x' 匹配的值不大于比它的y'。此外,我们可以按如下方式在线性时间内计算这些值(更多未经测试的 Python)。
def uppers(A, B):
n = len(B)
j = 0
for x in A:
while j < n and B[j] < x:
j += 1
if j < n:
j += 1
yield j # exclusive upper bound
对称地,我们可以计算下界。将这些范围之外的任何赋值称为“显然很愚蠢”,并按照之前的描述进行。
关于algorithm - 如何找到两个数组之间所有互斥的最近邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25704183/
我从 SpatialPolygonsDataFrame 开始,它包含用于创建加纳各地区 map 的数据(可在 http://www.diva-gis.org/datadown 获取)。我正在尝试创建一
我遇到了一个问题,我需要根据存储在前一个元素中的信息修改容器的元素。示例: 如果前一个 vector 元素可被 2 整除,则将当前元素乘以 10 vector -> [12, 11, 33, 10]
总的来说,我对脚本编写还很陌生。我正在编写一个 expect 脚本,它通过 ssh 进入 Cisco 交换机,并运行“show cdp neighbors”命令来获取连接到交换机的所有设备的列表。然后
我正在尝试比较节点的值。使用 flood-fill 算法,我能够垂直和水平检查网格的每个节点。现在我必须更新我的代码以检查位于对 Angular 线上的单元格,如下图所示: 红色是当前节点,黄色是需要
我使用预先计算的指标使用 Scikit-Learn 的最近邻/半径分类。这意味着,我将成对距离的 n_samples_train x n_samples_train 矩阵传递给分类器的拟合方法。 现在
我有一个大的稀疏图,我将其表示为邻接矩阵(100k x 100k 或更大),存储为边数组。具有(非稀疏)4 x 4 矩阵的示例: 0 7 4 0 example_array = [ [7,1,2],
从有向图中并给出两个顶点 (v, u) 我需要找到:共同的“出”邻居和共同的“入”邻居。 例如: import networkx as nx ghybrid = nx.DiGraph() ghybri
我正在使用 JavaScript 进行图像处理,我想知道是否有任何通用公式可以确定像素的 x 邻居。 我知道对于 3*3 的正方形,可以使用特定的 x 和 y 像素确定 8 个邻居。 (x-1,y-1
在 CentOS 6.4(内核 2.6.32)上,为什么下面的第二个 arping 调用会创建一个新的 ARP 表条目,而第一个不会?网络行为是相同的,我感到困惑的是,在我看来,系统调用实际上是等同的
我是一名优秀的程序员,十分优秀!