Jaccard距离在C语言中的实现

Jaccard距离在C语言中的实现,c,algorithm,C,Algorithm,这是我的代码,为什么一个字母和另一个字母之间的交集和并集总是等于一,我从这里提取代码,因为我知道两个集合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

这是我的代码,为什么一个字母和另一个字母之间的交集和并集总是等于一,我从这里提取代码,因为我知道两个集合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);
}
#包括
#包括
void main(){
字符源[5]=“salam”;
字符[5]=“Salam”;
int i,in=0,un=0;
浮点数=0;
对于(i=0;i<5;++i){
un+=(源[i]|可解[i]);
in+=(源[i]&&cible[i]);
}
printf(“un::%d\n”,un);
printf(“in::%d\n”,in);
Jaccard=(浮动)in/un*100.0;
printf(“jaccard::%f\n”,jaccard);
}
C中的每个值!=0为真,如果为假,则为零

因此,
source[i]| | cible[i]
总是正确的,因为source[i]和cible[i]总是正确的0 同样的
source[i]&&cible[i]
总是正确的,因为表达式的两边都不是零

C中的每个值!=0为真,如果为假,则为零

因此,
source[i]| | cible[i]
总是正确的,因为source[i]和cible[i]总是正确的0
同样的
source[i]&&cible[i]
总是正确的,因为表达式的两边都是非零的

您选择了集合交集和并集的逻辑,但您没有将输入转换为它们使用逻辑的表示形式

不能直接对输入字符串执行操作。你需要在位图上操作

以下逻辑可以帮助您从字符串中获取位图

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
in=0;
un=0;

对于(i=0;i您选择了集合交集和并集的逻辑,但您没有将输入转换为它们使用逻辑的表示形式

您不能直接对输入字符串进行操作。您需要对位图进行操作

以下逻辑可以帮助您从字符串中获取位图

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
in=0;
un=0;

对于(i=0;请详细说明“不起作用”部分。它怎么不工作?你期望什么输出?你得到了什么输出?如果你还没有,那么请这样做。另外请阅读Eric Lippert的文章,学习如何使用调试器。他认为C天生支持sets@aslimane那么也许你应该用比较来代替?因为
'a'='a'
 1
,而
'a'='b'
将是
0
。除上述所有点外,您的jaccard索引可能仍然错误,因为您没有查看集合(元素的唯一性)。此外,您只是在比较相应的元素。但是,即使是无序排列,集合也会保持不变。也许一个唯一的排序和比较可能会产生适当的结果。比较仍然不是您现在所做的。您将需要两个单独的索引。如果您只有字母数字字符,只需维护一个位图。请详细说明关于“不起作用”部分。它怎么不工作?你期望什么输出?你得到了什么输出?如果你还没有,那么请这样做。另外请阅读Eric Lippert的文章,学习如何使用调试器。他认为C天生支持sets@aslimane那么也许你应该用比较来代替?因为
'a'='a'
 1
,而
'a'='b'
将是
0
。除上述所有点外,您的jaccard索引可能仍然错误,因为您没有查看集合(元素的唯一性)。此外,您只是在比较相应的元素。但是,即使进行了无序排列,集合也会保持不变。也许一个唯一的排序和比较可能会产生适当的结果。比较仍然不是您现在所做的。您将需要两个单独的索引。如果您只有字母数字字符,请维护位图。