我是 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;
}
uj5u.com熱心網友回復:
使用合并比較兩個陣列
- 對第一個陣列的元素進行排序(
array1以下稱為)。 - 對第二個陣列的元素進行排序(
array2以下稱為)。 - 設定
i為0。 - 設定
j為0。 - 設定
count為0。 - While
i小于 中的元素個數array1,并且
whilej小于 中的元素個數array2,- 如果
array1[i]小于array2[j],- 增量
i。
- 增量
- 別的,
- 如果
array1[i]大于array2[j],- 增量
j。
- 增量
- 別的,
- 增量
count。 - 增量
i。 - 增量
j。
- 增量
- 如果
- 如果
- 找出 的長度
array1和 的長度中的最大值array2。 - 除以
count兩個陣列長度中的最大值。
這支持陣列中的重復元素。
復雜性因使用的排序演算法而異。使用通用排序演算法,比較每一對需要 O(1) 額外的記憶體和 O(N log N) 時間。但是,如果值是真正的整數,則可以實作 O(N) 排序,但會消耗一些記憶體。無論哪種方式,排序只需要對每個陣列執行一次,而不是每次比較時執行一次,因此排序成本是攤銷的。
使用集合差異比較兩個陣列
這是一個 O(N) 記憶體和 O(N) 時間的解決方案,甚至適用于非整數鍵。回圈的每次通過都更昂貴,因此可能需要很大的 N 才能獲得任何收益。
- 創建一個集合。(可以使用關聯陣列。)
- 對于其中一個陣列中的每個值,
- 將其添加到集合中。
(如果使用關聯陣列,則使用值作為鍵,并使用任何值作為值。)
- 將其添加到集合中。
- 對于另一個陣列中的每個值,
- 如果該值在先前創建的集合中,
- 在計數中加一。
- 如果該值在先前創建的集合中,
- 找到第一個陣列的長度。
- 求第二個陣列的長度。
- 找到兩個陣列長度中的最大值。
- 將計數除以兩個陣列長度中的最大值。
由于它不會破壞集合,因此您可以預先為每個陣列創建并在比較不同的陣列對時重用它!
這不支持重復元素,但可以非常簡單地進行調整。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411465.html
標籤:
