程式設計中左閉右開區間的廣泛應用

(以下僅為個人主觀看法,還請辯證看待!)


 


  見過很多程式碼後不難發現,許多的程式中對於「區間」的設定,總是左閉右開[left,right)。(當然,對於索引什麼的是離散的數值)。

甚至在c,java,python等主流語言中,左閉右開區間也是非常普遍的存在(並不絕對)。

  要是深究使用這種表示的原因,似乎很難說出。但是使用過程中冥冥中總會有一種很方便的感覺。。。

  這裡就例舉幾個例子談談這種表示方式的優勢:

 


 

一、表示索引「0」(是零不是’歐’)

  數組的索引一般都是自然數(0,1,2,3,···),

  那麼假如我們要表示連續的索引比如:3,4,5,6,7,8,9,10,用區間的形式就很方便。可以表示為:

  [3,10]或(2,10]或(2,11)或[3,11]。(區間內的自然數)

  那麼假如只表示單一一個索引呢?比如:5

  那麼只能表示為:

  [5,6)或者(4,5]或者(4,6),此時左右皆閉的區間則無法表示(因為[5,5]不符合數學裡面對於區間的定義,[left,right]其中left<right)

  那麼假如表示0索引呢?

  這時只剩下[0,1)是比較能讓人接受的了。因為假如用”()”表示的話則為(-1,1),而這個-1就很讓人難受···並且對於數組的索引來說一般不用負數。

  所以用[,)左閉右開區間的話,便能夠只用自然數輕鬆表示各種連續的索引了。

二、與數組的下標表示相適應

   在c++中,定義一個數組,例如:

  

int array[10];

  則表示: 一個含有10個元素的整數數組。

  但是它的下標範圍則是:0,1,2,3,4,5,6,7,8,9。此時調用array[10]則報錯。

  而這串下標範圍則可以用區間表示為[0,10);

  對於元素數為N的數組,下標的範圍都可以表示為[0,N)。若用「(,]」來表示的話則為(-1,N-1],則出現了一個惱人的-1和多一個N減去1的步驟。所以這樣看來左閉右開區間和數組的下標機制是非常適合的。

  而且,要遍歷array[]數組(元素個數為N),寫成的for循環也和左閉右開區間聯繫很密切:

for(int i = 0;i < N;++i)
{
    ······;        
}

View Code

   這裡的”i = 0″,”i < N”,分別使用的正好是左閉右開區間的兩個端點。

 三、便於分治演算法的實現

  其實一張形象的圖片就能完美詮釋:

  

 

   將一個左閉右開區間「切割」時,其子區間也能很好的符合左閉右開的形式。例如:

  區間[x,y)可以分割為:[x,z)和[z,y)——無縫連接,沒有重疊。

  假如是全閉區間的話,邊界情況處理起來就比較麻煩。全開區間的話會丟掉端點,邊界情況就要特判。

四、便於表示空集

  (好吧把這個列為一個大點的確有點牽強······)

  與全開區間一樣,當left = right時[left,right)可以表示為空集。(有的是候這種性質真的可以很討巧)

總結:

  把左閉右開當成一種習慣,會慢慢發現很多邊界情況都能巧妙的迎刃而解。要完整全面地講出這種表示方法的優點並非易事,但在不斷的實踐中,便會逐漸體會到其精妙之處。

   最後強調一點:切膠柱鼓瑟,切臨機制變!

  

 

Tags: