題目描述:
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
分析:第一步:用hash表將查詢串儲存並計數
第二步:建大小為k的最小堆,以查詢串的個數做比較,將堆頂元素與後面的進行比較,如果比堆頂的元素大,替換,否則繼續
第三步:輸出最小堆
#include#include#includeusing namespace std;
#define hashlen 2807303
#define wordlen 30
typedef struct node_no_space *ptr_no_space;
typedef struct node_has_space *ptr_has_space;
ptr_no_space head[hashlen];
struct node_no_space
;struct node_has_space
;//hashfunction
int hash_function(const char *p)
} return value;
}//add node to hash table;
p = p->next;
} ptr_no_space q = new node_no_space;
q->word = new char[strlen(str)+1];
strcpy(q->word,str);
q->count = 1;
q->next = head[index];
head[index] = q;
}//write thr result to file;
void write_to_file()
i++;
} fclose(fp);
}//modify minheap for word counts
void sift_down(node_has_space heap, int i, int len)
}// 去除字串前後符號
void handle_symbol(char *str, int n)
while (str[0] < '0' || (str[0] > '9' && str[0] < 'a') || (str[0] > 'z' && str[0] < 'a') || str[0] > 'z')
str[i] = '\0';
n--;
} } int main()
fclose(fp_passage);
// 將統計結果輸入檔案
write_to_file();
int n = 10;
ptr_has_space heap = new node_has_space [n+1];
int c;
file *fp_word = fopen("c:/users/administrator/desktop/data/result.txt", "r");
assert(fp_word);
for (int j = 1; j <= n; j++)
// 建立小根堆
build_min_heap(heap, n);
// 查詢出現頻率最大的10個單詞
while (fscanf(fp_word, "%s %d", &str, &c) != eof)
} fclose(fp_word);
// 輸出出現頻率最大的單詞
for (int k = 1; k <= n; k++)
cout << heap[k].count << " " << heap[k].word << endl;
return 0;
}
搜尋引擎 索引
正排索引 文件編號,單詞編號,單詞的數量,單詞出現的位置。倒排索引 1,單詞詞典,儲存單詞以及統計資訊,單詞在記錄表中的便宜,可常駐記憶體,用雜湊表儲存。2,記錄表,單詞對應的文件集合,記錄單詞出現的數目 位置。文件採用差分變長編碼。其中文件可按編號公升序排列 可利用差分編碼 也可按出現次數排列,可...
MySQL搜尋引擎程式 mysql搜尋引擎
mysql是我們比較常用的一種資料庫軟體。它有著諸多的優點,如開源的,免費的等等。其實它還有乙個很好的特點,那就是有多種引擎可以供你選擇。如果賽車手能根據不同的路況,地形隨手更換與之最適宜的引擎,那麼他們將創造奇蹟。然而目前他們還做不到那樣便捷的更換引擎,但是我們卻可以 所謂知己知彼方可百戰不殆,要...
搜尋引擎 倒排索引
本節通過引入簡單例項,介紹與搜尋引擎索引有關的一些基礎概念,了解這些基礎概念對於後續深入了解索引的工作機制非常重要。3.1.1單詞 文件矩陣 單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3...