黃成 中南林業科技大學涉外學院
隨著社會的不斷進步、經濟的發展和計算機存儲技術的躍升,企業重視的諸如郵件、報表、圖紙、音頻、視頻等各種類型文件的大量產生和存儲,各大公司數據量成指數型增長。各公司管理層開始認識到數據的價值,不再依靠進行抽樣調查獲取信息,而是重視起全體數據的采集和處理。因而計算機類專業開始需要面對一個新的軟件時代--大數據時代的來臨。它不再是往日的選取幾個百分比的數據進行統計分析,以最少的數據獲取最多的信息,而是面對全體數據進行統計,事無巨細全部包括,要求盡量做到信息全面而具體。
一般大數據處理被定義為10TB規模以上數據量,而企業經常將多個數據集放置在一起,所以經常是形成PB這個數量級的數據集。這個數量級以上的數據無法使用傳統的數據庫工具進行數據的抓取、數據的篩選、數據的處理和數據的管理。其次由于數據來源廣泛,有從從互聯網上爬取的網頁、通訊記錄、網絡空間中交互產生的音頻和視頻文件;有來自于企業內部ERP系統、各種POS終端及網上支付系統等業務系統的郵件、報表、日志文件等各種數據類別,已經不能單純地使用結構化數據庫的模式組織處理了。它包括了結構化數據、半結構化數據和非結構化數據等多種形式,所以越來越依靠專門的大數據平臺所提供的專業軟件的支持。由hadoop,spark等專業大數據架構下的專業大數據軟件MapReduce、Sclala編程處理PB級的大數據。在這里數據處理和編程都嚴重依賴針對性的算法支持。
因為計算機科學之中算法被公認為計算機軟件運行的奠基石。無論使用的計算機編程語言、架構體系如何變化,算法的地位始終不可動搖。本科階段的算法課程就是《算法分析與設計》。它是一門重要的專業基礎課,通常是計算機專業大二下期或是大三上期開課。作為《高級語言程序設計》和《數據結構》課程的后續,理論性和實踐性都很強。就如同C語言和JAVA語言,雖然語言和結構不同,但是所使用的算法沒有差異。所以培養應用型人才,其實質就是在培養實際運用算法和數據結構解決問題的能力。這個應該成為《算法分析與設計》課程教學的核心任務。
《算法分析與設計》與其他計算機專業課不同的是,應用型本科生算法課程更應注重學生對實際問題的分析能力以及根據問題場景環境的變化而靈活應用所學知識能力的養成,培養的是軟件實現的思路。而在大數據時代,當使用場景和編程語言不同而算法核心思想不變的情況下,算法的使用類別是一定會和傳統的算法應用有所不同和側重的。以往的數據處理算法執著于精確,而大數據時代我們必須接受不精確,讓數據自己說話,而不是我們預設目標。具體來說就是大數據是對現象發生過程的全記錄。通過對數據的處理挖掘而不是精確獲取中間的表面信息或是關鍵字段,不僅能夠了解對象,還能分析對象,掌握對象運作的規律,挖掘對象內部的結構與特點,甚至能了解對象自己都不知道的信息。這些都是傳統數據所無法體現的,也是大數據承載信息的豐富之處。這就例如人們可以通過網頁信息對明星的描述與概括,如這個人的身高、體重、出生年月、興趣愛好、親朋好友等數據能知道和認識這個人。這些算是傳統數據或是稱為表象內容。而通過大數據的數據處理能從他的表情中讀出心理活動,從眼神中看出閱歷,從衣著打扮中讀出品味,從鞋子上讀出生活習慣。而這些深層次的非表象的內容需要通過算法去挖掘出來,這就是我們說的數據分析與數據挖掘。
在這個大數據體系里算法多數使用的是分類樹、聚類算法、向量機、最大期望算法、最近鄰分類算法等,討論的是數據的篩選和分類。而非傳統的枚舉、分治、貪心、動態規劃等算法的直接應用。所以所用算法應用的差距是客觀存在的,導致一般的計算機專業本科生畢業以后想要從事大數據行業困難重重。所以以培養應用型、工程型本科生的計算機專業必然要變更算法的教授重點,以適應社會和企業的需求變化。
根據大數據技術教學經驗和算法設計與分析的教學經驗相結合,發現以下幾個方面的存在不足是算法不適應大數據環境的原因。
(1)規模的概念不被重視。輸入數據的規模或是處理數據的規模在傳統算法教學中不太涉及,通常只是在理論教學提及計算復雜度概念的時候,描述一下規模對計算的時間復雜度的影響。未有針對性的事例展示和實際算法方案的聯系,學生不容易理解概念,也不會制定對應措施。例如在討論數據檢索的時候,不對規模進行討論,不對數據進行某種清洗,大數據的處理算法如何能正確的選擇?
(2)大數據算法沒有形成前后內容的聯系。大數據中使用的算法多數在傳統算法中不詳細講述,或者是沒有在相應的案例算法中提及。以決策樹部分為例課程安排中甚少提及,而在某些專業甚至不會講解。其原因是在與本科生的教學內容中只注重具體的經典常規算法的講述,很少提及算法能力的極限。這樣致使在算法分析基礎中對于算法上界下界問題的講述,也只能停留在理論的描述階段,無法進行感性的認識和實際案例的對比。
(3)近似計算問題。大數據環境下討論的問題很大程度上是無法精確求解問題。也就是說計算機科學原本關心的節“連續”數學問題的的算法,比如求sinx和lnx這種函數的值或積分,首先本身無法精確求解,其次對它們求解所需要處理的數值長度計算機只能用有限的精度來表示。這會導致偏差的問題和討論。而這個通常是在數值分析課程中討論的,而這門課在傳統教學中并沒有和算法課程聯系起來。
所以本文準備在以下幾個方面討論算法分析與設計課程針對大數據環境的教學變更。
算法的思想是前人智慧的總結,但所有成型的算法案例都是存在自身的適用環境和局限性。簡單灌輸給學生簡單快捷,但是授人以魚不如授人以漁,簡單灌輸會讓學生缺少自身的思考和判斷,失去思維能力提升的寶貴機會。在其后面對同類型新問題或是問題發生部分變化的情況下,依然不知道如何下手,不懂變通和變化。因此不再專門講述算法的上界下界概念和算法效率分析,轉為對比遞歸和非遞歸的數學分析,在對比中講述輸入規模的度量和度量單位。將算法效率分析以潛移默化的方式分散進數學分析部分和算法效率對比部分,在建模的過程中培養思維和灌輸基本概念。到研究生階段的算法效率分析中再著重講述,畢竟應用型不需要這么多理論分析的內容。
因為針對的是應用型和工程型本科生,所以應該立足于“用”,教授貼近實際案例的使用方式和適用模式。改變當前按歸類類型以分治、動態規劃、貪心等方法對內容進行分割,在相互獨立的講授的授課方式,變以按重要問題的類型梳理算法分類教學。例如:不再糾結分治法可以應用于那些方面和場景,可以針對場景進行什么樣的剪枝或是變治;而直接以具體的排序查找問題的情況變化,選擇算法適用的類型和相應的對比變化。例如:針對二分查找為例,啟發學生基于樸素思想的順序查找沒有充分利用數據有序的固有特點,而利用中間元素做閾值,不斷拋棄一半規模元素,以不斷縮小問題規模,迅速定位找到該元素加以細化。在求解問題以后,再啟發學生是否存在更優解法,而為后續的算法變化和教授打下伏筆。從而在二分查找這類問題中衍生講述蠻力排序、分治排序、計數排序、迭代改進等算法思維,在學生接觸算法解題方法的同時理解計算復雜度和算法的適用場景區分。
算法設計與分析所涉及的領域非常廣泛,除去排序、收索、數值問題、圖、路徑、組合等基本典型的常規算法和可計算理論、計算復雜度,就是要與現行前沿科學向結合,緊跟算法領域的應用和研究,例如近年來討論比較多的近似算法、模式識別算法;大數據領域常用的推薦CF算法、分類SVM算法、NB算法、LR分析等。所以在內容選擇上教師在教學的時候需要有所取舍。以大數據環境為場景,算法分析與設計課程應該考慮減少常用傳統算法理論的教授時間,更多的考慮算法在場景中的應用側重。例如線性規劃在大數據領域中經常可以看到。而算法設計與分析課程中并沒有單列一個線性規劃算法的章節,當然也沒有必要單列。教師可以從數值問題出發,以通過對歷史數據的表現求未來結果發生的概率的這一類問題的講述和求解,引申出線性規劃分治解決方案,從而討論迭代改進中的單純形法的應用。還例如決策樹的概念。可以在二叉樹的應用問題中逐一引申。從遍歷問題的分治方案到減少規模的計算復雜度討論,再衍生到動態規劃的最優二叉查找樹,最后到達決策樹的問題。不必具體設立專門的章節講述思維措施,可以在實際問題的求解和環境的變化討論過程中就慢慢地進行思維的培養和設計能力的鍛煉。這樣的作法可以讓學生更有興趣和成就感。可以吸引學生愿意更深入的學習了解算法,使算法課程不再是一門沉悶無趣的理論課程,而是一個可以很好師生溝通交流的實用課程。
專業知識的學習不能以考試合格作為最終目標,而應以實踐應用作為理解掌握的基礎。要想取得算法分析與設計課程良好的教學效果,關鍵是將教學內容、教學方法和生產生活的實際事例進行合理有效的組合,最大限度地激發學生的學習興趣和主觀能動性,這需要不斷地探索與實踐。雖然是通過教學實踐總結了一個體系,但是必然尚存在諸多不足。所提出的方法能否解決當下課程的問題?是否是最有效的解決方案?是值得討論的。一家之言,希望能夠拋磚引玉獲得各位專家的批評指正。