2012-09-01 78 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); 
    } 
}