2012-09-01 34 views
2

假设您有这样一个序列:0,1,2,3,4,5,6,7,0,1,2等。基本上由N个数字组成的序列,重复一遍又一遍。循环序列中两个数字之间的距离

寻找这个序列中两个数字之间的距离/差异的最简单算法是什么?例如距离from 5 to 7 is +2和距离from 0 to 6 is -2。对于更高层次的观点,我有一个循环/重复序列号,我需要找出最近路径上的另一个数字“之前”或“之后”的数量(它们之间的最小数目)。

+0

你尝试过什么。迭代时,您发现number1不断迭代距离计数器。如果你发现number2,那么你有距离。如果您发现number1,则重置距离计数器。保存最小距离计数器。对于 - 只需切换这两个数字。 – Paparazzi

+0

我正在寻找快速的方式,我提出的最佳方式是:'n =(from + size) - to;如果n>大小/ 2然后n - =大小'但它涉及一个分支 – thr

+0

是数字总是连续的?我刚刚意识到我看到了一个更复杂问题的答案 –

回答

4

假设X> Y:对于N

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

示例= 7:

DIST(7,5)= {分钟7-5,7-(7-5-1)} =分{2,6} = 2

DIST(6,0)= {分钟6-0,7-(6-0-1)} = {分钟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

这是非常简单的工作与连续和非连续的数字,也许让一个扩展方法:

[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); 
    } 
}