Database 查找集合中最相似的匹配项

Database 查找集合中最相似的匹配项,database,algorithm,search,Database,Algorithm,Search,我有一个动物数据库,每个都有许多从0到1的属性——这些属性是大小、速度、毛羽等。给定一组输入属性,以及每种属性的权重,我需要在动物集中找到“最接近”的匹配项。有没有比O(n)时间更好的算法来实现这一点 我特别想做的是在游戏中为遗传算法产生的“动物”找到合适的纹理,将它们与已经存在的动物进行匹配。“最接近”是指属性差异加权和最小的动物。数据库和权重在应用程序启动时已知,因此可以投入大量时间准备数据 我已经找到了基于用户偏好的字符串匹配和产品匹配算法,但要么我没有找到我想要的,要么我不知道如何将这些

我有一个动物数据库,每个都有许多从0到1的属性——这些属性是大小、速度、毛羽等。给定一组输入属性,以及每种属性的权重,我需要在动物集中找到“最接近”的匹配项。有没有比O(n)时间更好的算法来实现这一点

我特别想做的是在游戏中为遗传算法产生的“动物”找到合适的纹理,将它们与已经存在的动物进行匹配。“最接近”是指属性差异加权和最小的动物。数据库和权重在应用程序启动时已知,因此可以投入大量时间准备数据

我已经找到了基于用户偏好的字符串匹配和产品匹配算法,但要么我没有找到我想要的,要么我不知道如何将这些概念重新应用到我的困境中。也许图论界有什么东西可以帮我


任何帮助都将不胜感激

如果您可以花时间整理数据,您可以按分数对动物进行排序(在
O(nlogn)
时间中,但只执行一次),然后对分数进行二进制搜索以查找
O(logn)
时间中最接近的匹配项


如果您从SQL数据库获取动物列表,您可以通过查询中的
ASC
DESC
关键字获取排序列表。

如果您可以花时间整理数据,您可以按分数对动物进行排序(在
O(nlogn)
时间中,但只执行一次)然后对分数进行二进制搜索,在
O(logn)
time中查找最接近的匹配项


如果您从SQL数据库获取动物列表,您可以通过在查询中使用
ASC
DESC
关键字来获取已排序的列表。

您可能会将其定义为最大权重匹配问题,但查找最小匹配的复杂性下限将比
O(n)严重得多
。想得更像
O(n^3)

如果我必须尝试解决这个问题,我会考虑成对地根据权重来匹配同一类型的属性。(即,使用输入权重的某个因子和查询“hairy”值与匹配的“hairy”值之差的倒数,在输入的“hairy”属性和数据集中的其他每个“hairy”属性之间创建一条加权边).在这一点上,你可以将所有的边缘合并到一个特定的动物身上,并将边缘权重之和作为匹配分数

例如:

Monkey:  
A1: 0.5 
B1: 0.25
C1: 1.0

Giraffe:
A2: 0.2
C2: 0.9
D2: 0.1

Input query:
Ai: 0.4 with weight 0.8
Di: 0.2 with weight 0.25
因此,我们创建以下图表:

Ai --> A1 with weight 0.8 * 1/abs(0.5-0.4) (i.e., 8.0)
Ai --> A2 with weight 0.8 * 1/abs(0.2-0.4) (i.e., 4.0)

Di --> D2 with weight 0.25 * 1/abs(0.1-0.2) (i.e., 2.5)
然后,我们在同一目标动物中折叠具有属性的所有边,以获得候选对象:

Monkey: 8.0
Giraffe: 4.0 + 2.5

它不漂亮,而且比
O(n)
更糟糕(可能是由于
m
的某些因素,其中
m
是您试图匹配的属性数),但这可能是优化更好解决方案的起点。

您可能会将其视为最大权重匹配问题,但找到最小权重匹配的复杂性下限将比
O(n)
糟糕得多。更像
O(n^3)

如果我必须尝试解决这个问题,我会考虑成对地根据权重来匹配同一类型的属性。(即,使用输入权重的某个因子和查询“hairy”值与匹配的“hairy”值之差的倒数,在输入的“hairy”属性和数据集中的其他每个“hairy”属性之间创建一条加权边).在这一点上,你可以将所有的边缘合并到一个特定的动物身上,并将边缘权重之和作为匹配分数

例如:

Monkey:  
A1: 0.5 
B1: 0.25
C1: 1.0

Giraffe:
A2: 0.2
C2: 0.9
D2: 0.1

Input query:
Ai: 0.4 with weight 0.8
Di: 0.2 with weight 0.25
因此,我们创建以下图表:

Ai --> A1 with weight 0.8 * 1/abs(0.5-0.4) (i.e., 8.0)
Ai --> A2 with weight 0.8 * 1/abs(0.2-0.4) (i.e., 4.0)

Di --> D2 with weight 0.25 * 1/abs(0.1-0.2) (i.e., 2.5)
然后,我们在同一目标动物中折叠具有属性的所有边,以获得候选对象:

Monkey: 8.0
Giraffe: 4.0 + 2.5

它不漂亮,而且比
O(n)
更糟糕(可能是由于
m
的某些因素,其中
m
是您试图匹配的属性数),但这可能是优化更好的解决方案的起点。

找到线性反转的数量如何?因此,你有一组两种动物的线性数据,你想通过排序来找出它们有多相似或不同。复杂性与合并排序相同。对于“n”种动物,你将有nC2 inv已计算版本数。

如何计算线性反转数?因此,您将有两个动物的线性数据集,并且您希望通过对它们进行排序来了解它们的相似性或不同性。复杂性与合并排序相同。对于“n”个动物,您将计算nC2反转数。

您可以将这些项目视为高级别的点h维空间,并将它们全部插入BSP树,如a。要使用属性权重,只需将它们乘以相应的坐标:
(w1*x,w2*y,…)

准备:(来自,python代码)

def kdtree(点列表,深度=0):
如果不是点列表:
一无所获
#选择“基于深度的轴”,以便轴在所有有效值之间循环
k=len(点列表[0])#假设所有点的尺寸相同
轴=深度%k
#排序点列表并选择中间值作为轴心元素
点\列表.排序(键=λ点:点[轴])
中位数=len(点列表)//2#选择中位数
#创建节点并构造子树
node=node()
node.location=点列表[中间值]
node.left_child=kdtree(点列表[:中间值],深度+1)
node.right_child=kdtree(点_列表[中间值+1:],深度+1)
返回节点
搜索:(从,基于)

节点类的方法 def最近_点(自身、目标、点、最佳=无): 如果目标