阿力木江·亞森
(新疆財經(jīng)大學信息管理學院,新疆 烏魯木齊 830013)
以問題為基礎(chǔ)的教學方法是一種以實際問題作為激發(fā)學生學習的動力和引導學生把握學習內(nèi)容的教學方法[1]。除了課程內(nèi)容,以問題為基礎(chǔ)的教學方法可以促進學生的批評性思維能力、解決問題能力和溝通技巧的發(fā)展。它還可以提供小組工作,查找和評估研究材料以及終身學習的機會。以問題為基礎(chǔ)的教學方法可以融合任何學習情況,在嚴格的定義中,該方法可作為主要的教學方法。任何科學領(lǐng)域都可以通過一點創(chuàng)新來適應(yīng)于以問題為基礎(chǔ)的教學方法[2]。
目前普遍的數(shù)據(jù)結(jié)構(gòu)教材的內(nèi)容基本一致,內(nèi)容缺乏讓人感興趣的案例,基本上先介紹概念后提供一些例子,卻不提供各類數(shù)據(jù)結(jié)構(gòu)的來源,并不回答學生腦子里的很多“為什么”。這是在很多科學領(lǐng)域的教材中普遍存在的問題,難于理解,不夠仔細。
傳統(tǒng)教學方法基本上根據(jù)教材的結(jié)構(gòu)進行,因此自然會進行先理論后實踐的模式,對思維方式還沒成熟的學生來講,掌握理論困難。雖然數(shù)據(jù)結(jié)構(gòu)是軟件開發(fā)的基礎(chǔ)知識,傳統(tǒng)教學方法基本不允許提供比較完整的軟件開發(fā)案例。
傳統(tǒng)教學模式基本上不提到教材以外的內(nèi)容,教學方法單一。不過,目前在各個高校使用的數(shù)據(jù)結(jié)構(gòu)教材缺乏多樣性,各個教材中的例子和案例幾乎一致。經(jīng)過幾年的數(shù)據(jù)結(jié)構(gòu)教學經(jīng)驗可知學生對數(shù)據(jù)結(jié)構(gòu)的熱情度不高,更感興趣網(wǎng)站開發(fā)、大數(shù)據(jù)等,主要原因是這些課程的教材來源多樣,學生自己也可以找到一些易于理解,以案例為主的書籍[3][4]。
為了讓學生充分地了解并掌握數(shù)據(jù)結(jié)構(gòu)的意義和各類數(shù)據(jù)結(jié)構(gòu)的來源,應(yīng)該第一節(jié)課開始提供實際軟件開發(fā)案例。例如,一個簡單的學生管理學系統(tǒng),讓學生回答其中要處理什么數(shù)據(jù),基本數(shù)據(jù)元素是什么,數(shù)據(jù)元素之間存在什么樣的關(guān)系。通過這么一個例子可以更好地解釋什么是數(shù)據(jù),各類數(shù)據(jù)結(jié)構(gòu)的含義及其應(yīng)用??梢灾笇W生進行一個角色游戲的分析,例如,其中包含時間、角色,交易等概念,從這些角度來可以體現(xiàn)出線性結(jié)構(gòu),樹形結(jié)構(gòu)和圖形結(jié)構(gòu)的概念及其應(yīng)用。此基礎(chǔ)上,最后對它們進行總結(jié)相當于介紹相關(guān)理論。
根據(jù)授課內(nèi)容,可適當?shù)剡x擇不同規(guī)范的問題,啟發(fā)學生的想象力。上述所提的軟件開發(fā)案例適合于解釋數(shù)據(jù)結(jié)構(gòu)的大概念。數(shù)據(jù)結(jié)構(gòu)的授課內(nèi)容包含一系列經(jīng)典算法,在它們的解釋中先提出一些小問題,然后對問題進行總結(jié),最后介紹適用于解決這一類問題的算法。例如,最短路徑問題的授課中,可以提到交通堵塞問題,其中瓶頸正是關(guān)鍵路徑所經(jīng)過的一條邊,也就是為了提高效率必須找出這些瓶頸。經(jīng)典算法應(yīng)用的問題眾多,易于提供例子,有利于提高學生的積極性。例如,哈夫曼編碼的介紹中可以提出“如何最快的速度發(fā)出去信息量最多的最小電報”的問題。
數(shù)據(jù)結(jié)構(gòu)的授課只講理論不講怎么編寫可對編程能力較強的學生可行的,但對編程能力一般或者還沒完全掌握計算機語言編程的學生來說不可行。在編寫一個完整的數(shù)據(jù)結(jié)構(gòu)的過程作為一個案例,鼓勵學生一起編寫,善于找出學生表達不出來的問題,協(xié)助學生通過編寫掌握理論。
數(shù)據(jù)結(jié)構(gòu)和算法對于任何程序員來說都是必不可少的,因為了解它們是成為更好程序員的關(guān)鍵。對算法和數(shù)據(jù)結(jié)構(gòu)有深刻理解的工程師將能夠做出明智的設(shè)計選擇,并編寫性能更高且更易于更改的程序。作為初學者,學生可能會對新概念感到氣餒和沮喪,并且常常因為這些主題聽起來非常抽象而感到害怕。這在意料之中,而老師的工作就是想辦法緩解學生的緊張情緒。我們相信在課堂上做以下幾點會對學生有所幫助。
1.展示內(nèi)容:在任何一門新課程的第一堂課上,學生通常不知道他們要學什么。他們只知道新課程是關(guān)于什么,僅此而已。正因為如此,許多學生對課程主題并不真正感興趣。對于教師和學生來說,重要的是要確定課程的內(nèi)容,更具體地說,每章的內(nèi)容以及它對他們有何用處。數(shù)據(jù)結(jié)構(gòu)源是關(guān)于為軟件開發(fā)中出現(xiàn)的問題提供一些基本的解決方案。老師必須通過提供一些有趣的例子而不是太多細節(jié)來明確這一點,讓學生感到放松并集中注意力。例如,鼓勵學生思考如何開發(fā)國際象棋游戲。鼓勵學生想象一場簡單的國際象棋比賽,學生們會發(fā)現(xiàn)有很多事情需要考慮。其中,最重要的是如何讓國際象棋程序記住之前的比賽狀態(tài),以防棋手想要撤銷當前的舉動,并為上一步采取不同的策略。這個問題代表一個經(jīng)典的樹形結(jié)構(gòu)。通過了解國際象棋比賽的軌跡類似于樹形結(jié)構(gòu),學生將說服自己數(shù)據(jù)結(jié)構(gòu)在現(xiàn)實世界中很重要。上面提到的例子起到吸引學生注意力的作用,同時也提供一些關(guān)于數(shù)據(jù)結(jié)構(gòu)的用處。然而,現(xiàn)在還不是開始教授這門學科的時候。現(xiàn)在最好介紹一下每章的內(nèi)容,或者整個課程的總結(jié)。整個課程可以概括為以下單獨的主題:數(shù)組、列表、堆棧、隊列、樹、哈希表、圖和排序算法。簡單地提及這些并為每個示例提供一個示例,可以顯著幫助學生闡明接下來幾周將要發(fā)生的事情。
2.將實際問題與編程相關(guān)聯(lián):甚至在教授此類數(shù)據(jù)結(jié)構(gòu)之前,就以現(xiàn)實世界的問題為例,例如國際象棋游戲、導航問題及其適當?shù)臄?shù)據(jù)結(jié)構(gòu),可能會鼓勵學生更加熱情地學習課程。最重要的是,這樣的聊天有助于學生將現(xiàn)實世界的問題和編程任務(wù)聯(lián)系起來,激勵他們在腦海中思考他們的夢想項目(如果存在的話)。此外,反過來提到這些問題自然會導致在他們的解決方案中應(yīng)該使用什么數(shù)據(jù)結(jié)構(gòu)。
3.將編程與數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián):一提到現(xiàn)實世界的問題,學生的第一反應(yīng)很可能是“解決這個問題的第一步是什么?”。對于提出的每個問題,這都是一個有利的想法。數(shù)據(jù)結(jié)構(gòu)課程教會學生分析問題。許多現(xiàn)實世界的問題可以歸類為一種基本數(shù)據(jù)結(jié)構(gòu):列表、樹或圖。觀察本題處理的基本數(shù)據(jù)是什么,數(shù)據(jù)對象之間的關(guān)系是什么,學生將掌握識別問題與數(shù)據(jù)結(jié)構(gòu)的相關(guān)性,然后思考如何編程,由此引出算法。
4.將數(shù)據(jù)結(jié)構(gòu)與算法相關(guān)聯(lián):一旦學生理解了數(shù)據(jù)結(jié)構(gòu)的真正含義,那么他們可能會根據(jù)手頭問題的復雜程度感覺到需要一些算法。這一刻很清楚,數(shù)據(jù)結(jié)構(gòu)不僅是關(guān)于如何表達和解決現(xiàn)實世界的問題,而且是關(guān)于如何解決一些計算機特定的問題。我們需要一些復雜的數(shù)據(jù)結(jié)構(gòu)中的算法。這個時刻非常適合向?qū)W生介紹相同任務(wù)但不同數(shù)據(jù)結(jié)構(gòu)的算法,例如在樹和圖中搜索,并且由于存儲的數(shù)據(jù)的底層結(jié)構(gòu),它們的工作效率有所不同
5.提供大量示例但不要太多:提倡在課堂上提供例子但不建議介紹太多。示例應(yīng)盡可能具有代表性和簡單性。盡管用例子轟擊學生似乎很好,但大多數(shù)例子的重點各不相同,因此可能無法對手頭的問題提供系統(tǒng)的解釋。正確的做法是從最簡單最相關(guān)的例子開始,然后解釋一些正式的內(nèi)容,最后總結(jié)。課堂的具體和抽象部分必須平衡,以提高學生思維的各個方面,實踐和理論知識的發(fā)展比只關(guān)注其中一個要好。
6.使用可視化工具:對目前流行的幾種數(shù)據(jù)結(jié)構(gòu)教科書來說,很難將它們視為有趣且易于學習。他們通常遵循傳統(tǒng)的教學模式,介紹一些無關(guān)緊要的例子,然后介紹一些概念,最后解釋如何對這些問題進行編程。這里的問題是,即使學生成功地編寫出各種數(shù)據(jù)結(jié)構(gòu)的程序,也沒有成就感,因為這些程序距離用于解決實際問題還差太遠。因此,久而久之,學生就會失去興趣,尤其是學習意愿不強的學生。在某種程度上克服這個問題的一種方法是在一些合適的主題中使用可視化工具,例如排序、圖形搜索。這將幫助學生通過以不同的方式呈現(xiàn)內(nèi)容來專注于課程。
7.使學生擁有成就感:學習成果不斷鼓勵學生學習。因此,讓學生覺得他們正在學習有趣和有用的東西是很重要的。同樣,現(xiàn)實世界的問題和編程的例子正是這樣做的。因此,教師必須選擇2-3 個完整的案例,并鼓勵學生利用從數(shù)據(jù)結(jié)構(gòu)課學到的知識來完成它們。這樣的例子應(yīng)該針對實際問題而不是針對某些概念
8.精選示例:(1)眾所周知的斐波那契數(shù)列非常適合在列表中引入。這個問題有點簡單的性質(zhì)使它成為數(shù)據(jù)結(jié)構(gòu)課程開始時的理想選擇。教師可以要求學生分別使用列表、堆棧和隊列生成斐波那契數(shù)列。一旦學生完成,這三種基本結(jié)構(gòu)的區(qū)別學生就會一目了然。(2)在文本編輯器中撤銷功能是堆棧的一個真實示例。提到這一點,同學們可能會想到類似的應(yīng)用,比如在瀏覽器中前進和后退。(3)鏈表的一個真實例子是音樂播放器,用戶可以使用循環(huán)模式依次播放多首歌曲。(4)二叉排序樹搜索算法的現(xiàn)實場景之一是驗證應(yīng)用程序中的用戶憑據(jù)。此外,這種搜索算法可以在許多游戲中找到,用于定位元素的位置。(5)Huffman 編碼用于密碼學和數(shù)據(jù)壓縮。在解釋了該算法的工作原理后,不難將其視為一種數(shù)據(jù)壓縮,因為將大信息轉(zhuǎn)換為具有相同含義的小信息。含義隱藏在這些代碼中,而失去了信息的原始表示,這意味著它也是一種密碼算法。(6)圖形可以通過旅行來解釋。這是一個非?,F(xiàn)實的問題,很容易在旅行中提出許多決策問題,例如如何到達一個地方,去某個地方的最佳道路是什么。也許此時,僅學生就可以想到圖及其算法的眾多應(yīng)用。一個有趣的例子是Facebook使用圖數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)關(guān)注者。學生應(yīng)該能夠說服自己圖形無處不在。(7)哈希表。這是用于快速存儲和搜索數(shù)據(jù)的最常用的數(shù)據(jù)結(jié)構(gòu)之一。與樹和圖不同,哈希表可以以更簡單的方式實現(xiàn)。解釋為什么在某些情況下樹和圖不夠用是至關(guān)重要的。主要原因是構(gòu)建這些數(shù)據(jù)結(jié)構(gòu)很昂貴,更重要的是沒有必要。在存儲了很多不相關(guān)的信息,以后又想快速查找的情況下,唯一的選擇就是哈希表。哈希表的實際應(yīng)用是在路由器中存儲IP地址。(8)DFS 和BFS 是圖中的基本搜索算法,其他搜索技術(shù)都是它們的變體?,F(xiàn)實世界的例子包括用于網(wǎng)絡(luò)爬行的搜索引擎,尋找地圖中兩個地方之間的最短路徑。
數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)的核心課程之一,學習數(shù)據(jù)結(jié)構(gòu)是為了更好地管理數(shù)據(jù),能開發(fā)出更復雜的軟件。不過,目前很多高校還在用傳統(tǒng)教學方法,以教材為主,不重視引入更多更有趣的案例和例子融合到授課過程中。本文主張數(shù)據(jù)結(jié)構(gòu)的授課應(yīng)該以問題為基礎(chǔ)的教學方法,每一個概念與算法應(yīng)該按照提出問題,引導學生思考,對問題進行分類,最后以提出解決方法的形式介紹理論的方式進行。這樣有利于學生更容易掌握相關(guān)理論及其實踐,可進一步地提高學生的思考和解決問題能力。