「氣泡排序法」在健檢系統醫師總評有關診斷排序之應用解析

作者/邱敬發

前言 有鑒於近年醫學與科技的進步及教育水準普遍提升,國人對健康照護的期望以及要求也日益升高,使得各醫院的門診健檢診或健檢中心等健檢業務因此迅速成長。爰此,筆者透過參與醫院的健康檢查診「健康檢查報告系統」客制化系統的開發經驗,與讀者分享如何協助醫師與護士,簡化使用「健康檢查報告系統」之輸入流程。 「健康檢查報告系統」包含『健檢報告資料輸入』、『檢驗結果自動判讀』、『防呆功能提醒』、『醫師總評』等各種功能選項,最後於完成報告輸入時,可選擇『健檢報告輸出』功能由印表機列印紙本健檢報告。其中,醫師總評功能是整個系統最核心之功能項目,可輔助醫師於編輯受檢人之各項健檢結果。而在醫師編輯總評的過程中,希望醫師總評功能之功能選項,可以自動帶出完整與整齊的異常診斷情形以及其所相對應的診斷建議,筆者為了提供醫師更方便、快速有效率的使用「健康檢查報告系統」,於是套用了資料結構中最簡易的演算法「氣泡排序法」供醫師使用。 氣泡排序法簡介 在演算法中排序演算法是很重要且很典型的演算法。就演算法所用到的技術或結構來分類,大致可分為五類:
  • 交換法:利用兩個資料做比較,接著交換兩筆資料。
  • 插入法:選取某範圍內的最小或者最大的資料,選擇插入最適當的位置。
  • 選擇法:選取某範圍內的最小或者最大的資料,安排在最適當的位置。
  • 數字法:根據資料的個位數、十位數、百位數…依序安排其資料位置,可得排序結果,不需用到資料的比較動作。
  • 樹狀結構法:利用樹狀結構的特性,進行樹走訪,輸出有次序的資料。
氣泡排序法(Bubble Sort)為最簡單的排序法之一,屬於交換排序法,它的概念為利用相鄰的兩筆資料料Ai和Ai+1,互相比較,如果前面資料比後面資料小,則將兩筆資料交換位置,然後再以同樣的方法比較下兩個相鄰的資料Ai+1和Ai+2,以此往下類推。排序法的圖解如下圖一。

《圖一》氣泡排序法(由大到小排序)
由上圖的分析,我們可知,演算法的程式如下所示(筆者以VB .Net 撰寫):

《圖二》
上述的演算法當中,我們以n代表FirstStrArray的長度,迴圈總共執行了(n-1)+(n-2)+(n-3)+…+2+1=n(n-1)/2次,時間複雜度為O(n^2)。 應用介紹 以病人的健康為最高指導原則下,並且考量到醫師打報告的需求,系統畫面如下:

《圖三》醫師總評畫面(健檢報告區塊、醫師總評區塊)
由圖三可分為兩大區塊,健檢報告區塊:理學(身高、體重、各器官部位的診斷)、檢驗檢查(RBC、WBC、X-Ray等)。醫師總評區塊:只要健檢報告區塊有異常的診斷,系統即自動帶異常診斷到醫師總評區塊,以及診斷對應的建議,醫師亦可在總評區塊做編輯,而醫師總評區塊的診斷排序即是本篇文章的重點。

《圖四》資料佇列,先進先出

《圖五》資料堆疊,先進後出
一般資訊系統的資料結構堆疊或佇列處理,常採用先進先出(圖四)或者先進後出(圖五)等邏輯處理,在健康檢查報告系統中為配合臨床上醫師的需要,檢查項目也由身體的頭部、眼睛、耳朵…排列到泌尿生殖器、肛門、腿部、腳趾頭等。 如果採用先進先出(圖四資料佇列,先進先出)的方法,我們以圖六為例,假設醫師選擇腹部診斷項目,照順序選擇(1)肝腫大(2)脾臟腫大(3)觸診腹部腫塊,排列到醫師總評亦會按照順序排列成:肝腫大&脾臟腫大&觸診腹部腫塊;若醫師不按照順序選診斷,選擇(1)肝腫大(2)觸診腹部腫塊(3)脾臟腫大,醫師總評則會出現:肝腫大&觸診腹部腫塊&脾臟腫大的排列狀況,會造成診斷項目的診斷排列與醫師總評的診斷排列不一致的狀況。 若採用先進後出(圖五資料堆疊,先進後出)的方法,我們還是以圖六為例,醫師選擇腹部診斷項目,照順序選擇(1)肝腫大(2)脾臟腫大(3)觸診腹部腫塊,則排列到醫師總評的順序:觸診腹部腫塊&脾臟腫大&肝腫大,也是造成診斷排列與醫師總評的診斷排列不一致的狀況。 診斷資料處理時,不只需要堆疊佇列或陣列的空間儲存資料,而醫師總評區塊的異常診斷亦需配合身體各器官的順序作排列上的處理,所以我們需要有排序的演算法以配合醫師的操作與診斷排序的需求,而在所有演算法中,最典型最簡單的演算法,而且又不需要處理到大量的診斷資料,選擇了氣泡排序法,套用到醫師總評的診斷排序。

《圖六》醫師總評排列順序依據,由左到右,由上到下

《圖七》單一項目單一建議的診斷排序

《圖八》單一項目不同建議診的斷排序

《圖九》多個項目不同建議的診斷排序
圖六到圖九,我們可以了解總評內的診斷排序:以建議名稱、檢查項目的順序、診斷內容順序為依據而排列。同一列中兩筆以上的診斷,如何判定哪一診斷在前,哪一診斷在後呢?筆者的做法如下:
  • Step 1.先訂定每個診斷的代碼:由檢驗區塊(3碼)+檢驗檢查單號(12碼)+診斷項目排序(3碼)+原本診斷代碼順序(2碼)共20個字碼組成。 檢驗區塊:一般及理學檢查、血液檢查、其他檢查等。 檢驗檢查單號:每一個檢查項目都有一個檢驗檢查單號。 診斷項目排序:每一個診斷項目、檢驗檢查項目都有一個排序。 原本診斷代碼順序:每一個診斷項目有一個以上的診斷資料,每個診斷資料都有她所屬的診斷排序。
  • Step 2. 以建議名稱為條件,尋找醫師總評中是否有符合建議名稱的資料列存在,若符合請跳至Step 4.,否則執行Step 7.。
  • Step 3. 新增一筆資料列,包含診斷名稱、新訂定的診斷代碼、建議名稱,執行Step .。
  • Step 4. 將取得的資料列,先以「;」符號做區隔拆解建議與診斷名稱,接著再以「&」符號做區隔拆解診斷名稱與新訂定的診斷代碼。
  • Step 5. 定兩個筆數相同的陣列,分別放診斷名稱與新訂定的診斷代碼。
  • Step 6. 將兩個陣列丟到氣泡排序法中(有小排到大),重新排列診斷名稱陣列與新訂定的診斷代碼陣列。
  • Step 7. 以新的診斷名稱排列到醫師總評中,最後加上搭配的建議,完成總評內容。
結論 健康檢查系統的醫師總評功能設計的主角是醫師,為了減輕醫師總評上診斷的判斷與操作,以及總評的排序不至於雜亂無章,雖然總評排序呈現整潔,但系統上也非全能,有遇到瓶頸的狀況,因為系統帶診斷是即時的,比如診斷和建議間的以「;」符號做區隔,診斷與診斷間以「&」符號做區隔,若在醫師尚未確認前,於總評內,故意登打符號「;」或「&」,系統處理字串時會發生錯誤的機會發生,畢竟,醫師總評要提供Free Typing又能夠組譯異常診斷,魚與熊掌無法兼得,筆者以工作之便特別整合開發大型醫療院所之門診健檢系統之經驗與讀者共同分享。 (本文轉載自RUN! PC雜誌)