循环序列中两个数字之间的距离

时间:2012-09-01 19:29:08

标签: c# .net algorithm math

假设您有这样的序列:0,1,2,3,4,5,6,7,0,1,2等。基本上是由N个数字组成的序列,一遍又一遍地重复。

在此序列中找到两个数字之间距离/差异的最简单算法是什么?例如距离from 5 to 7 is +2和距离from 0 to 6 is -2。对于更高级别的视图我有一个循环/重复序列号,我需要找出最近路径上的另一个数字“之前”或“之后”多少(它们之间的数字最少)。

2 个答案:

答案 0 :(得分:4)

假设X> Y:

dist(X, Y) = min { X-Y, N-(X-Y-1) }

N = 7的例子:

dist(7,5)= min {7-5,7-(7-5-1)} = min {2,6} = 2

dist(6,0)= min {6-0,7-(6-0-1)} = min {6,2} = 2

dist(5,1)= min {5-1,7-(5-1-1)} = min {4,4} = 4

最后一个例子指出了距离定义中的一个小缺陷:dist(5,1)= 4或dist(5,1)= -4?我已经改变了你的定义以避免负距离(所以我的算法计算距离的绝对值)。如果你想保留你的定义,那么当且仅当min的第一个参数大于第二个参数时,才使距离为负。

答案 1 :(得分:-1)

这很简单,适用于连续和非连续的数字,也许可以使它成为一种扩展方法:

[TestFixture]
public class NumbersFixture
{
    [Test]
    public void FindDistance()
    {
        var numbers = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2 };

        var num1 = 6;
        var num2 = 0;

        var from = numbers.IndexOf(num1);
        var indexFound = numbers.FindIndex(from, f => f == num2);
        var distance = from - indexFound;

        var result = string.Format("{0}", distance);
        Console.WriteLine(result);
    }
}