程式設計中左閉右開區間的廣泛應用
(以下僅為個人主觀看法,還請辯證看待!)
見過很多程式碼後不難發現,許多的程式中對於「區間」的設定,總是左閉右開[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)可以表示為空集。(有的是候這種性質真的可以很討巧)
總結:
把左閉右開當成一種習慣,會慢慢發現很多邊界情況都能巧妙的迎刃而解。要完整全面地講出這種表示方法的優點並非易事,但在不斷的實踐中,便會逐漸體會到其精妙之處。
最後強調一點:切忌膠柱鼓瑟,切記臨機制變!