如何从具有多个维度的集合中进行近似搜索
本文关键字:集合 搜索 | 更新日期: 2023-09-27 18:33:10
假设我有Items
,一大组这些对象:
class Item
{
public float Cost;
public float Size;
public float Weight;
public float Temperature;
}
我想反复从这个集合中选择一个与给定输入非常匹配的对象。
Item PickItem(float cost, float size, float weight, float temperature) {...}
它应该从Items
返回接近给定输入的Item
。 它不必给出最佳答案;任何接近的值,甚至可能有一些随机变化,都可以。
我将如何做到这一点? 我一直在做一些研究,看起来使用主成分分析 (PCA( 可以让我将我的集合分组到类似的区域,但实施起来看起来很复杂。 另外,我不确定如何使用它来选择项目,除了将搜索词添加到集合中并查找附近的结果值之外,但这需要为每个搜索重建整个 PCA 系统。
有没有更简单的方法? 我可以只搜索平均差异最小的元素,但似乎我最终会得到介于所有内容之间的结果,而不是大部分相关但具有一两个异常值属性的结果。 我想如果我加权它,它会起作用吗?
这是 O(n/2(
Item PickItem(float cost, float size, float weight, float temperature)
{
var bestDiff = float.MaxValue;
Item bestItem = null;
foreach(var item in items)
{
var diff = CaluclateDifference(item, cost, size, weight, temperature);
if(diff < bestDiff)
{
bestDiff = diff;
bestItem = item;
if(bestDiff = 0)
return bestItem;
}
}
return bestItem;
}
static float CaluclateDifference(Item item, float cost, float size, float weight, float temperature) =>
Math.Abs(item.Cost - cost) +
Math.Abs(item.Size - size) +
Math.Abs(item.Weight - weight) +
Math.Abs(item.Temperature- temperature);