哈希表对字符串的高效处理

简介: 哈希表对字符串的高效处理方法。

哈希表对字符串的高效处理

哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的方法。

Hash表是使用 O(1)时间进行数据的插入、删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是 O(N) 。

 

/* 字符串中完成过滤重复字符的功能,

【输入】:1.常字符串;2.字符串长度;3.【out】用于输出过滤后的字符串.

【输出】:过滤后的字符串。

*/

思路1

循环判定法。第1步,先记录字符串中第1个字符;第2步,然后从第2个字符开始,判定其和其前面的字符是否相同,不相同的话,则统计进去;相同的话则继续遍历,直到字符串末尾(遇到’0’)。时间复杂度:O(n2)。

思路2

哈希表过滤法。第1步,初始化一个哈希表,用以存储字符(key)及字符出现的次数;第2步,遍历哈希表,进行统计计数;第3步,输出统计次数为1及统计次数多余1的(输出1次)。时间复杂度:O(n)。

//循环判定法过滤掉重复字符

void stringFilter(const char*pInputStr, long lInputLen, char *pOutputStr)
{
       if(pInputStr== NULL || lInputLen == 0 || pOutputStr == NULL)
       {
              return;
       }
      
       intnCnt = 0;
       *pOutputStr= pInputStr[0];            //先处理第一个
       ++nCnt;
      
       intnNotEqualCnt = 0;                 //统计计数
       for(inti = 1; i < lInputLen; i++)
       {
              nNotEqualCnt= 0;
              for(intj = i-1; j >=0; j--)
              {
                     if(pInputStr[i]!= pInputStr[j])
                     {
                            ++nNotEqualCnt;
                     }
              }
             
              if(nNotEqualCnt== i)  //和前面的都不一样.
              {
                     pOutputStr[nCnt++]= pInputStr[i];
              }
             
       }//endfor
       pOutputStr[nCnt]= '\0';
}

//哈希表法过滤字符串中的重复字符

void stringFilterFast(const char*pInputStr, long lInputLen, char *pOutputStr)
{
       charrstChar = '\0';
       boolbNotRepeatFound = false;
       constunsigned int size = 256;
       unsignedint hashTable[size];
       constchar* pHashKey = pInputStr;
       intoutPutCnt = 0;
      
       if(pInputStr== NULL)
       {
              return;
       }
      
       //初始化哈希表
       for(unsignedint i = 0; i < size; i++)
       {
              hashTable[i]= 0;
       }
      
       //将pString读入到哈希表中
       while(*pHashKey!= '\0')
       {
              cout<< *pHashKey << "\t";
              hashTable[*pHashKey]++;    //统计计数
              pHashKey++;
       }    
 
       //读取哈希表,对只出现1次的进行存储,对出现多次的进行1次存储。
       pHashKey= pInputStr;
       while(*pHashKey!= '\0')
       {
              if((hashTable[*(pHashKey)])== 1)   //仅有一次,
              {
                     pOutputStr[outPutCnt++]= *pHashKey;
              }
              elseif((hashTable[*(pHashKey)]) > 1) // 多余一次,统计第一次
              {
                     pOutputStr[outPutCnt++]= *pHashKey;
                     hashTable[*(pHashKey)]= 0;
              }
              pHashKey++;
       }
       pOutputStr[outPutCnt]= '\0';
 
}
 
int main()
{
       constchar* strSrc = "desdefedeffdsswwwwwwwwwwdd";//"desdefedeffdssw";
       char*strRst =new char[strlen(strSrc)+1];
       stringFilter(strSrc,strlen(strSrc), strRst);
       cout<< strRst << endl;
       if (NULL != strRst){  delete[] strRst;  strRst = NULL;}      return 0;
}

 

//哈希表法查找字符串中第一个不重复的字符

【功能】:查找字符串中第一个不重复的字符。

【输入】:字符串。

【输出】:第一个不重复的字符。

时间复杂度O(n),思路类似于上面的哈希表过滤法。

char FirstNotRepeatingChar(constchar* pString)
{
       charrstChar = '\0';
       boolbNotRepeatFound = false;
       constunsigned int size = 256;
       unsignedchar hashTable[size];
       constchar* pHashKey = pString;
 
       if(pString== NULL)
       {
              returnrstChar;
       }
 
       //初始化哈希表
       for(unsignedint i = 0; i < size; i++)
       {
              hashTable[i] = 0;
       }
      
       //将pString存入到哈希表中
       while(*pHashKey!= '\0')
       {
              hashTable[*(pHashKey++)]++;    //统计计数
       }
 
       //读取哈希表,找到第一个=1的字符,bNotRepeatFound用于查找。.
       pHashKey= pString;
       while(*pHashKey!= '\0')
       {
              if((hashTable[*(pHashKey)]) == 1)
              {
                     bNotRepeatFound= true;
                     rstChar= *pHashKey;
                     break;
              }
              pHashKey++;
       }
 
       if(bNotRepeatFound)
       {
              cout<< "The first not Repeate char is " << rstChar <<endl;
       }
       else
       {
              cout<< "The first not Repeate char is not Exist " << endl;
       }
 
       returnrstChar;
}
 
int main()
{
       constchar* strSrc = "google";
       constchar* strSrc2 = "yyy@163.com";
       constchar* strSrc3 = "aabbccddeeff";
       constchar* strsrc4 = "11111111";  
                                                                                                                   
       constchar* strArray[4] = {strSrc, strSrc2, strSrc3, strsrc4};
 
      for(inti = 0; i < 4; i++)
      {
              FirstNotRepeatingChar(strArray[i]);
       }
 
       return0;
}

举一反三

百度面试题】对于一个海量的文件中存储着不同的URL,用最小的时间复杂度去除重复的URL。可借鉴字符串处理的哈希表过滤法。不过,这里的大文件等价于之前的字符串,这里的URL等价于之前的字符。

相关文章
操作系统:死锁资源的计算
操作系统:死锁资源的计算
2596 0
|
22天前
|
数据采集 人工智能 运维
你是否正在经历知识管理的 “隐形内耗”​
知识散乱、查找低效、协作困难?PandaWiki,AI驱动的开源知识库,5分钟一键部署,支持私有化与混合云,实现智能语义搜索、自动文档生成、跨平台集成。告别信息孤岛,让知识“活”起来,提升团队效率,赋能个人成长,重塑知识管理新范式。(238字)
|
10月前
|
关系型数据库 测试技术 新制造
基于 Websoft9 平台的 Odoo 教学实践:助力智能制造、物流与财务会计专业教师提升教学效果
Websoft9 是企业级开源软件自动化部署与管理平台,为高校智能制造、物流及财务会计等专业提供完整的 Odoo 教学解决方案。通过开箱即用的部署、全生命周期维护和功能扩展支持,助力教师快速构建真实业务场景,降低技术门槛。学生可进行模块化开发实践,并结合 CI/CD 工具链体验产业级 DevOps 流程,实现理论与实践结合,培养跨学科综合能力。
|
5月前
|
存储 安全 数据处理
阿里云OSS如何支持大规模数据迁移和传输?
阿里云OSS凭借全球基础设施、无限扩展、高持久性、成本优化及安全防护等优势,成为企业大规模数据迁移与传输的首选。其支持智能分层存储、高速传输及多场景数据处理,提供端到端解决方案,助力企业高效构建全球化数据管道,实现数据价值最大化。
|
数据采集 运维 算法
大数据项目管理:从需求分析到成果交付的全流程指南
【4月更文挑战第9天】本文介绍了大数据项目从需求分析到成果交付的全过程,包括需求收集与梳理、可行性分析、项目规划、数据准备与处理、系统开发与集成,以及成果交付与运维。文中通过实例展示了如何进行数据源接入、数据仓库建设、系统设计、算法开发,同时强调了需求理解、知识转移、系统运维的重要性。此外,还提供了Python和SQL代码片段,以说明具体技术实现。在大数据项目管理中,需结合业务和技术,灵活运用这些方法,确保项目的成功执行和价值实现。
3474 1
|
Java 网络安全
zookeeper的环境搭建和配置
本文介绍了如何在多台节点上搭建和配置Zookeeper环境。内容包括Zookeeper的下载、解压、环境变量配置、配置文件修改、zkdata目录创建、myid文件设置,以及将Zookeeper及其配置文件复制到其他节点。还提供了运行测试的命令,包括启动、状态检查和停止Zookeeper服务。
zookeeper的环境搭建和配置
|
算法 网络架构
|
消息中间件 Kafka Docker
【docker专题_04】docker搭建kafka与zookeeper
【docker专题_04】docker搭建kafka与zookeeper
934 2
|
计算机视觉
CVPR 24:ETH Zurich等团队:重新定义小样本3D分割任务,新基准开启广阔提升潜力!
【7月更文挑战第1天】ETH Zurich团队提出了重新定义小样本3D点云分割任务,聚焦于前景泄漏和稀疏点分布问题。他们提出COSeg方法,利用类特定多原型相关性(CMC)和超相关性增强(HCA),以解决现有方法的局限。此外,通过基础原型校准(BPC)改善模型对基础类的敏感性。实验显示COSeg在性能上有显著提升,但其泛化能力和计算需求仍待优化,且遮挡和噪声等挑战仍有待解决。[论文链接](https://arxiv.org/abs/2403.00592)
380 13
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
209 0