- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下优化问题,我可以通过“蛮力”解决,但我想知道是否有人已经实现了我可以用来更快、更优雅地完成它的求解器。
我有两个不相交的整数列表。这些实际上是独一无二的,所以我可以说这是两套。一个是短的 (s
) 大约有 S=90000
个元素,另一个是长的 (l
) 大约有 L=2.5M
元素。我需要的是从 l
中提取长度正好为 S
的子集 l2
以便 s
的元素之间的总体距离code> 和 l2
是长度为 S
的 l
的所有子集中最小的。 s
和 l
元素之间的成对距离就是它们差值的绝对值。
因此,如果 s
和 l
不相交并且 l
是 s
的超集,则结果 l2
与 s
完全相同。
由于数组很长,通过测试 l
的各个子集来使用蛮力方法是不切实际的。
是否有某种现有的优化库或其他包可以用来解决这个问题?
顺便说一句,可能有不同的方法来测量两个集合之间的距离,我真的不关心它是哪一个,只要它会为上面的极端超集示例给出 0 即可。
最佳答案
我知道你说这些是列表,但有什么理由不暂时将它们转换为 numpy 数组?这可以很简单(如果您不知道如何进行转换):
s = np.array(s)
l = np.array(l)
从那里,您可以使用“searchsorted”功能。我的测试运行时间不到 1.5 秒。
from __future__ import division, print_function
import numpy as np
import datetime as dt
# build numpy array
s = np.random.rand(90000)
l = np.random.rand(2.5E6)
# sort
s.sort()
l.sort()
# searchsorted finds where values in array2 should be inserted in array1 to
# maintain the "sortedness" of a new list
# define index locations where "s" should be inserted in "l"
indices = np.searchsorted(l,s)
# build dummy list to store "s2"
# this is faster than repeatedly resizing an array
s2 = s*0
# using "indices" determine which adjacent value is the nearest match
# need to be careful here since we cannot look "below" the first index
# nor can we look "above" the last value
d1 = dt.datetime.now()
for r in np.arange(s.shape[0]):
ix = indices[r]
if indices[r]==0:
s2[ix] = l[0]
elif indices[r]==l.shape[0]:
s2[ix] = l[r-1]
else:
tmp = l[ix:ix+2]
s2[r] = tmp[ np.abs(s[r]-tmp)==np.min(np.abs(s[r]-tmp)) ]
print('Execution time: ',dt.datetime.now()-d1)
我已经进行了几次试验,看起来这可行,但你自己确认一下。如果这不起作用,则不应花费太多精力来调整它。
将 for 循环更改为:
for r in np.arange(s.shape[0]):
ix = indices[r]
if indices[r]==0:
s2[ix] = l[0]
l[0] = np.nan
elif indices[r]==l.shape[0]:
s2[ix] = l[r-1]
l[r-1] = np.nan
else:
width = 0
while width<min([10,r]) and np.isnan(l[ix-width:ix+2+width].mean()):
width += 1
tmp = l[ix-width:ix+2+width]
s2[r] = tmp[ np.abs(s[r]-tmp)==np.nanmin(np.abs(s[r]-tmp)) ][0]
l[l==s2[r]] = np.nan
这会做两件事:1. 它删除了 l 内最近的邻居,使其在未来的迭代中不被考虑2. 它在 l 内递增地增加搜索宽度以确保找到最近的邻居
同样,这可能需要调整才能拨入。
关于python:如何找到一组中最接近另一组的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445418/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!