2013-05-02 69 views
3

我希望能夠加載長整數範圍的正整數列表,並創建一個新的「彙總」範圍列表,該列表是每對範圍的交點的並集。而且,我想在Perl中做到這一點。例如:Perl - 確定幾個數字範圍的交集

Sample ranges: (1..30) (45..90) (15..34) (92..100) 

Intersection of ranges: (15..30) 

我能想到用一束嵌套if語句來確定樣品A,樣品B,樣品C,等等的起點,並找出這樣的重疊的唯一的方法,但不可能用數百個樣本來完成,每個樣本都包含很多範圍。

任何建議表示讚賞!

+0

下面是可能有所幫助的答案:http://stackoverflow.com/questions/7842114/get-the-intersection-of-two-lists-of-strings-in-perl – squiguy 2013-05-02 15:30:07

+0

這將工作很好的工作個人座標,但我不確定確定座標範圍的重疊部分是否可行 – jake9115 2013-05-02 15:35:53

+2

這裏所有範圍的交點都是空的 - (45..90)和(92..100)不與(15 ..30)。 – hobbs 2013-05-02 15:37:10

回答

5

當您需要做某件事時,您應該做的第一件事是看看CPAN以查看有人已經爲您解決了您的問題的工具。

Set::IntSpanSet::IntRange位於CPAN「set」結果的第一頁。


你需要的是每一對範圍的交集的工會,所以算法如下:

  1. 創建一個空的結果集。
  2. 爲每個範圍創建一個集合。
  3. 對於每個列表中的設定,
    1. 對於列表中的每個後組,
      1. 查找這兩個集合的交集。
      2. 查找結果集和此交集的聯合。這是新的結果集。
  4. 枚舉結果集的元素。
+0

您是否介意詳細說明或發佈一些示例代碼?我是Perl新手,不太明白如何實現這些工具 – jake9115 2013-05-02 15:45:48

+0

當然。你有什麼問題? – ikegami 2013-05-02 15:56:15

+0

所以原諒我的經驗不足,但告訴我,如果我在正確的軌道上:我會使用$ set = new Set :: IntSpan @set_specs來創建這個$ set對象使用範圍的數組(存儲在@set_specs)。這些範圍應該如何格式化爲陣列中的每個條目?之後,我可以使用$ i_set = intersect $ set $ set_spec來存儲$ i_set中的所有交點? – jake9115 2013-05-02 16:04:31

0

我沒有要共享的代碼,但我會將每個範圍擴展爲哈希,或者使用Set模塊,然後對集合使用交集操作。