第四題(共四題100 分):低頻詞過濾(40 分)
題目描述:請編寫程式,從包含大量單詞的文字中刪除出現次數最少的單詞。如果有多
個單詞都出現最少的次數,則將這些單詞都刪除。
輸入資料
測試corpus.txt 檔案,實際執行時我們會使用不同內容的輸入檔案。)
輸出資料:在標準輸出上列印刪除了corpus.txt 中出現次數最少的單詞之後的文字(
詞與詞保持原來的順序,仍以空格分隔)。
評分標準:程式輸出結果必須正確,記憶體使用越少越好,程式的執行時間越快越好。
思路:因為詞彙的頻率是乙個未知數,在統計的過程中無法探知到哪些多哪些少,必須把所有的詞彙進行統計才能統計出哪些詞彙詞頻最低。故1、構造hash表,對出現的詞彙進行統計,統計詞頻。2、然後獲取到詞頻最低的列表。3、對原文進行處理,剔除低頻詞彙。
ghash.h
#ifndef __ghash_h_ghash.c#define __ghash_h_
#include "glist.h"
#define hashsize 512
typedef struct _item
item;
void ghashinit();
item * hashinsert(char * key,char * value);
item * hashsearch(char * key);
int hashincrease(char * key);
int hashremove(char * key);
void getminlist(list* glist);
void freeghash();
void printghash();
#endif
#include#include#include#include "ghash.h"glish.h#include "4lib.h"
//#include "glist.h"
static struct item *hashtab[hashsize];
static void freeitem(item * item);
static unsigned int _hash(char *key);
static unsigned int _elfhash(char *str);
void ghashinit()
hashval = _hash(key);
np->next = (struct item *)hashtab[hashval];
hashtab[hashval] = (struct item *)np;
}else
}return np;
}item * hashsearch(char * key)
int hashincrease(char * key)
hashval = _hash(key);
np->value=null;
np->count=1;
np->next = (struct item *)hashtab[hashval];
hashtab[hashval] = (struct item *)np;
return 1;
}else
return np->count;
}return np->count;
}int hashremove(char * key)
void getminlist(list* glist)
else if(tmp->countkey,glist);
curmin=tmp->count;
}tmp=tmp->next;}}
}}void freeghash()}}
}void printghash()
printf("\n");}}
}static unsigned int _hash(char *key)
// elf hash function
static unsigned int _elfhash(char *str)
}//返回乙個符號位為0的數,即丟棄最高位,以免函式外產生影響。(我們可以考慮,如果只有字元,符號位不可能為負)
return (hash & 0x7fffffff);
}static void freeitem(item * item)
#ifndef __glist_h_glish.c#define __glist_h_
typedef struct _node
node;
typedef struct _list
list;
void glistinit(list* glist);
void glistaddnode(char* data,list* glist);
void glistemptylist(list * glist);
int glistgetcount(list* glist);
void glistprint(list * glist);
#endif
#include #include #include "glist.h"4lib.h#include "4lib.h"
//static list glist ;
void glistinit(list* glist)
void glistaddnode(char* data,list* glist)
int getcount(list* glist)
void freenode(node * node)
void glistemptylist(list * glist)
glist->count=0;
glist->header=null;
}void glistprint(list * glist)
printf("\n");
}int glistsearch(char * data,list* glist)
return false;
}
#ifndef __4lib_h_4lib.c#define __4lib_h
#define true 1
#define false 0
char *strdup(const char *str);
#endif
char *strdup(const char *str)main.creturn dup;
}
#include #include #include #include "glist.h"該解決方案不包含的內容:#include "ghash.h"
#include "4lib.h"
#define input "4.input.txt"
#define readbufsize 513
#define freadsize ((readbufsize-1))
#define keepbufsize (readbufsize*2)
char keepbuf[keepbufsize];
extern int hashincrease(char * key);
void handleritem(const char *item)
void hanlderbuf(const char * buf)
else
tmp=next;
}}void handleritemout(char *item,list * glist)
void hanlderbufout(char * buf,list * glist)
else
tmp=next;
}}int main(int argc, char *argv)
ghashinit();
char readbuf[readbufsize];
memset(keepbuf,'\0',keepbufsize);
memset(readbuf,'\0',readbufsize);
int readnum;
while((readnum=fread(readbuf,sizeof(char),freadsize,f))>0)
memset(keepbuf,'\0',keepbufsize);
memset(readbuf,'\0',readbufsize);
readnum;
while((readnum=fread(readbuf,sizeof(char),freadsize,f))>0)
1、 在對詞彙進行統計的時,未記錄詞彙的位置,造成在提出低頻詞彙時需要再次比對,可以提公升
2、 僅適用於最低頻的,無法針對詞頻範圍。如果需要則可以修改為hashtable的衝突列表為順序列表
3、 無法獲得每個低頻詞彙的出現的順序
4、 替換低頻詞彙效率不高
百度之星 2023年 初賽題目一
題目描述 乙個正整數有可能可以被表示為n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提供給程式。輸出資料 在標準輸出上列印出符合題目描述的...
2023年百度之星程式設計大賽試題初賽題目 題1
第一題 共四題 100 分 連續正整數 10 分 題目描述 乙個正整數有可能可以被表示為 n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提...
2023年百度之星程式設計大賽試題初賽題目 題3
第三題 共四題 100 分 字串替換 30 分 題目描述 請編寫程式,根據指定的對應關係,把乙個文字中的字串替換成另外的字串。輸入資料 程式讀入已被命名為 text.txt 和 dict.txt 的兩個輸入資料文字檔案,text.txt 為乙個包含大量字串 含中文 的文字,以 whitespace ...