我发现A[i..j]
与B最相似。
这里calcSimilarity
是返回两个数组的相似性的函数。
相似度计算为
不是暴力搜索,我想知道什么样的数据结构和算法在范围搜索中是有效的。
SAMPLE输入/输出
input: A: [(10,1), (20,1), (-200,2), (33,1), (42,1), (58,1)] B:[(20,1), (30,1), (1000,2)]
output: most similar Range is [1, 3]
match [20, 33] => [20, 30]
这是强力搜索代码。
struct object{
int type, value;
}A[10000],B[100];
int N, M;
int calcSimilarity(object X[], n, object Y[], m){
if(n > m) return calcSimilarity(Y, m, X, n);
for(all possible match){//match is (i, link[i])
int minDif = 0x7ffff;
int count = 0;
for( i = 0; i< n; i++){
int j = link[i];
int similar = similar(X[i], Y[j]);
minDif = min(similar, minDif);
}
}
if(count == 0) return 0x7fffff;
return minDif/pow(count,3);
}
find_most_similar_range(){
int minSimilar = 0x7fffff, minI, minJ;
for( i = 0; i < N; i ++){
for(j = i+1; j < N; j ++){
int similarity = calcSimilarity(A + i, j-i, B, M);
if (similarity < minSimilar)
{
minSimilar = similarity;
minI= i;
minJ = j;
}
}
}
printf("most similar Range is [%d, %d]", minI, minJ);
}
答案 0 :(得分:0)
需要O((N ^ M)*(N ^ 2))。
看起来像找到相似性的Big-O是N ^ 2。通过每个元素的成对比较。
所以它看起来更像是
成对比较是M *(M-1)。每个列表必须针对彼此列表或关于M ^ 2进行测试。
这是一个已经为聚类解决的问题,并且有数据结构(例如Metric Tree),它允许类似对象之间的距离存储在树中。
当寻找N个最近邻居时,搜索这个树会限制所需的成对比较次数并产生O(ln(M))形式
这个特定树的缺点是,相似性度量需要是度量。如果A和B之间的距离以及B和C之间的距离允许对A和C的距离范围进行推断。
如果您的相似性度量不是度量标准,则无法完成此操作。
Jaccard distance是距离的度量标准,允许将其放置在度量标准树中。