[問題描述]
對于兩個C語言的源程式清單,用哈希表的方法分別統計兩個程式中使用C語言關鍵字的情況,并最終按定量的計算結果,得出兩份源程式清單的相似性。
[基本要求]
C語言關鍵字的哈希表可以自建,也可以利用《資料結構及應用演算法教程》(嚴蔚敏 陳文博編著 清華大學出版社)書中8。10的哈希表。此題的作業主要是掃描給定的源程式,累計在每個源程式中C語言關鍵字出現的頻度。在掃描源程式程序中,每遇到關鍵字就查找哈希表,并累加相應關鍵字出現的頻度。為保證查找效率,建議自建哈希表的平均查找長度ASL不大于2。
掃描兩個源程式所統計的所有關鍵字不同頻度,可以得到兩個向量。如下面簡單的例子所示:
Void Int For Char If Else while
4 3 4 3 7 0 2
4 2 5 4 5 2 1
關鍵字
程式1種關鍵字頻度
程式2種關鍵字頻度
哈希地址 0 1 2 3 4 5 6 7 8 9
X1=[4,3,0,4,3,0,7,0,0,2] X2=[4,2,0,5,4,0,5,2,0,1]
通過計算向量X1和X2的相對距離來判斷兩個源程式的相似性,相對距離的計算方法是
,T表示向量的轉置。
按例子所給的資料,s 0.13。顯然當X1=X2時,s=0,反映出可能是同一個程式;s值越大,則兩個程式的差別可能也越大。
[測驗資料]
做幾個編譯和運行都無誤的C程式,程式之間有相近的和差別大的,用上述方法求s,并對比差異程度。
[實作提示]
本題的很大作業量將是對源程式掃描,區分出C程式的每一關鍵字。可以為C語言關鍵字集建一棵鍵樹,掃描源程式和在鍵樹中查找同步進行,以取得每一個關鍵字。
[問題討論]
這種判斷方法只是提供一種輔助手段,即便s=0也可能不是同一個程式,s的值很大,也可能演算法是完全一樣的。例如,一個程式使用while陳述句,另一個使用for陳述句,但功能完全相同。事實上,當發現s的值很小時,就應該以人工干預來區分。
uj5u.com熱心網友回復:
哎 copy?uj5u.com熱心網友回復:
這是作業么
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156877.html
標籤:數據庫及相關技術
上一篇:后序線索二叉樹
