對於兩個c++語言的源程式**,用雜湊表的方法分別統計兩個程式中使用c++語言關鍵字的情況,並最終按定量的計算結果,得出兩份程式的相似性。
建立c++語言關鍵字的雜湊表,統計在每個源程式中c++關鍵字出現的頻度,
得到兩個向量x1和
x2,通過計算向量x1和
x2的相對距離來判斷兩個源程式的相似性。
例如:
關鍵字void int for char if else while do break class 程式1
關鍵字頻度
4 3 0 4 3 0 7 0 0 2 程式2
關鍵字頻度
4 2 0 5 4 0 5 2 0 1
x1=[4,3,0,4,3,0,7,0,0,2]
x2=[4,2,0,5,4,0,5,2,0,1] 設
d是向量x1和
x2的相對距離,
d=sqrt( ∑(x1[i
]-x2[i
]) 2 )
,當x1=x2時,d
=0,
反映出可能是同乙個程式;
d值越大,則兩個程式的差別可能也越大;設s為向量x1和x2的相似度(用向量間的夾角余弦值來衡量),s=(x1·x2)/(|x1||x2|),確定乙個閾值,當s大於閾值時,兩程式可能相似。綜合s和d來判斷相似度。當s大於給定閾值且d小於給定閾值時,有理由相信兩程式相似。
#include#include#include#include#include#define n 32 //關鍵字個數
#define size 256
#define maxlen 9 //關鍵字陣列長度
#define hashlen 41 //雜湊表長度
#define smax 0.9 //相似度s的閾值
#define dmin 2 //d幾何距離的閾值
struct hashtable //結構體陣列雜湊表
hasht[hashlen];
using namespace std;
void hashfunc(char str); //將關鍵字根據雜湊函式放入雜湊表的指定位置
int hashfind(char *words); //在雜湊表中找是否該word為關鍵字,並記錄頻度
void creathash(void); //建立雜湊表
int readc(char *filename); //讀取源程式檔案中的單詞
int isletter(char ch); //判斷是否為字母
void resethash(int n); //重置雜湊表
void copycount(int x,int n); //將頻數拷貝到陣列裡
float mol(int *x); //取模函式
int dot(int *x1,int *x2); //點積函式
float d(int *x1,int *x2); //求距離d的函式
float s(int *x1,int *x2); //求相似的s的函式
void check(int *x1,int *x2); //檢查兩個源程式是否相似
int main()
; char filename2=;
char filename3=;
int x1[hashlen],x2[hashlen],x3[hashlen]; //儲存頻度數的陣列,用於相似的s的計算
hasht[hashlen]; //宣告雜湊表 結構體
resethash(0); //完全重置雜湊表,即雜湊表指標位置為null,頻數為0
creathash(); //通過檔案keyword.txt建立雜湊表
copycount(x1,hashlen); //將統計好的頻數複製給x陣列
resethash(1); //僅僅將頻數count置為0
copycount(x2,hashlen); //將統計好的頻數複製給x陣列
resethash(1); //僅僅將頻數count置為0
copycount(x3,hashlen); //將統計好的頻數複製給x陣列
cout<= 'a' && ch<= 'z')) return 1;
else return 0;
}int readc(char *filename)
while(!feof(fp1)) //當檔案未讀取完,迴圈 //結束返回1
//對feof()來說,它的工作原理是,站在游標所在位置,向後看看還有沒有字元。如果有,返回0;如果沒有,返回非0。
//它並不會讀取相關資訊,只是檢視游標後是否還有內容。
while(isletter(ch) == 1 && feof(fp1) == 0) //讀取字母且未完
i=0;
break;
} //超過最大關鍵字長度將會跳過當前識別區域,讀取下乙個單詞
else
} words[i]='\0';
hashfind(words); //將得到的該單詞調入hashfind函式,來判斷是否為關鍵字,並統計頻度數 *********************
} fclose(fp1);//結束檔案流的讀取
return 0;
}float mol(int *x)
{ //取模函式
int i=0,sum=0;
for(i=0;i閾值&&幾何距離《閾值
設計初期,這個問題主要帶來四個思考:
1.如何建立雜湊表?
4.如何將頻度數轉化成向量並求出s和d?
1.建立雜湊表,對檔案keyword.txt中的關鍵字讀取,將關鍵字根據雜湊函式放入雜湊表的指定位置
4.新建向量陣列,將頻度數copy進陣列中,進而完成s和d的計算
曼舞精靈
奶牛的相似性
奶牛的相似性 description 農夫約翰有兩頭奶牛,他想要知道,這兩頭奶牛到底有多相似,所以他給每頭奶牛拍了mn 指m行n列 的數碼相片,他想要你寫乙個程式幫助他。mn的數碼相片可以分辨出奶牛身上黑色和白色的斑塊,下面是兩頭奶牛的數碼 x 表示黑色部分,表示白色部分 其中m 5,n 7。奶牛1...
訊號相似性的描述
訊號相似性的描述 在很多的應用場合,經常要描述兩個訊號的相似性。比如在雷達的訊號檢測中,要比較所接收的訊號是否就是發射訊號的延時。有時候,甚至還要描述乙個訊號本身的相似性,比如在語音編碼中,要通過語音頻號本身的相似性,來 下一時刻的訊號值。我們知道,在訊號處理中,用相關函式來描述訊號的相似性。描述兩...
余弦相似性的應用 找出相似文章
為了找出相似的文章,需要用到 余弦相似性 cosine similiarity 下面,我舉乙個例子來說明,什麼是 余弦相似性 為了簡單起見,我們先從句子著手。table 句子a 我喜歡看電視,不喜歡看電影。句子b 我不喜歡看電視,也不喜歡看電影。table 請問怎樣才能計算上面兩句話的相似程度?基本...