2012-08-08 41 views
5

我有一個範圍列表。每個範圍都有一個從和到的值,這意味着該值可以在該範圍之間。例如,如果範圍是(1,4),則值可以是1,2,3和4.現在,我需要在給定的範圍列表中找到不同的值。以下是示例代碼。有效的邏輯從c#2.0中的一系列值中獲取不同的值

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Range> values = new List<Range>(); 
     values.Add(new Range(1, 2)); 
     values.Add(new Range(1, 3)); 
     values.Add(new Range(1, 4)); 
     values.Add(new Range(3, 5)); 
     values.Add(new Range(7, 10)); 
     values.Add(new Range(7, 8)); 

     // Expected Output from the range of values 
     //1,2,3,4,5,7,8,9,10 
    } 
} 
class Range 
{ 
    public Range(int _form, int _to) 
    { 
     from = _from; 
     to = _to; 
    } 
    private int from; 

    public int From 
    { 
     get { return from; } 
     set { from = value; } 
    } 

    private int to; 

    public int To 
    { 
     get { return to; } 
     set { to = value; } 
    } 

} 

我可以遍歷每個範圍並找到不同的值。但如果有人能夠提供一個有效的方法,這將會有所幫助。

+0

'_from'和'_to'的最小值和最大值是多少? – 2012-08-08 14:29:09

+0

這是功課..?昨天在網上發佈了同樣類型的問題.. – MethodMan 2012-08-08 14:30:22

+0

不太確定我明白你在這裏問什麼。你的意思是你想找到不同的*範圍*或從範圍中選擇的值? – James 2012-08-08 14:31:39

回答

4
  • 對於少量的間隔,直接的方法應該做的伎倆。
  • 如果大多數間隔摺疊成彼此,可以執行將它們合併,以減少測試
  • 如果不相交間隔的數量是高的,建立一個Interval Tree數目的預備步驟。這裏是一個link到一個文章與Java代碼示例。
1

請考慮以下解決方案(我不會寫完整的代碼,只是一般的路線):

  • 爲每個到來的範圍內調整MINVAL和MaxVal最大值變量 - 在所有範圍內舉行最小值,在所有範圍最大值分別
  • 構建傳入範圍的兩個集合,讓一個名字是Begins,另一個Ends
  • 所有範圍之後被收集排序兩個集合:Begins應進行排序,根據噸Òfrom值和Ends應根據to值進行排序
  • 初始化depth計數器變量爲0
  • 初始化BeginPointerEndPointer到相應集合的第一元件
  • 現在關鍵部分:從MinVal迭代到MaxVal,如果當前值表示收集開始(當前BeginPointer的編號等於迭代值) - >將depth增加1並且向前移動BeginPointer(對於連續的「開始」)重複
  • 如果depth是大於0 - >打印當前迭代值,因爲我們裏面的一些範圍
  • 如果當前值表示集合的結束 - >減1 depth(重複連續的「末梢」)

這將爲甚至是大範圍的價值觀而做。如果最大值相對較低(即1000,如OP中所示,請參考我的其他答案)。

1

如果_from_to的範圍很小(如圖所示1000),則可以使用布爾值的數組[1000]。對於每個傳入的Range,將相應的數組元素設置爲true。即對於範圍(3,6),將數組元素3,4,5和6設置爲true。現在迭代數組並打印每個真實的索引。對於小範圍應該足夠高效。