您的位置:首页 > 职场人生

百度面试题及我的解答(4)

2009-11-29 11:29 225 查看
输出函数由于太忙一直没写。先把主要数据结构列出来吧。

数组的每一项都是一个链表,数组长度26是因为我假设没有一个单词的长度超过26……<小程序就不较真了>

typedef struct tag_WORD_STOR{
WORD_NODE* words_arr_cnt[26];
bool has_store;
} WORD_STOR;


链表节点数据结构如下:

typedef struct tag_WORD_NODE{
int sum_str; // 单词ASCII码累加结果,HASH主关键字
int cnt_str; // 单词长度,HASH次关键字
char *str;   // 单词
char *sorted_str;  // 字母序拍序后的单词
struct tag_WORD_NODE* next; //List->Next
} WORD_NODE;


HASH表:

typedef void WORD_LIST_PROCESS_FUNC(WORD_NODE* plist, ostream& out);
class HashMethod1  // 当前使用的Hash算法:累加,长度二级HASH的CLASS化
{
private:
WORD_STOR* words_arr;
BUF<WORD_NODE> *pWordBuf;
BUF<char> *pStrBuf;

public:
HashMethod1();
~HashMethod1();
bool InitHashTbl(int buf_size);
bool Add(char* str);
void TraverseTbl(WORD_LIST_PROCESS_FUNC* pprocessFunc, ostream& out);
};


代码解释:

上面的HASH表声明中,words_arr就是Hash表,words_arr是一个长度为65535的指针数组(我承认,我偷懒了)。

65535的长度确保了,每一个单词ASCII码的和都能落在数组的范围内。

每一个words_arr[i]都有一个成员变量WORD_NODE* words_arr_cnt[26],ASCII码和一样的单词,在words_arr[i]内,在按照长度进入不同的words_arr_cnt[j]。这样做主要是为了简化后面的排序和比较流程。

HASH表其他字段pWordBuf和pStrBuf都是用来分配内存的Buffer,简单的小优化。对于2.6M的小规模数据输入,性能提升不明显。

InitHashTbl:初始化Hash表,由于要分配内存,所以构造函数不做初始化。

Add:添加一个新单词到HASH表。

TraverseTbl:遍历整个HASH表,并对每个words_arr[i]链表应用p[ocessFunc函数。这个是完成题目的主要函数。会在"百度面试题及我的解答(3)"中描述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: