源程式的相似性判斷 初級版本(雜湊表)

2021-09-11 10:42:18 字數 3292 閱讀 8735

對於兩個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 請問怎樣才能計算上面兩句話的相似程度?基本...