【发布时间】:2022-01-10 18:44:13
【问题描述】:
我是 C 的初学者,我正在尝试找出一种解决方案来比较多个数组并根据哪些元素相同来找出它们的相似度百分比。
例如,我们有以下名为 Library 的结构体,其中填充了 Articles:
typedef struct
{
int articleId;
int count;
int bibliography[3];
} Article;
typedef struct
{
Article **articles;
int count;
int allocated;
} Library;
一个已填充的库的示例如下:
articleId bibliography
000 [222,111]
111 [333,222]
222 [111]
333 [222,111]
我的目标是找出所有文章及其参考书目之间的相似性,无论它们的顺序如何。换句话说,哪些文章引用了相同的文章?
我所说的相似性是什么意思:当比较两个数组时,我们检查另一个数组中具有相等整数的整数的数量。然后我们把这个数字除以更大的数组的长度,得到我们的相似度。
例如,000 和 333 的相似度为 100%,222 和 333 的相似度为 50%,111 和 222 的相似度为 0%,以此类推。
我特别有麻烦,因为数组都有不同的长度。有没有人有任何想法?我的方法将包括嵌套 for 循环,但我不确定这是否是正确的方向。
我尝试在我的代码中构造算法:
double citationSimilarity (Library *lib)
{
int currentCitation[3];
int comparingCitation[3];
int[] similarityResults;
int similar = 0; //amount of similar citations
double similarity = 0;
int total = 0; //highest total amount of citations
for(int i = 0; i < lib->count; i ++){
for(int j = 1; j < lib->count; j ++){
similar = 0;
similarity = 0;
for(int k = 0; k < lib->articles[i]->count; k ++){
for(int l = 0; l < lib->articles[j]->count; l ++){
currentCitation[k] = lib->articles[i]->bibliography[k];
comparingCitation[l] = lib->articles[j]->bibliography[l];
if(lib->articles[i]->articleId != lib->articles[j]->articleId){
if(currentCitation[k] == comparingCitation[l]){
similar++;
if(similar != 0){
similarity = (double)similar / (double)getLargerBibliography(lib->articles[j]->count, lib->articles[i]->count);
}
printf ("Great success! %d and %d have the similarity %lf \n",lib->articles[i]->articleId, lib->articles[j]->articleId, similarity);
}
}
}
}
}
}
}
int getLargerBibliography (int bib_a, int bib_b)
{
int max;
int min;
if (bib_a >= bib_b)
{
max = bib_a;
min = bib_b;
}
else
{
max = bib_b;
min = bib_a;
}
return max;
}
【问题讨论】:
-
您既没有对“相似”的含义给出可行的定义(即 222 和 333 是 100% 相似还是 50% 或其他什么,更重要的是,为什么?),您也没有发布任何证据表明您自己正在努力解决这个问题。
-
也许你想计算对的edit distance。例如,您可以计算Levenshtein distance 或其Longest Common Subsequence 的长度(不要与最长公共子串混淆)。
-
您好,感谢您的cmets。我试图克服的第一个困难是如何准确地比较多个不同长度的数组?那已经对我有很大帮助了。我试图在问题中更仔细地定义我的问题。