- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
谁能告诉我, 在《哈利·波特》共七集的小说中, “Harry Potter”的名字 总共出现了多少次? 这个问题简单,只要把几本书 扫描一遍就知道答案了!来个难一点的: 你能按照所有单词出现的词频大小 依次输出全部单词吗? 第5章 散列查找 §5.6 应用实例 第5章 散列查找 §5.6 应用实例 [例5.9] 给定一个英文文本文件,统计文件中所有单词出现的频率,并输出词频最大的前10%的单词及其词频。 为简单起见,假设单词字符定义为大小写字母、数字和下划线,其他字符均认为是单词分隔符,不予考虑。 【分析】解决这个问题的最基本的工作、也是大量的工作是不断对新读入的单词在已有单词表中查找,如果已经存在,则将该单词的词频加1,如果不存在,则插入该单词并记词频为1。 核心问题: 如何设计该单词表的数据结构才可以进行快速地查找和插入? 散列表! ?主控函数 (p.183) 第5章 散列查找 §5.6 应用实例 int main() { /* 1 */ int TableSize = 10000; /* 散列表的估计大小 */ int wordcount = 0, length; HashTable H; ElementType word; FILE *fp; /* 2 */ char document[30]= HarryPotter.txt“; /* 要被统计词频的文件名 */ /* 3 */ H = InitializeTable( TableSize ); /* 建立散列表 */ /* 4 */ if(( fp = fopen(document, “r” ))==NULL) FatalError(“无法打开文件!\n” ); while( !feof( fp ) ){ /* 5 */ length = GetAWord( fp, word ); /* 从文件中读取一个单词 */ /* 6 */ if(length 3){ /* 只考虑适当长度的单词 */ /* 7 */ wordcount++; /* 8 */ InsertAndCount( word, H ); } } fclose( fp ); /* 9 */ printf(该文档共出现 %d 个有效单词,, wordcount); /* 10 */ Show( H ,10.0/100 ); /* 显示词频前10%的所有单词 */ /* 11 */ DestroyTable( H ); /* 销毁散列表 */ return 0; } 查找散列表,若存在,则将该单词的词频加1,若不存在,则插入。 根据散列表,输出最频繁出现的给定百分比(10%)的单词。 * 第5章 散列查找 §5.4 处理冲突的方法 ? 开放定址法(Open Addressing) 【定义】所谓开放定址法,就是一旦产生了冲突,即该地址已经存放了其它数据元素,就去寻找另一个空的散列地址。 ? 若发生了第 i 次冲突,试探的下一个地址将增加di,基本公式是: hi(key) = (h(key)+di) mod TableSize ( 1≤ i TableSize ) (公式5.10) ? di 决定了不同的解决冲突方案:线性探测、二次探测、双散列。 ? 处理冲突的方法 常用的处理冲突的方法有两种:开放地址法和链地址法。 在没有装满的散列表中, 空的散列地址是否总能找到? di = i di = ± i2 di = i*h2(key) 1. 线性探测法(Linear Probing) 第5章 散列查找 §5.4.1 开放地址法 ? 即线性探测法以增量序列 1,2,……,(TableSize -1)循环试探下一个存储地址。 [例5.6] 设关键词序列为 {47,7,29,11,9,84,54,20,30}, ? 散列表表长TableSize =13, ? 装填因子 α = 9/13 ≈ 0.69; ? 散列函数为:h(key) = key mod 11。 ?用线性探测法处理冲突,列出依次插入后的散列表, ? 并估算查找性能。 关键词 (key) 47 7 29 11 9 84 54 20 30 散列地址 h(key) 3 7 7 0 9 7 10 9 8
文档评论(0)