摘要:本文分析了數據結構與算法課程的特點、教學現狀,針對存在的問題討論提高教學質量的教學方法與教學手段,以期解決課堂教學的組織與設計、實驗教學設計等問題。
關鍵詞:數據結構;算法;教學策略
數據結構與算法是計算機專業的一門核心課程,不僅是程序設計的基礎,而且是設計和實現編譯原理、操作系統、數據庫系統等系統程序和大型應用程序的重要基礎。本課程主要研究非數值計算的程序設計問題中所出現的計算機操作對象、數據之間的關系、數據的操作、算法復雜性分析等內容,教學的突出難點是知識的抽象性和動態性,學習過程也是復雜程序設計的訓練過程,理論性和實踐性均較強。由于學生基礎知識不牢固,再加上課程本身內容抽象,有一定難度,學生普遍反映該課程“難懂、難做、難用”。針對這個問題,本文從教學方法、學習方法入手,進行了教與學的分析和探討。
1教學存在的問題
1.1先導課程不扎實
數據結構與算法課程的先導課程有高等數學、高級程序設計和離散數學等。學生在學習該課程前必須能夠較好地掌握這幾門課程。例如,算法分析的研究必須要以一定的數學理論為基礎;非線性結構的分析必須用到圖和樹的基本知識。另外,數據結構中的算法大多由類C、C++或C語言描述而成,雖然C語言在高級程序設計課程中已經學習過,但由于學生剛剛開始接觸高級程序設計語言,難度較大,用起來就比較困難。尤其是指針、結構體部分是C語言中學習的難點,而這些又是在數據結構中頻頻出現的用法,學生遇到算法時往往感覺很吃力,實驗課也遇到很大困難。在數據結構課堂教學中,老師往往要花一部分時間在C語言的復習上。盡管如此,學生仍然模糊不清,教學效果不理想,久而久之,有些學生甚至失去了學習興趣。因此,先導課程掌握不扎實,給數據結構課程的教學埋下了隱患。
1.2課程內容抽象復雜
課程主要介紹兩部分內容,一是數據結構,二是算法。數據結構部分包括線性結構、樹形結構和圖形結構,教材都用抽象數據類型描述,內容抽象不生動,加之學生C語言基礎不牢固,理解類C語法困難,因此學起來比較吃力。而算法部分在數據結構基礎上展開,包括排序算法、查找算法等,是棧、圖、樹等數據結構的綜合應用,雖然這部分有很多實例輔助,但這些算法涉及的知識較多,都是基于數學模型及其基本操作基礎上的研究,而且主要是基于算法思想的研究,不易理解,因此相當一部分同學學習到這里時,心理上感到恐懼,難度非常大。
1.3實踐能力缺乏
數據結構與算法是一門理論與實踐并重的課程。課程的教學要求之一是訓練學生進行復雜程序設計的技能和養成良好程序設計的習慣,其重要程度決不亞于知識傳授。對涉及的題目,要求學生要能用相應的數據結構和算法解決,提高分析和解決問題的能力。因此在整個教學過程中,完成上機實習是個至關重要的環節。假設每周授課學時為4學時,那么學生每周至少應有4個機時同步實踐算法。但是,在實際教學中,實驗平均每周1.2機時左右,缺少的時間只能靠學生課后自覺完成,但是多數同學不能完成。由于實踐輔助不足,理論課上的算法也就變成了“紙上談兵”,學生學得膚淺,也比較枯燥乏味,對剛剛接觸這門課的學生來說,總有一種不知所措的感覺,教師在講授這門課時也是困難重重,成績平平。
2提高教學效果的思考
2.1重視前導課程的復習
牢固的前導課程知識是學習數據結構與算法的前提條件。離散數學是計算機科學的數學基礎,所提供的訓練十分有益于提高概括抽象能力、邏輯思維能力、歸納構造能力,有益于培養學生嚴謹、完整、規范的科學態度。因此,學好離散數學將為后續課程的學習打下扎實的基礎。在教學中,教師可以對部分前導課程內容加以復習,這樣學生一方面感受到前導課程的重要性,一方面又建立起前導課程同數據結構的內在聯系,對學生學好數據結構起到積極的作用。
另一門非常重要的前導課程是高級程序設計,其中C語言的結構體和指針是描述存儲結構的基礎,靈活地運用指針可以處理各種復雜的數據結構。在教學中,教師要從注重語言語法轉變為注重學生編程能力的培養,要統籌安排各部分內容的授課時間,保證指針、結構體和函數等內容有足夠的教學時間。由于C語言學習一年后才開設數據結構與算法,因此在開展數據結構教學時,要給學生復習C語言的知識,并布置復習任務,尤其是與數據結構相關性大的部分。在教學過程中,教師可以結合學生的學習狀況和相應算法,再適當補充必要的C語言知識,抓住兩門課程的銜接點實施教學。例如,要重點復習數組、結構體、指針等在程序中的具體應用,用一周的時間回顧C語言知識,讓學生上機實驗。
2.2理清知識體系脈絡
數據結構與算法的知識點雖然比較多,但其主體知識框架是非常清晰的。大多數教材都以數據的邏輯結構為主線,順序介紹線性結構、樹形結構、圖形結構和文件結構,介紹每種數據結構時都討論其存儲結構及相關算法。例如對于線性表,如果考慮到存儲,可以分為數組方式存儲和鏈表方式存儲;考慮到運算的特殊性,則可以分為棧、隊列、串、數組和廣義表。對于一些比較重要的算法,再列出單獨的章節來討論,例如排序、檢索、存儲管理等。每個章節之間既相互獨立,又相互聯系。教學中,教師要抓住主線,理清其內在聯系,對整個內容進行有機組合,合理安排,了解課程的知識框架和各種結構的關系后,從簡單到復雜、循序漸進、逐步深入地實施教學。
對于每個章節的內容,也應按照一定的流程展開學習。例如,首先掌握每章節的基本概念,再熟悉該結構的抽象數據類型定義和主要操作的實現方法,然后要理清算法實現的思路以及算法實現的框架,最后通過上機調試進一步掌握該算法。
學生對學過知識的印象是分散的、片面的,無法將知識銜接起來,舉一反三。這就要求教師在教學過程中承前啟后、不斷總結、及時復習、注重理解。以鏈表學習為例,在線性表章節學習了單鏈表、雙鏈表及循環鏈表,它們三者是相互關聯、層層深入的。而后面章節中樹的鏈表表示法、圖的鄰接表和逆鄰接表表示法、鏈地址法解決哈希表沖突都是鏈表的具體應用。在授課的時候,教師應注意復習前面的內容,把有聯系的內容相互串聯起來,使學生形成一個完整的知識體系。
在教學過程中,教師不必拘泥于教學大綱的內容,可以對教學內容進行有機整合,并不斷吸收新內容、新知識和考研內容。可以對教學內容進行適當的拆分和重組,做到突出重點、細化難點。
2.3重視課堂教學的趣味性
數據結構與算法的內容比較抽象,在講授第一節課時,教師應首先強調應用,通過介紹數據結構的實際應用激發學生的學習興趣。例如,針對學校的學生管理系統,如何實現學生信息的快速查找;一家人出門旅游,如何選擇線路才能最節省開支;一個復雜的工程,如何管理才能實現最短工期;智能漢字輸入法中怎樣實現常用字的前置;還有經典的農夫過河問題、猴子選大王問題、迷宮問題等,這些問題趣味性比較強,能激發起學生探究如何解決這些問題的愿望以及學習數據結構相應知識的愿望。興趣激發起來了,就形成了一個良好的開端。
教師在每堂課開始時,也要注意盡可能使用生活中的例子導入課程,例如講解棧結構時,可以用烙餅的例子來引入,烙出來的餅從下往上放,而吃的時候是從上往下吃,棧就好像一個裝餅的容器,先進后出。在講解隊列時,可以舉學生食堂排隊買飯的例子,大家排成一隊,學生一個一個排到隊尾,最后從對頭打飯出來,這就是一個隊結構,先進先出。這樣通過例子過渡到知識點,學生就不會覺得枯燥,也樂于接受。
在每個章節結束之前,還要讓學生學以致用,讓學生完成一個項目,規模視具體情況而定。學生見到成果,內心的成就感得到滿足,自信心得到加強,肯定更有興趣繼續學習,也樂意花精力來專研這門學科。需要注意的是,見成果的時間不能太長,否則學生就會失去耐性,因此稱為階段性成果。對于前面的簡單章節,可以安排簡單的、容易實現的項目,如學完線性表的知識后,安排學生完成一個通訊錄;學完棧的知識后,安排學生完成一個括號匹配的算法;學完圖的知識后,安排學生完成最短旅游交通路徑設計等。這樣,學生通過不斷地學習,不斷地學以致用,興趣才能持續。
2.4加強實踐環節的訓練
數據結構與算法是一門實踐性很強的課程,上機實習題的設計、實習訓練的數量和質量都非常重要。要想理解和鞏固所學的基本概念、原理和方法,牢固地掌握所學的基本知識、基本技能,達到融會貫通、舉一反三的目的,學生必須多做,多練。教師在講授完每個知識點后,應針對該知識點進行實驗教學、階段性總結,引導學生對該數據結構進行應用。
加強實踐環節的訓練,首先要保證實驗機時,授課學期應不少于48個機時。其次,實驗的選題要著眼于數據結構原理和應用的結合點,引導學生應用書本知識解決實際問題,提高學生的實際動手能力和團隊合作能力。考慮到學生的個體差異,題目要設有多個難度等級,供不同層次的同學完成。教師要從實際應用中精心選擇有具體應用背景的實驗題目,努力使學生體會學習的內容是極為重要、極具實用價值的,充分激發學生的興趣。除上機題進行基本訓練外,教師還應再選擇一些綜合應用的上機題進行拓展訓練。需要注意的是,給學生布置實習題時應留有余地,不宜過細,并把握好難度,不要事先指定使用某種數據結構,而是要求學生從實際出發,在具體真實的環境中分析研究數據對象的特性,構造合理的數據結構及相應算法。
2.5注重綜合能力的考評
數據結構與算法不僅要讓學生懂得“數據結構+算法=程序”,培養其數據抽象的能力,還要使學生能夠把數據結構和算法理論與編程實踐相結合,并在實際工程實踐中靈活地應用。因此,課程應該從多個方面考評學生的綜合能力,授課教師可以采用筆試成績、實踐成績和平時成績相結合的考評方法。
筆試題主要考察學生的理論基礎,要做到重點突出,同時兼顧各個章節的知識點。筆試部分大約占期末成績的50%。實踐部分包括多個上機實驗,根據各章講解的進度隨堂進行,最后,教師要根據實驗報告、實驗過程和學生的實驗態度綜合評分,大約占期末成績的40%。教師在實驗命題時,要盡量選擇有價值的、新穎的題目,避免使用上一屆的題目,防止學生抄襲。平時成績包括學生上課表現、出勤、平時作業完成情況等,約占期末成績的10%。教師在成績評定時要客觀、公正、認真地對待每一個學生,培養學生良好的治學態度,形成良好學風。
3結語
數據結構與算法課程在計算機學科中的地位十分重要,是計算機程序設計的重要理論基礎,也是大多數學校研究生入學考試的必考課程。教師在教學過程中要著力培養學生敏捷的抽象思維能力和嚴謹的邏輯思維能力,并不斷完善自己的教學方法,以達到更優的教學質量。
參考文獻:
[1]陳明. 數據結構(C語言版)[M]. 北京:清華大學出版社,2005.
[2]嚴蔚敏,吳偉民. 數據結構(C語言版)[M]. 北京:清華大學出版社,1997.
[3]羅吳蔓. 以建立“整體性”觀念為主的“數據結構”課程教學方法探討[J]. 計算機教育,2008(4):6-9.
Thinking about Teaching Method of Data Structures and Algorithms
LU Yang
(School of Software, China University of Geosciences, Beijing 100083, China)
Abstract: Features of “Data Structures and Algorithms” and current situations of teaching are analyzed in the paper. Methods to improve teaching are then discussed according to existing problems. Further, organization and design of classroom teaching together with experimental teaching design are explored.
Key words: data structure; algorithms; teaching method
(編輯:張玥)