这是我的代码,为什么字母和其他字母之间的交集和并集总是等于1,我从这里提取代码jaccard,因为我知道两个集A和B之间的Jaccard相似性它是A∩B和A∪B的基数比例,我想把一个字符串视为一组字符
#include <stdlib.h>
#include <stdio.h>
void main() {
char source[5] = "salam";
char cible[5] = "Salam";
int i, in = 0, un = 0;
float Jaccard = 0;
for (i = 0; i < 5; ++i) {
un += (source[i] || cible[i]);
in += (source[i] && cible[i]);
}
printf("un :: %d\n", un);
printf("in :: %d\n", in);
Jaccard = (float)in / un * 100.0;
printf("jaccard :: %f\n", Jaccard);
}
答案 0 :(得分:3)
你选择了set intersection和union的逻辑,但你没有将输入转换为他们使用逻辑的表示。
您无法直接对输入字符串执行操作。你需要在位图上操作。
以下逻辑可以帮助您从字符串中获取位图。
uint8_t Bitmap1[256] = {0};
uint8_t Bitmap2[256] = {0};
for (i=0;input1[i];i++){
Bitmap1[input1[i]] = 1;
}
for (i=0;input2[i];i++){
Bitmap2[input2[i]] = 1;
}
现在您可以使用逻辑来计算集合和交集。
in = 0;
un = 0;
for(i=0;i<256;i++){
in+=Bitmap1[i] && Bitmap2[i];
un+=Bitmap1[i] || Bitmap2[i];
}
// Rest of the logic
以下是输入中有效结果的DEMO。
答案 1 :(得分:1)
un += (source[i] || cible[i]); // allways true you can replace it with un++
in += (source[i] && cible[i]); // allways true you can replace it with in++
在C中,每个值!= 0为真,如果为假,则为零。
所以source[i] || cible[i]
始终为真,因为源[i]和cible [i]总是如此!= 0
相同的source[i] && cible[i]
始终为真,因为表达式的两边都是非零的