如何计算两个整数之间的相似度?

5
实际上很难描述:
我想实现一个算法,它将两个给定的整数/数字(具有相同的“长度”)的同一位置的数字(因为我在十进制系统中进行计算,它更像是相同的“十的幂”)进行比较。 它应返回以下等级的相等性:
  • 4491和1020 = 0
  • 4491和4123 = 1
  • 4491和4400 = 2
  • 4491和4493 = 3
  • 4491和4491 = 4
  • 4491和4091 = 1

我不想基于字符串比较进行计算,因为我将在一个更大的场景中进行此操作 :)


2
刚刚注意到这个有歧义了... 4491和4091会得到1还是3? - Rawling
@Rawling 刚刚更新了我的问题! - user57508
那真是我的幸运猜测 :) - Rawling
6个回答

3
public static int Compare(int i1, int i2)
{
    int result = 0;
    while(i1 != 0 && i2 != 0)
    {
        var d1 = i1 % 10;
        var d2 = i2 % 10;
        i1 /= 10;
        i2 /= 10;
        if(d1 == d2)
        {
            ++result;
        }
        else
        {
            result = 0;
        }
    }
    if(i1 != 0 || i2 != 0)
    {
        throw new ArgumentException("Integers must be of same length.");
    }
    return result;
}

注意:它不处理负整数
更新:在问题更新后已修复

我喜欢这个(在我的解决方案失败后...)。如果数字长度不同,它会怎么做? - Rawling
2
好的,这个还没有处理(虽然很容易添加)。OP没有为这种情况定义任何行为,所以我会抛出一个异常。 - max
好的,你得到了我的赞同。希望其他人也能注意到这一点。 - Rawling

1

查看此SO问题的答案

您可以通过第一种方法拆分数字,并从第二种方法中获取相似度:

int[] GetIntArray(int num)
{
    List<int> listOfInts = new List<int>();
    while(num > 0)
    {
        listOfInts.Add(num % 10);
        num /= 10;
    }
    listOfInts.Reverse();
    return listOfInts.ToArray();
}

int GetSimilarity(int firstNo, int secondNo)
{
    int[] firstintarray = GetIntArray(firstNo)
    int[] secondintarray = GetIntArray(secondNo)
    if (firstintarray.Count != secondintarray.Count)
    {
        throw new ArgumentException("Numbers Unequal in Length!");
    }
    int similarity = 0;
    for(i = 0; i < firstintarray.Count; i++)
    {
        if (secondintarray[i] = firstintarray[i])
        {
            similarity++;
            continue;
        }
        break;
    }
}

现在你可以像这样比较两个整型数组:
int Similarity = GetSimilarity(4491, 4461);// Returns 2

有趣...但是太多的数组处理会降低性能... - user57508

1

对于所有X和Y不相等的情况:

Length - Math.Floor(Math.Log10(Math.Abs(X - Y)) + 1)

4491和1020

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 1020)) + 1) = 0

4491和4493

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 4493)) + 1) = 3

主要与http://stackoverflow.com/a/10601394/57508相同,但修复了`log(1, 10)`的问题 :) - user57508
仍然无法通过 44894491 的测试。 - Rawling

1

在我的最后一次尝试之后,只是想尝试从这个问题中挽回些什么...

int Compare(int x, int y)
{
    int pow10 = (int)Math.Pow(10, Math.Floor(Math.Log(Math.Max(x, y), 10)));
    int matches = 0;
    while(pow10 > 0 && (x / pow10) == (y / pow10))
    {
        matches++;
        pow10 /= 10;
    }
    return matches;
}

0

看起来Levenshtein Distance是合适的。这是衡量两个字符串之间差异的标准方法。在您的情况下,这些字符串是数字的十进制表示。


我认为Levenshtein算法不适用于这个问题。 - Jorge

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接