J中的Jaccard距离实现

时间:2017-08-09 11:57:44

标签: c algorithm

这是我的代码,为什么字母和其他字母之间的交集和并集总是等于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);
}

2 个答案:

答案 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]始终为真,因为表达式的两边都是非零的