哈希表对字符串的高效处理2:在一个字符中删除第二个字符出现过的所有字符

来源:互联网 发布:mysql不等于查询 编辑:程序博客网 时间:2024/06/09 00:47

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

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

实例1://功能:在第一个字符中删除第二个字符出现过的所有字符
//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
//思路:1)如果采用先去遍历第一个字符,之后再去第二个字符中去查到到底存在不存在,这样复杂度为O(mn)所以,创建一个用数组实现的简单的哈希表来实现查找,查找最快的就是hash表

2)关于删除字符后面的字符要往前移,如果每删除一个就移一次,O(n^2)这复杂度实在太高,仅仅用快慢指针就可以搞定,这个方法非常有用,比如求解循环链表。利用快慢指针来删除字符,如果快指针指的是不需要的字符,将值赋给慢指针后,快慢指针同时++;如果快指针指向待删除字符,那么直接++;

参考程序如下:

//功能:在第一个字符中删除第二个字符出现过的所有字符//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.//思路:创建一个用数组实现的简单的哈希表,之后利用快慢指针来删除字符#include <iostream>//#include <stdio.h>#include <string>using namespace std;//删除出现字符串char DeletingChar(char *str1,char *str2){//输入不合法if(str1 == NULL || str2 == NULL)return 0;//创建一个哈希表,并且初始化const int tableSize = 256;unsigned int hashTable[tableSize];for(int i = 0;i < tableSize;i++)hashTable[i] = 0;//用哈希表储存第二个字符串char *pHashKey = str2;while(*pHashKey){hashTable[*pHashKey] = 1;pHashKey++;}char *slow = str1;char *fast = str1;while(*fast){if(hashTable[*fast] == 0){*slow = *fast;slow++;}fast++;}*slow = '\0';}void main(){char first[1000],second[1000];cout << "输入两个字符: ";//cin.getline(first);//cin.getline(second);//getline(cin,first);//getline(cin,second);gets(first);gets(second);DeletingChar(first, second);cout << first << endl;}

注意:c++采用cin输入字符串时,不可以直接利用cin来输入,可以结合getline,或者gets,这里需要注意的是在c中还必须得加上头文件#inlcude<stdio.h>,但是C++中没有必要。

实验结果:


                                                             ——To_捭阖_youth 23:19

0 0
原创粉丝点击