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