1. 程式人生 > >判斷兩個區間範圍是否重複

判斷兩個區間範圍是否重複

工作一年,工作中接觸的大部分都是些基礎知識,基礎的東西到處都有,我就不重複整理了。之前在系統中寫過一個判斷兩區間是否重複的方法,當時寫完後執行沒問題,再到後來看《編寫可讀程式碼的藝術》時,發現換個角度思考還有更好的辦法,於是準備整理了這篇、也是我在這裡的第一篇部落格。

問題背景:類似收費系統,不同的操作員需要領取不同號段的發票進行收銀、列印,由於發票號在銷售記錄和明細中都作為主鍵,因此在領用發票時需要進行判斷,領用的號段不能與之前的重複。

解決思路:如下圖,很容易能夠想到兩個區間相交的幾種情景:
區間相交的幾種情景
將要判斷相交的兩區間分別記作[x1,x2)和[y1,y2),其中x1 < x2,y1 < y2,那麼兩區間相交就有以下幾種情形:
A) y1 < x1 並且 y2 > x2;
B) y1 < x1 並且 y2 > x1;
C) y1 > x1 並且 y2 < x2;
D) y1> x1 , y2 > x2 並且 y1 < x2;

直接將上述條件應用到程式中則可以正確判斷是否有重複。
例,在資料庫中表T為儲存發票領用資訊表,每條資訊記錄一次發票領用情況,有發票的起始號SN,和終止號EN,需要領取的發票號段的起始號為ll_start,終止號為ll_end,以PB語言為例,有:

long ll_count,ll_start,ll_end
/* 給ll_start , ll_end賦值 */

select count(*)
into   :ll_count
from   T
where  (SN < :ll_start and EN > :ll_end)
or     (SN < :ll_start and
EN > :ll_start) or (SN > :ll_start and EN < :ll_end) or (SN > :ll_start and EN > :ll_end and SN < :ll_end); /*省略對sqlcode的判斷*/ if ll_count > 0 then //查出資料證明原有記錄和新記錄有交集 messagebox('提示','號段重複!') end if

工作中遇到此問題時,簡單思考之後便寫了上述程式碼,正常情況下也不會出錯,直到看了《編寫可讀程式碼的藝術》一書,正好舉到了這個例子[1],並且給出了更“優雅”的方法。重新分析之前的程式碼,暴露的問題也很明顯:判斷條件過多不夠簡潔,對以後程式碼維護帶來不便。

結合書中的例子和實際情況,從“反方向”來重新思考這個問題,之前按正常思維找出了有重複的記錄,那麼反過來看不重複的區間有什麼特點,不難看出,不重複的區間滿足以下條件:1.另一個範圍在這個範圍開始前結束;2.另一個範圍在這個範圍結束後開始,如圖:
區間不相交的情形
即不重複的情形:
A) X2 < Y1;
B) X1 > Y2;
明顯地此時判斷條件比之前簡單了很多,程式碼如下:

long ll_count,ll_start,ll_end
/* 給ll_start , ll_end賦值 */

select count(*)
into   :ll_count
from   T
where  not (:ll_start > EN or :ll_end < SN);
/*省略對sqlcode的判斷*/

if ll_count > 0 then   //查出資料證明原有記錄和新記錄有交集
    messagebox('提示','號段重複!')
end if

後續對該問題的進一步思考:例子中每次判斷都通過sql直接查詢資料庫中的全部記錄,由於發票領用都有一定順序,能否只取出幾條關鍵記錄來進行判斷而不影響正確性?

最後,其實這只是一個很簡單的數學問題,但到實際應用到的時候感覺變得不是那麼太簡單了,總結這個例子主要還是想說,遇到問題換個角度來思考,說不準會有新的發現。
最後的最後,這是在CSDN上寫的第一篇部落格,而且部落格這東西感覺已經很少用了,不知道會不會有人看到,也不知道上面寫的有沒有疏忽寫錯的,如果有人看了發現有問題也歡迎指出!

參考文獻:
[1]《編寫可讀程式碼的藝術》,Dustin Boswell,Trevor Foucher

相關推薦

判斷區間範圍是否重複

工作一年,工作中接觸的大部分都是些基礎知識,基礎的東西到處都有,我就不重複整理了。之前在系統中寫過一個判斷兩區間是否重複的方法,當時寫完後執行沒問題,再到後來看《編寫可讀程式碼的藝術》時,發現換個角度思考還有更好的辦法,於是準備整理了這篇、也是我在這裡的第一篇部

(演算法)判斷區間是否重疊

題目: 判斷兩個區間是否重疊 思路: 假設區間表示為[start,end],先存在兩個區間A,B. 兩個區間的關係有兩種:重疊與不重疊 重疊的情況有4種,兩種相交,兩種包含(很容易想到,此處不示意) 不重疊有兩種情況:A在B前面,A在B後面 因此很容易得到判斷區間重疊的方法: 1、正向判斷,列

判斷區間是否重疊_總結

(1)問題:假設有兩個區間M(s1, e1)和N(s2, e2),如何判斷兩個區間是否有交集?(2)解答:命題A: M和N相離,且M在前N在後。(當 s2 > e1時成立)命題B: M和N相離,且M在後N在前。  ( 當 s1 > e2時成立)如果命題(A or

判斷區間有無交集

有兩個區間A[a1,b1], B[a2,b2],判斷這兩個區間有沒有交集。我們可以分為兩種思維來判斷: 1. 正向思維:判斷所有相交的情況 /**判斷所有可能相交的情況 * 1

SQL判斷日期時間區間是否有相交

需求:找出時間A到B時間段是否已經請過假了,或者這個期間已經請過假了select count(id) from tblName where ...and ( (cast(concat(date_from,' ',time_from) as timestamp)    >

判斷時間區間是否存在交集-Java實現

以下demo用於判斷兩個時間區間是否存在交集. 程式碼如下: ============================================================== package com.tgy.demo; import java.text.Simp

[java]用md5來判斷文件是否完全相同

tle name stub https pem puts 試用 多圖 ring 1.前言   由於相比較兩張圖片是否是相同,如果通過像素點比較感覺速度比較慢,當很多圖片進行比較時,效率就低很多了。由於每個文件md5基本上是唯一的,所用用獲取文件的md5來判斷是否相同文件。

判斷雙精度浮點數是否整除!

防止 src 溢出 客戶端 market nbsp 道理 有效 無法   這幾天在開發公司項目中,由於屬於期貨產品,所以在此過程中遇到價格和最小單位價格的除法計算。 眾所周知浮點數在計算機中為近視值。比如價格,客戶端輸入的價格為145.5,但是我的服務端斷點顯示為145.4

js判斷變量是否相等

logs utf-8 meta set script col tex nbsp 判斷 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U

java判斷單鏈表是否相交

fast n) detail 無環 etl ++ code 數據 enter 轉載於:http://blog.csdn.net/happymatilian/article/details/47811161 思路: 鏈表分有環鏈表和無環鏈表,如果兩個鏈表存在相交

五層結構 判斷IP是否處於同一子網?

網絡管理 主機ip .cn 文件 七層 smt 無限 可靠傳輸 log 互聯網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層 應用層(各種協議) 端口 H

[fzu 2273]判斷三角形的位置關系

相交關系 cmp 兩個 php exp pac ati nbsp con 首先判斷是否相交,就是枚舉3*3對邊的相交關系。 如果不相交,判斷包含還是相離,就是判斷點在三角形內還是三角形外。兩邊各判斷一次。 //http://acm.fzu.edu.cn/problem.p

字符串問題之 判斷字符是否互為旋轉詞

pre 一個 rotation style class dex null test spa 把一個字符串str 前面任意的部分挪到後面形成的字符串叫做str的旋轉詞 舉例, a="cdab" b="abcd" 返回true a="1ab2"

python判斷list包含關系

nbsp 判斷 span bsp pan 包含 spa num list a = [1,2] b = [1,2,3] c = [0, 1] set(b) > set(a) set(b) > set(c) python判斷兩個list包含關系

C#.NET常見問題(FAQ)-如何判斷類是否相同類型

cnblogs 空間 ont -s 交流 在線 下載 c# 教學視頻 可以用is方法判斷是否是一個類 ?更多教學視頻和資料下載,歡迎關註以下信息: 我的優酷空間: http://i.youku.com/acetaohai123 ?我的在線

Overlapping rectangles判斷矩形是否重疊的問題 C++

nsis enter load upload second eno 兩個 top traints Given two rectangles, find if the given two rectangles overlap or not. A rectangle is de

Java_Date_01_判斷時間相差的天數

lan tle pos www. 參考 div 時間 com tails 二、參考資料 1.java 判斷兩個時間相差的天數 2.java計算兩個日期之間相差天數和相隔天數詳解Java_Date_01_判斷兩個時間相差的天數

怎麽判斷對象是否完全相等

urn ins 了解 instance 兩個 next col 不想 for 大家都知道,js沒辦法判斷對象是否相等,因為在js引擎看來,不同的對象實例就是不相等,因此我寫了個方法來判斷是否對象是否相等 思路就是不對遞歸,遇到不想等的就設置為false: function

[leetcode]242. Valid Anagram判斷字符串是不是包含相同字符的重排列

思路 har urn pos 兩個 字符串 就是 true etc /* 思路是判斷26個字符在兩個字符串中出現的次數是不是都一樣,如果一樣就返回true。 記住這個方法 */ if (s.length()

C# 判斷集合(List)是否相等

getc tcollect color 是否 rep 復雜度 etl blog 重復項 1.兩個list如果有重復元素(如List1: a,b,a List2: b,b,a) 是無法通過包含關系來判斷是否相等的. 有兩個辦法,其一是兩個List排序後再按順序比較.另一個辦