楊 洋,孔 敏,符茂勝,賈朝川
(皖西學院 電子與信息工程學院,安徽 六安 237012)
“算法與數據結構”是一門研究非數值計算的程序設計問題中計算機的操作對象以及它們之間的關系和操作的學科[1-2]。課程主要包含了三種截然不同的抽象數據類型,它們由高級語言中基本數據類型構造而來,分別是:線性表、樹和圖。課程分別從順序存儲結構和鏈式存儲結構兩個方面,討論了每種抽象數據類型的定義、數據關系及相關算法操作。課程還討論了查找和排序的各種實現方法,并著重對各方法的時間復雜度和空間復雜度進行分析和評價。但該課程知識抽象、內容繁雜、理解難度大,如不改進教學方法,沿襲傳統方法進行理論講授和實驗驗證,教學效果明顯欠佳。
“算法與數據結構”課程在計算機科學與技術專業的學習過程中具有重要的地位,涉及的學科范圍廣。新的術語和關鍵字很多,尤其是包含不少概念相近的名詞,極其容易混淆。作為初學者,學生對新的課程基本不了解,不知如何入手學習,很可能對課程心存畏懼。由于不清楚學習算法后如何解決實際問題,學生的學習目標不明確,導致缺乏學習主動性、積極性,學習效果較差。
“算法與數據結構”課程的抽象性極強,從邏輯結構的定義、物理結構的搭建到偽代碼的實現,都要求學生具有較強的抽象思維能力。如果不進行適當的引導,學生會對該課程產生誤解,覺得這門課是理論型課程[3]。尤其是教材里都是偽代碼,無法看到各算法的直接運行結果,沒有直觀感受,因此課堂氣氛沉悶,學生對課程喪失興趣,進而產生排斥,導致了惡性循環。
“C語言程序設計”是“算法與數據結構”的先修課程,課程中的很多章節都涉及 “算法與數據結構”課程的知識。例如,數組在各抽象數據類型的順序存儲結構中的使用,指針在鏈式存儲結構中的重要性,結構體幾乎是每個類型定義和算法的組成部分等等[4]。如果學生先修課程掌握得不牢固,不透徹,那么在“算法與數據結構”課程的學習中,自然會遇到很多障礙。這就必然要求對C語言相關知識進行復習,保證學習興趣和效果。
實際教學過程中,“算法與數據結構”的實驗學時比較少,而課程教學內容多,結構復雜,難度大。在實驗安排上,只能選擇相對重要、難度適中的項目,組成整個實驗環節。而且,每個實驗提供給學生的實際操作時間比較短,對算法進行補充完善,往往需要長時間的編寫和調試。兩者之間的矛盾,使得學生容易產生急躁心理,不能靜下心來寫程序、驗證代碼,因此會大幅度降低獲得算法成果的成就感,抑制了學生實踐的積極性[5]。
為了彌補傳統教學方法的不足之處,需要反復強調課程的重要性,明確課程在整個專業課程體系中的重要地位,對“算法與數據結構”的含義詳細講解,更要想盡辦法采用多樣、有趣、實用的新型教學方法,以激發學生的興趣,帶動他們的積極性,讓每一位同學都能發自內心地主動學習,不斷探索。為了解決教學過程中存在的問題,筆者采用多元融合的教學方法,運用于適合的章節,并貫穿整個課堂,以達到教學相長的效果。
為了使學生明確課程的學習目標,清楚地知道學習每個知識點的用途,可以用來解決哪些實際問題,采用了“案例驅動”教學法[6-7]。在對每個章節做教學設計時,采用“案例需求→知識引入→案例實現”的“案例驅動”流程來貫穿始終。在每章的開端,首先拋出實際工作或生活中較常出現的一個或幾個經典案例,分析案例的特點與解決方案之間的聯系,再引入相關知識點,即某種數據結構的定義、表示和實現,最后再次回歸到案例中,用知識點分析案例,實現案例。
“迷宮游戲”是一款比較流行的游戲,在學生中也非常受歡迎。迷宮的設計和求解,是“算法與數據結構”課程可以解決的問題。首先對迷宮進行分析,給定一副地圖,一個入口點,一個出口點,尋找一條可以從入口到出口的路徑。從入口出發,按某一方向向未走過的前方探索:若能走通,則到達新點,否則試探下一方向;若所有的方向均沒有通路,則沿原路返回前一點,換下一個方向再繼續試探。直到所有可能的通路都被探索,或找到一條通路,或無路可走又返回到入口點。每一個到達的點都必須保存下來,當需要返回到上一個點的時候需要訪問它,而訪問的次序和保存的次序正好是相反的,也就是說,先保存的后訪問,后保存的先訪問。而棧這種特殊的數據結構,恰好具有“先進后出,后進先出”的特點,運用在迷宮的求解過程里,解決了迷宮通路的探索問題。因此棧這種數據結構是處理迷宮問題的理想模型。學生知道了棧可以用來解決哪類問題,帶著很明確的目標,投入到棧的學習中,了解棧是如何表示和實現的。知識點講解之后,要再次回到案例中,用棧這個新知識來實現迷宮的求解問題。圖1所示為迷宮游戲示意圖。

圖1 迷宮游戲示意圖
棧的整個教學過程,形成了一個閉合的環,始終圍繞案例進行,提出案例,分析案例,解決案例。“案例驅動”教學法給學生一個非常明確的學習目標,知識點融入實際問題中,知識點從抽象變得具體,教學效果非常好。
為了把抽象的課堂內容具體化,為了便于學生理解和掌握容易混淆的概念,可以采用“互動啟發”教學法。在理解一個比較復雜的概念時,采用提問的方式將概念分解為幾個組成部分,分別對每個問題進行解答,當掌握了每個問題的答案,就可以輕松記住這個概念。
“極大連通子圖”是圖這一章的一個概念。如果無向圖G是非連通圖,G1是 G 的連通子圖,將G 的任何不在該子圖中的頂點加入,G1不再連通,那么G1是G的一個極大連通子圖。其中,圖2為極大連通子圖示意圖。概念本身不容易理解,直接去記憶,容易記錯并混淆。可以給這個概念設置三個問題:

圖2 極大連通子圖示意圖
(1)極大連通子圖針對的是什么圖?
答案:無向圖,非連通圖。
(2)極大連通子圖是子圖嗎?是連通圖嗎?(子圖和連通圖是比較簡單的概念)
答案:G1是G的子圖,是連通圖,是G的連通子圖。
(3)滿足什么條件的連通子圖叫作極大連通子圖?
答案:不能再增加其他頂點的連通子圖,因為增加了其他頂點,就不連通了,即這個連通子圖已經不能再擴充了,所以稱為極大連通子圖。
通過對概念的“互動啟發”教學,并一一解答,將一個復雜的概念化為幾個簡單的問題,學生在記憶每個問題的時候,相對容易,再把幾個問題的答案合并,完成對這個概念的理解。用這個方法理解和掌握抽象復雜的概念,深刻、清晰,不容易遺忘,不容易混淆,有很好的效果。
為了讓學生鞏固數組和指針的概念,理解它們在順手存儲和鏈式存儲中的使用,進一步掌握好兩種存儲結構的表示和實現,可以采用“情景設置”教學法。數組是以一塊連續的存儲空間存放數組元素,指針是一種特殊的變量,專門用來存放其他變量的地址,通過對指針中地址的訪問,可以訪問到其他變量的內容[8]。在線性表中,順序表采用順序存儲結構存放數據元素,通常用數組來描述;單鏈表采用鏈式存儲結構來表示節點,每個節點包含兩個成員,一是數據元素,存放在一組任意的存儲空間,另一個是指針,用來存放下一個數據元素的地址。
“情景設置”教學法,讓學生充當數據元素,教室里的座位充當存儲單元,并給座位編號。在表示順序存儲結構時,可以選擇一塊連續的座位為空閑的存儲單元,讓學生們按照學號依次坐在板凳上。此時,座位的編號順序就可以表示學生的前后次序,這就是順序表的特點。在表示鏈式存儲結構時,可以選擇一些任意的座位為空閑的存儲單元,其他座位上均放一本書,表示不空閑。學生們只能選擇空閑的座位坐下來,第一個同學用自己的右手充當指針,指向第二個同學的座位,以此類推,最后一個同學不指向任何座位。此時,學生的前后次序,用指針來描述,通過指針能找到下一個學生,這就是單鏈表的特點。
通過“情景設置”,學生對數組和指針加深了理解,對兩種存儲結構,有了具體的生動的體驗,對課本知識點的掌握有非常大的幫助。
為了在有限的實驗環節里,讓學生有充分的時間實踐理論課堂的知識、編寫代碼、調試程序,可以采用“合作探究”教學法[9]。
“算法與數據結構”教學中的每個實驗課題,都是中等規模的項目。以實驗“二叉樹的基本操作及實現”為例,實驗內容包括二叉樹的創建和遍歷兩個算法,以及主程序。可以將學生每兩人分為一組,其中一人負責主程序的編寫,一人負責算法的補充和接口的設置。兩人先各自完成分工任務,最后合并在一起調試、討論、修改。這種方式,既合理利用了時間,又完整地實現了實驗課題。在下次實驗時,兩位學生分工互換,做到補差補缺,全面鍛煉。
“合作探究”教學法,運用在實驗環節,學生能充分發揮自己的長處,獲得滿滿的成就感,也能體會分工合作的意義,實現自我價值,達到了不錯的效果。
“算法與數據結構”課程大體可以分為三大部分。第一部分為緒論,介紹數據結構和抽象數據結構的基本概念和術語,以及邏輯結構和物理結構的聯系與區別。這部分內容概念多,術語相近,抽象難以理解,適合采用“互動啟發”教學法,對概念做圖像分解,提問啟發。第二部分包含線型結構(線性表、棧、隊列、串、數組)、樹型結構(樹和二叉樹)、以及圖型結構(圖、網)三種抽象數據類型的數據結構及其應用。這部分內容算法多,操作復雜,適合采用“案例驅動”教學法,從案例問題出發,引出數據結構,再由案例的解決來結束。第三部分介紹了多種查找和排序思想及其實現方法,算法步驟較多,借助實例講解,適合采用“情景設置”教學法,學生“親身體驗”查找和排序過程,對算法有深刻的理解與掌握。特征不同的部分采用效果不同的教學方法,體現了教學方法的針對性融合,因“材”施教,針對性地解決教學問題[10]。
課程的第二部分由五個章節組成,分別為線性表、棧和隊列、串和數組、樹、圖。雖然數據結構特點不同,但是每章的知識結構相似,都是以案例引出新的數據結構,討論數據結構的表示及其算法實現,最后使用數據結構分析解決案例。“案例驅動”教學法貫穿了這五個章節的始終,不同的五個內容采用了同一個教學方法,體現了教學方法的貫穿性融合,系統地組織了該部分內容,既強調區別,又加強聯系[11]。
課程的第二部分中,每個章節介紹新的數據結構,涉及很多新的概念術語,此時采用“互動啟發”教學法,對概念做圖的分解,提問啟發;討論物理存儲結構的兩種方式,其中頻繁使用數組和指針,此時采用“情景設置”教學法,學生能“體驗”存儲結構的表示和實現過程;再加上“案例驅動”教學法的使用,多種教學方法有效融合,協作構成了每個章節的教學過程,使整個課程教學生動、具體,結合實際,起到了非常好的效果。
“算法與數據結構”課程中的術語多,概念新,算法多,結構復雜,算法的效果需要在工具環境中進行實驗調試并驗證,尤其是在案例驅動教學過程中,每個案例問題的解決,即是理論教學的延展。“合作探究”的實驗環節是“案例驅動”理論教學的延展,在整個教學過程中,兩種教學方法合理融合,實驗環節鞏固、深化了理論教學,理論教學在實驗環節里得到實現和驗證,理論聯系實際[12],課程教學靈活、深刻,提高了教學質量。
圖3所示為教學方法的多元融合探究構圖。

圖3 教學方法的多元融合探究構圖
在皖西學院網絡工程專業2017級和2018級學生中進行教學改革,采用教學方法的多元融合后,學生對算法分析和編程方向的興趣明顯增強。對比無教學改革的網絡工程專業2015級和2016級學生,教學效果顯著,學習成績也明顯提高。表1所示為2015—2018級學生學習本課程的考核成績情況。

表1 2015—2018級學生考核情況對比表
圖4所示為四個年級學生平均成績情況柱狀圖。可以看出,對比2015級的平均成績69.57分,2016級學生的平均成績幾乎沒有提高,但是教學改革后的2017級和2018級分別為70.97分和74.96分,學生成績呈明顯上升趨勢,整體進步很快。

圖4 2015—2018級學生考核平均成績情況
圖5所示為四個年級學生的考研就業情況柱狀圖。由圖可見,教學改革后,2017級和2018級的考研率和就業率,相比較2015級和2016級而言,都有大幅度的增加。算法與數據結構是計算機各專業考研的必考科目,由考研率可以看出,學生對算法與數據結構方面的興趣明顯增加。由就業情況可以看出學生知識、能力方面也得到企業的更多認可。

圖5 2015—2018級學生考研就業情況
由以上數據及分析可以看到,提出的教學方法的多元融合措施是積極有效的,學生學習興趣得到了很大提高,教學效果顯著。
“算法與數據結構”課程,概念抽象,內容復雜,知識涉及廣泛,教學上探索更多更好的不同教學方法,融合施教,積極創新,有效解決了教學過程中遇到的問題。本文對“案例驅動”“互動啟發”“情景設置”“合作探究”等幾種教學方法進行了研究,并在“算法與數據結構”的課程教學中進行多元融合與實踐探究,明確了學生的學習目標,提升了課程的達成度,同時提高了學習興趣,調動了學習的積極主動性。在生動活潑的課堂氛圍里,學生牢固掌握了知識,并體會到知識的實際用途,課程教學收到了較好的效果。