假设您有一个这样的序列:0、1、2、3、4、5、6、7、0、1、2 等。基本上是一个由 N 个数字组成的序列,一遍又一遍地重复。
查找此序列中两个数字之间的距离/差异的最简单算法是什么?例如距离from 5 to 7 is +2
和距离from 0 to 6 is -2
。对于更高级的视图,我有一个循环/重复序列号,我需要找出最近路径上另一个数字的“之前”或“之后”有多少(它们之间的数字最少)。
假设 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
大于第二个时,距离为负。
这很简单,可以使用连续和非连续数字,也许可以使其成为扩展方法:
[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);
}
}