百度之星 2023年 初賽題目四

2021-08-26 19:37:15 字數 4571 閱讀 1253

第四題(共四題100 分):低頻詞過濾(40 分)

題目描述:請編寫程式,從包含大量單詞的文字中刪除出現次數最少的單詞。如果有多

個單詞都出現最少的次數,則將這些單詞都刪除。

輸入資料

測試corpus.txt 檔案,實際執行時我們會使用不同內容的輸入檔案。)

輸出資料:在標準輸出上列印刪除了corpus.txt 中出現次數最少的單詞之後的文字(

詞與詞保持原來的順序,仍以空格分隔)。

評分標準:程式輸出結果必須正確,記憶體使用越少越好,程式的執行時間越快越好。

思路:因為詞彙的頻率是乙個未知數,在統計的過程中無法探知到哪些多哪些少,必須把所有的詞彙進行統計才能統計出哪些詞彙詞頻最低。故1、構造hash表,對出現的詞彙進行統計,統計詞頻。2、然後獲取到詞頻最低的列表。3、對原文進行處理,剔除低頻詞彙。

ghash.h

#ifndef __ghash_h_

#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

ghash.c

#include#include#include#include "ghash.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)

glish.h

#ifndef __glist_h_

#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

glish.c

#include #include #include "glist.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;

}

4lib.h

#ifndef __4lib_h_

#define __4lib_h

#define true 1

#define false 0

char *strdup(const char *str);

#endif

4lib.c

char *strdup(const char *str)

return dup;

}

main.c

#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 ...