博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DS实验题 Searchname
阅读量:6463 次
发布时间:2019-06-23

本文共 2103 字,大约阅读时间需要 7 分钟。

题目:

885822-20161212135918823-1944591412.png

思路:

如果直接暴力搜索的话,时间复杂度为O(n*m),在n为百万量级的情况下,必然是T。

所以,这里通过hash函数,将字符串转换为对应的hash值;同时利用邻接表避免了hash冲突,方法是用head[hashval]存储指向一个相同hash值的单链表的指针(这里指的是相当于一个头指针),如果一个字符串得到的hash值在之前出现过,则加入单链表;最后在查找的时候,只需要找字符串对应hash值的单链表即可。

注意:(1)在建立邻接表的时候,新插入的节点不断加入到链表的首部,这样在查询的时候,刚好是相反的。(2)hash函数选用IndexHash。

时间复杂度O(n)。

代码:

////  main.cpp//  searchme////  Created by wasdns on 16/12/12.//  Copyright © 2016年 wasdns. All rights reserved.//#include 
#include
#include
#define mod 999983 //int范围内取最大的素数#define maxn 1000005using namespace std;/* Hash函数:IndexHash */int IndexHash(char *s){ int hashval = 0; while (*s != '\0') { hashval = (hashval << 5) + *s++; } return hashval % mod;}char searchname[maxn][10]; //你的名字int head[maxn]; //邻接表的头数组int lnext[maxn]; //邻接表的节点数组int tot = 1; //第tot个字符串/* AddNode创建邻接表函数: 在head[hashval]中存指向单链表的指针 插入时,现有head的值存入lnext[tot] 之后使head[hashval]成为新的节点 相当于不断在链表的首部进行插入 */void AddNode(int hashval){ lnext[tot] = head[hashval]; head[hashval] = tot; tot++;}/* 询问函数: 通过IndexHash得到hash值 利用head[hashval]找到指向对应hash值的单链表 遍历单链表,找到 -> 计数器++。 */void query(int q){ int cnt = 0; for (int i = 1; i <= q; i++) { int hashval = 0; char findname[10]; scanf("%s", findname); hashval = IndexHash(findname); for (int j = head[hashval]; j != -1; j = lnext[j]) { if (strcmp(searchname[j], findname) == 0) { cnt++; } } } printf("%d\n", cnt);}int main(){ memset(head, -1, sizeof(head)); memset(lnext, -1, sizeof(lnext)); int n, m; cin >> n >> m; int i; for (i = 1; i <= n; i++) { scanf("%s", searchname[i]); int hashval = IndexHash(searchname[i]); AddNode(hashval); } cout << endl; query(m); return 0;}

2016/12/12

转载地址:http://swezo.baihongyu.com/

你可能感兴趣的文章
树状数组
查看>>
DNS害我不能上网,找几个备用
查看>>
路由器的密码恢复
查看>>
Elasticsearch 集群优化篇
查看>>
Seam开发环境中的中文乱码问题
查看>>
Samba日志分析
查看>>
[CTO札记]杂论架构
查看>>
Flash CS 6绘图技巧之锁定填充
查看>>
P2P网络“自由”穿越NAT的“秘密”
查看>>
【Hibernate框架开发之六】Annotation关系映射&组件映射!
查看>>
基于队列的线程池
查看>>
Exchange 2013防止数据丢失DLP预览
查看>>
cocos2d-x自制工具06:AnimatePacker源代码
查看>>
Bex5开发技巧之如何在列表中显示主键字段
查看>>
方法重写,隐藏在子类父类中的各种调用实践
查看>>
ubuntu mpi多机实践
查看>>
c# var的含义与用法
查看>>
Hyper-V3:虚拟机的配置
查看>>
matplotlib绑定到PyQt5(无菜单)
查看>>
卸载360企业版密码
查看>>