王昱哲,王羅惠
(西安科技大學計算機學院,陜西西安710054)
計算機編程中加工處理的對象是數(shù)據(jù),數(shù)據(jù)具有組織結(jié)構(gòu);編程不僅僅需要掌握計算機語言,還必須掌握數(shù)據(jù)組織、存儲、運算的方法,才能寫出效率更好的程序。而數(shù)據(jù)組織、存儲和運算方法正是《數(shù)據(jù)結(jié)構(gòu)》研究的主要內(nèi)容。通過對《數(shù)據(jù)結(jié)構(gòu)》課程的學習可以使學生了解計算機處理對象的特征,通過算法訓練可以提高學生的思維能力[1]。《數(shù)據(jù)結(jié)構(gòu)》也是學習編譯原理、操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)等其它課程的重要基礎,對計算機學科起到承前啟后的作用,這些都使得《數(shù)據(jù)結(jié)構(gòu)》在計算機專業(yè)課程學習中具有核心地位。
計算思維是問題解決所采用的一般數(shù)學思維方法,周以真教授將其定義為:運用計算機科學的基礎概念進行問題求解、系統(tǒng)設計、以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動[2]。計算思維是人類求解問題的一種思維方式。如何在《數(shù)據(jù)結(jié)構(gòu)》的課堂教學中融入計算思維能力的培養(yǎng)呢?
計算機的主要目的就是進行數(shù)據(jù)處理,解決人們現(xiàn)實中的的實際問題。數(shù)據(jù)不是雜亂無章的,同自然界的一切事物一樣,存在著內(nèi)在聯(lián)系,學習《數(shù)據(jù)結(jié)構(gòu)》課程的目的是如何合理的組織數(shù)據(jù)以便能高效的處理數(shù)據(jù)。因此在課堂上,應避開知識的大量灌輸,明確學習的目的、意義以及要解決的問題。將書上的知識與現(xiàn)實中的應用結(jié)合起來,舉一些實際例子,設置問題,讓學生思考。通過多設問題,循序漸進引導學生主動思考問題,使學生從被動的被灌輸知識變?yōu)榉e極思考主動獲得知識,從而達到訓練學生的思維方式的目的。
學生自己主動思考獲得的知識,不僅能加深學學習印象、提高自信,更能培養(yǎng)思考習慣。設置問題,引導學生思考,鼓勵學生在課堂上把自己的想法講出來,其他的學生也會克服一些畏難心理,更有興趣的去聽講自己同班的學生的回答,不僅能對他人想法有一個初步的評價也能激發(fā)自己對問題的思考,課堂氣氛也往往能更加活躍。
學生思考出來的解決方法,如果不完善或不正確,也不要急于糾正。順著學生的思路,對學生的方法設置疑問,讓學生思考解決面臨各種預設的條件下,該算法是否能處理問題、方法是否考慮周詳、思路是否有局限,一步步將學生引導到正確方法上來,完善解決問題的算法。
通常問題的解決方法不僅一種,設置問題鼓勵學生勤于思考,使學生主動思考獲取基礎知識。還要鼓勵學生進一步思考,還有沒有其它的或更好的算法。引導學生從基本的數(shù)據(jù)組織和處理方法為基礎、進一步思考更高效率的算法,對各種算法的特點以及性能進行對比、鼓勵學生課下思考并查閱相關(guān)資料將學習的知識進一步深化,激發(fā)學生課余進一步深入探索書本之外知識的興趣。
《數(shù)據(jù)結(jié)構(gòu)》課程應多舉實例,以激發(fā)學生學習興趣。舉例來說,《數(shù)據(jù)結(jié)構(gòu)》學到完棧和隊列時,可以請學生思考,實際生活中哪些事情符合先進后出或先進先出的特點。而學生的思維也確實非常活躍,往往能舉一些身邊很熟悉的事情。比如列舉到了中午吃飯排隊是符合隊列的特點,保證先到的先打飯,而如果有人插隊,則會破壞了規(guī)則。吃完飯把盤子送到回收餐具處,而餐廳服務員要清洗盤子時,首先清洗的是后放的盤子,符合后進先出的棧式思想。再比如,學生交作業(yè)和教師改作業(yè),則又符合棧的特點。
在講完樹這一章的知識后,可請學生思考八枚硬幣問題,用一個天平如何用最少的次數(shù)秤出八枚硬幣中哪一枚是假幣,并判斷出假幣比真幣重還是輕。這個問題可以留作課下思考,使學生在課余畫出稱量的方法和過程,而這個過程剛好可用一棵樹來描述,恰是樹的一個應用舉例。
在學習圖這一章知識里,可以用著名的七橋問題引入內(nèi)容學習。學習遞歸時,列舉關(guān)于兔子生育問題引入費波拉契數(shù)列、漢諾塔、求階乘等例子,進一步講解和比較采用遞歸方法和非遞歸方法解決問題的特點。列舉有趣的例子既可以吸引學生學習注意力、活躍課堂氣氛、又可以激起學生的學習興趣,加深對知識的理解和記憶。
在授課講解的過程中,不僅要學習知識,更要引導學生去思考,解決這個問題有哪些方法,為什么要這樣解決,有什么益處,要學習這種解決問題的思路和方法。不僅要注重知識的傳授,更要培養(yǎng)學習知識、解決問題的思維方法。
計算機只是一臺機器,不能夠主動思考算法,它是按照程序員編寫的指令去解決問題。解決任何問題都需要算法,算法是指令的有限序列。算法是由程序員來設定的,利用計算機解決問題時的算法,有它自己的特點和所遵循的方法和規(guī)律。教授《數(shù)據(jù)結(jié)構(gòu)》,不僅使學生掌握一些知識,更要通過不斷的學習案例,進行分析和總結(jié),積累經(jīng)驗,訓練清晰和縝密的思維方式。
在思考問題的解決方法時,都需要首先確定輸入什么數(shù)據(jù)、如何組織數(shù)據(jù)、如何處理、以及問題的輸出是什么,輸出就是問題的最終結(jié)果。然后再進一步仔細思考,如何處理這些數(shù)據(jù),用什么樣的算法進行處理,才能得出結(jié)果。
有的學生思路開闊、思維活躍,遇到問題能馬上整理出計算模型,而有的學生遇到問題毫無思路,一籌莫展[3]。學習《數(shù)據(jù)結(jié)構(gòu)》,不僅學習書上解決問題的方法,更要培養(yǎng)算法思維,通過學習,進行大量的訓練,掌握算法的分析技術(shù)、設計技術(shù),掌握計算機解決問題的規(guī)律。
算法的設計有若干通用策略,匯總起來構(gòu)成了一套非常有用的工具集,若能運用得當,可以解決計算機科學中的眾多問題。學習該門課程,重要在于通過算法訓練,熟練掌握這些策略并將其應用到實際環(huán)境中去。比如常用的方法有:窮舉、遞歸、分治、貪心、動態(tài)規(guī)劃等。在學習《數(shù)據(jù)結(jié)構(gòu)》的過程中,貫徹計算思維的培養(yǎng)、應用。
比如樹這一章中,由于二叉樹的定義就是用二叉樹來定義二叉樹,用到了遞歸的思想,因此樹這一章中的很多算法,都用遞歸來解決,雖然遞歸不是唯一的辦法,但卻是最簡單最便于理解和實現(xiàn)的方法。在學習圖這一章里,求最小生成樹的普里姆算法和克魯斯卡爾算法都是應用貪心算法設計策略的例子,盡管它們做貪心選擇的方式不同,以及圖中求單源最短路徑問題的迪杰斯特拉算法也是應用了貪心策略。查找中的折半查找算法和排序中的快速排序,都是分治策略的典型應用。
《數(shù)據(jù)結(jié)構(gòu)》的算法往往不是一種,每一種問題的解決方案總有優(yōu)缺點,每一種算法總有適用該算法的情景。不是一種算法能適合任何情形。有的算法比較浪費時間,但設計另一種算法若節(jié)約了時間,又往往會浪費存儲空間,《數(shù)據(jù)結(jié)構(gòu)》中解決同一問題的各種算法,往往在時間復雜度和空間復雜度上找到一個均衡點[4]。在學習過程中不僅要讓學生熟悉算法思想和步驟,還要讓學生重視算法的性能分析以及適應的條件,能夠根據(jù)實際問題的應用情況選用合適的《數(shù)據(jù)結(jié)構(gòu)》和算法解決問題。
《數(shù)據(jù)結(jié)構(gòu)》是一門邏輯性和應用型非常強的學科[5]。學生不僅要掌握必備的基礎知識,更要將知識用于實踐,因此可將知識點與實際的應用對應起來。只有明確了要學習的內(nèi)容的實際用處,才能更好的激發(fā)學生的學習興趣。而《數(shù)據(jù)結(jié)構(gòu)》解決的問題,很多都是實際生活中的問題,可以多舉學生身邊熟悉的實例,比如:排隊打飯問題、成績管理問題,讓學生將書本知識與生活中遇到的問題對應起來,鼓勵學生自己獨立提出問題、分析問題和解決問題。
該門課程的實踐環(huán)節(jié),不能只是驗證算法,而應對該課程中的算法的實際應用場景、問題規(guī)模、算法效率等方面也要多加考慮,不僅使學生理解和記憶經(jīng)典算法理論,更要理解消化、靈活運用它們,通過上機實踐使學生的思維創(chuàng)新能力和實踐能力得到有效培養(yǎng)和提高。
《數(shù)據(jù)結(jié)構(gòu)》作為計算機學科的核心課程,該課程的教學,不僅傳授知識,更要培養(yǎng)學生計算思維能力和創(chuàng)新能力,提高學生分析問題、解決問題的能力,本文探討如何組織教學內(nèi)容、研究教學方法,將計算思維能力的培養(yǎng)融入到課堂教學中,為學生以后從事計算機領(lǐng)域的研究工作奠定堅實的基礎。