向燕飛
高校的計算機專業為本科生都開設了數據結構課程,它是計算機學科知識結構的核心和技術體系的基石,在研究生考試中也是必考科目。隨著科學技術的飛速發展,數據結構的基礎性地位不僅沒有動搖,反而因近年來算法工程師的高薪形勢,而得到了業內空前的重視。計算機在處理數據之前,先要處理的是數據的組織和存儲。而數據結構正是計算機存儲、組織數據的方式。
按傳統的教學模式,在交流學習算法時,很多的學生會反映數據結構晦澀難懂,廣東東軟學院近幾年在專業核心課程和專業基礎課程中大力推廣“翻轉課堂”和“線上線下混合”教學改革,以行為主義和建構主義為指導理論,關注學生的學習行為和學習過程,注重學生的知識獲取、建構與生成,《數據結構與算法》課程近幾年按照省級一流本科課程的標準來重點建設。在建設過程中運用了多種教育理念和教學方法,布魯姆教育目標分類法和案例教學是其中之一。
布魯姆教育目標分類法是一種教育的分類方法[1],根據教育目標從低級到高級可以分為6個水平:知道、領會、應用、分析、綜合、評價。該教育方法指出,問題有簡單和復雜,按照學習目標分層次提出問題,6 種類型的問題中,前三類是屬于初級層次的認知問題,它一般有直接的、明確的、無歧義的答案,而后三類問題屬于高級認知問題,通常沒有唯一的正確答案,從不同的角度有不同的回答。
在這一教育理論指導下,教師在教學設計中,提倡課堂教學不能僅僅局限于初級認知的問題,在適當的時機,高級認知問題更能夠激發學生的思維,從而培養學生的思維能力、觀念和自我評價體系[2]。按學習目標的要求,遵循循序漸進的學習規律,分層次設計教學內容,同時在設計案例上,從簡單逐漸到復雜,設計認知性、理解性和應用性等任務層次遞進。
基于“教育目標分類法”的理念,結合數據結構與算法課程的特點,對課程框架進行重組,梳理知識點,并為每一個知識點進行案例設計,這里以《數據的邏輯結構與存儲結構》這一知識點為例進行應用說明。
整體的教學策略,通過“問題引入,案例分析,任務驅動”的教學流程來組織整堂課。
首先將目標分解為以下三層,并為各層設計相應的教學活動以及評估的標準,如表1 所示。
以“如何在書架上擺放圖書”的問題為例:給了你一堆書架,然后又有一堆書進來,你要怎么把它們放到書架上去呢?就如計算機處理數據,給了一堆數據,然后又給了一些存儲空間,你要怎么把這些數據存起來呢?通過這樣引入計算機處理數據要考慮的兩方面,一是數據間的邏輯關系,二是存放的存儲結構。在學生各種經驗分析之后,教師給出“其實這個問題是不科學的”。為什么呢?因為不確定給的書架是長什么樣的。當考慮一個數據怎么組織的時候,其實跟這個數據的規模有關系,也跟放好之后要做什么事情有關,也就是說要考慮對它們的操作。由此引入了知識點的學習,什么是數據結構的邏輯結構和邏輯結構。

表1 教學目標分解和掌握程度評估
設計案例,圖書編號管理問題(一對一的線性關系),人機對奕中用到的算法(一對多的非線性關系)以及地圖著色處理(多對多的非線性關系),讓學生在分析過程中理解線性和非線性的邏輯關系。在此案例上,進一步分析“大規模的書,怎么存放?”給出三個方案:
方案1——隨便放,看書架哪里有空位就放哪;
方案2——按照之前的編好的號在書架上一本挨一本順序來放;
方案3——把書架劃分成幾塊區域,每塊區域指定擺放某種類別的圖書;在每種類別內,按照書名的拼音字母順序排放。
分析3 個方案的擺放后,查找一本《算法之美》的書,和新增了一批書,需要擺放上去操作的優缺點。第一種方案可能造成查找效率極低!第二種方案造成插入新書很困難!第二種方案可能造成空間的浪費!通過3 個方案的對比,學生能深刻地理解解存儲數據的方式影響著對數據的處理和操作,順其自然地進入到存儲結構的學習中。
設計學生活動:
活動1——學生分配座位的游戲,一種是按學號挨個坐,還一種是隨意坐,但是每個學生記住下一個學生坐哪里。對于查找一個學生和增加、刪除一個學生的操作,讓學生分析哪種座位分配方案更便捷。
活動2——例舉在生活中的例子,體現的是順序存儲和鏈式存儲;
設計意圖在于提高學生積極性,把抽象的理論對比模擬成真實的場景,加深學生理解兩種存儲結構各有什么優缺點。為之后的線性表在不同存儲結構下基本操作的理解和代碼實現都打下了基礎。
在這一環節中,緊扣知識點,設計實踐案例,由教師引導,學生為主體完成。
案例描述:某電信部門想開發一個查詢企業電話的程序,要求對于給出的一個企業名稱,若該企業已注冊,則找到其號碼,否則指出沒有注冊。
任務要求:考慮各企業的服務電話直接采用線性還是非線性的邏輯關系?采用順序還是鏈式存儲?寫出詳細的算法步驟,畫出流程圖,完成電話號碼查詢的編程。
學生完成案例的過程中,討論分析,給出具體求解步驟,方法不唯一,以下范例:
步驟1.首先構造一張信息表。考慮表中每條記錄存放的數據項有哪些?
步驟2.將電話號碼表存儲到計算機中,可選擇二維數組來存儲;
步驟3.根據問題需求,確定查找算法,即根據名稱,顯示號碼;步驟4.確定存儲結構及算法的實現方法,寫出代碼。
這樣的設計意圖在于培養學生將數據結構作為一種思維工具解決處理現實問題的能力。
在這個一環中,設計對應的案例,可以是討論型的,也可以是編程求解型的。
討論版塊:對中等規模、大規模的圖書擺放,你有什么更好的建議,可否結合不同的存儲方式來取長補短?
提出這個問題,實際上是想讓學生思考,在考慮大規模數據存儲的時候會遇到什么問題,以及如何根據功能(也就是關聯的算法,最常見的就是插入、查找、刪除)需要設計存儲方式。
課堂總結環節先由學生做小結,這樣有利于提高學生的歸納總結能力,教師再總結,提煉本次課的重難點,在學習過程中應注意的地方。測評訓練通過PTA(程序設計實驗輔助教學平臺)來針對不同的目標檢測學生的掌握程度,題目分為初級、中級和高級。有對應的輸出樣例,能以得到的信息為準則作出判斷,完成學習評價。
設計課外綜合項目:項目1:曬一下PrintN 在你的機器上運行的結果?項目2:Maximum Subsequence Sum(2004 年浙江大學計算機專業考研復試真題)最大子列和問題,設計不同算法,分析效率。通過學生組隊方式,以“項目分析―項目設計―成果匯報―總結評價”模式為主線,小組依托教學資源,自行查閱資料,成員間互相幫助,教師參與小組研討,分析設計與實現方案。
《數據結構與算法》是理論與實踐并重的計算機專業的核心課程,該課程知識體系難度較大,通過運用教學目標分類法來對課程內容進行重構和案例設計,基于任務驅動式的“線上線下混合”教學模式改革[3],更注重對能力的培養。從實踐來看,近幾年的課程大大改善以往的“難教和難學”的現象,學生懂了算法思想,碰到實際問題卻不知道如何著手編程的普遍現象得到了很大改善,PTA 平臺統計的學生刷題量和通過率每年也在提高。每次測試和考試都具備自動數據分析功能,作為檢驗教學的有效證明。