• 沒有找到結果。

3.4 多媒體教材單元的相依性關係

3.4.2 多媒體教材單元資料結構與演算法

針對圖12 的 DAG 模型,為兼顧分析上的容易度及演算效率,我們採用將 DAG 轉為多元樹狀結構(Multiple Trees Structure) 方式做分析,並建立以鏈結串 列(Link-List) 為基礎的資料結構來追蹤各單元節點的相依性關係(Dependency Relationship)。為了解說方便,在本節中我們以 "節點"來表示多媒體教材單 元。首先我們建立 DAG 中的節點的資料結構,以名稱 ITEMdata 表示,

ITEMdata 是自定義的類別變數。此類別變數中包含該節點的編號、標題、驗證 旗標以及連結到其他節點的串列類別型態,其中節點編號(ID) 在 DAG 中必需 是唯一的,以作為辨識依據,而變數 LEVEL 是整數型態用於紀錄此節點是教 材中的章節、SCO、劇情、分境表、場景或是演員。變數 NEXT 是連接到同一 階層(即 LEVEL 相同)的下一節點,OUTdata 則是連接到下一階層(LEVEL+1) 的起始節點。在實際應用中 ITEMdata 可以加入任何所需要的資料型態組合,

圖13 是基本的 ITEMdata 建構子(Constructor) 函式的虛擬碼。

1 class ITEMdata 2 {

3 String ITEM;

4 String ID;

5 int LEVEL;

6 boolean VERIFICATIONflag; // verification flag 7 ITEMdata NEXT; // next node

8 ITEMdata OUTdata; // output level node 9

10 ITEMdata(String ITEMin,String IDin,int LEVELin) 11 {

接著,定義一個名稱為 GRAPH 的 ITEMdata 陣列型態的變數代表整個

1 boolean SEARCH(ITEMdata SOURCEitem,String ITEMid) 2 {

此處必須要用到複製節點功能,其作法是先利用 ITEMdata 物件的建構子 (Constructor) 產生一個新節點,再將要被複製的原始節點的屬性 Attribute) 逐一指 定給新節點,最後將此新節點當作回傳物件傳回給呼叫端,演算法如圖15 所示。

1 ITEMdata COPY_NEW_ITEM(ITEMdata SOURCEitem) 2 {

3 ITEMdata NEWitem=new ITEMdata(null,null,0);

4

開始

圖 17 : GRAPH 的初始狀態示意圖 (二) 加入 SNE1 節點

GRAPH[0] 指向 SNE1 節點,如圖18 所示。

圖 18 : 加入 SNE1 到 GRAPH 的狀態示意圖

(三) 加入 NLS1 節點

GRAPH[1] 指向 NLS1 節點,並且複製 NLS1 成為一個新節點將其連結到父 節點串列的 SNE1 的 OUTdata 串列,如圖19 所示。

圖 19 : 加入 NLS1 到 GRAPH 的狀態示意圖

(四) 加入 NLS2 節點

NLS1 的 NEXT 指向 NLS2 節點,並且複製 NLS2 成為一個新節點將其連 結到父節點串列的 SNE1 的 OUTdata 串列尾端,如圖20 所示。

圖 20 : 加入 NLS2 到 GRAPH 的狀態示意圖

(五) 加入 NLS3 節點

NLS2 的 NEXT 指向 NLS3 節點,並且複製 NLS3 成為一個新節點將其連 結到父節點串列的 SNE1 的 OUTdata 串列尾端,如圖21 所示。

圖 21 : 加入 NLS3 到 GRAPH 的狀態示意圖

圖22 是建立以 GRAPH 為進入點的多元樹狀結構模型的演算法。 其中第 7 列到第 8 列是判斷 GRAPH 中指定的索引階層是否已有節點串列,若還沒有節點 串列(該索引階層指向 NULL),則將新加入的節點直接指定給 GRAPH。第 9 列 到第 26 列是當 GRAPH 已經有節點串列,則搜尋此節點串列中是否已有此節 點,若已有此節點則不重複加入。若還沒有,則將此節點加入到節點串列的尾端。

第 28 列第 46 列則是在建立上一層的父節點的 OUTdata 串列作類似的操作。經 過上述過程建立的模型,在串列中的節點不會重複出現,所以在後續做節點的新 增、刪除、修改、搜尋等動作時,大幅降低了運算的複雜度並且有效提昇了操作 效率。

1 ITEMdata ADD(String ITEM,String ITEMid,String PARENTid,int LEVEL) 2 {

3 ITEMdata SAMEdata = null,PREdata = null,DATAptr = GRAPH[LEVEL],NEWdata,OUTptr;

4 FOUND ← false;

5 HASsame ← false;

6 NEWdata ← new ITEMdata(ITEM,ITEMid,LEVEL);

7 if (DATAptr == null)

27 if (HASsame == false) NEWdata ← NEWdata.COPY_NEW_ITEM(NEWdata);

28 if (LEVEL != 0)

四、系統實作與導入

相關文件