快速找出在字符串A中而不在字符串B中的字符

来源:互联网 发布:网络角色游戏排行榜 编辑:程序博客网 时间:2024/04/24 06:12


               问题是这样的,假设连个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A = A U B.这就要求对线性表作如下的操作;扩大线性表La,将存在于线性表Lb中而不存在于La中的数据元素插入到线性表La中去。只要从线性表Lb中依次取得每个数据元素,并依值在线性表La中进行查防,如不存在,则插入之。

                 

                         方法一:

                            

void union(List &La , List &Lb){            //将所有在线性表Lb中但不在La中的数据元素插入到La中   La_len = ListLength(La); Lb_len = ListLength(Lb);   for (i = 1; i <= Lb_len; i++)   {         GetElem(Lb, i ,e);   //Lb中第i个数据赋给e         if (!LocateElem(La, e, equal))              ListInsert(La, ++La_len,e); //La中不存在和e相同的数据元素,则插入之    }}
LocateElem()通过遍历线性表来匹配e,则所花费的时间为O(ListLength(La))。而遍历线性表Lb所花费的的时间为O(ListLength(Lb)).故,此算法的时间复杂度为:

 O(ListLength(La) x ListLength(Lb)). 平均时间复杂度为:O(n ^2).由此我们可以看出这种方法的效率不是很高!!

          

                 方法二:

                          通过哈希表将线性表La中的字符记录在一个标志数组flag_tab中,然后,用同样的哈希函数,求出Lb中key所对应的value值,如果此value在也在flag_tab中找到,说明此字符也在La中,否则就不在La中。具体代码如下:


/* * ===================================================================================== * *       Filename:  stringfind.c * *     Description:  字符串查找,找出在字符串A中而不在字符串B中的字符 * *       Version:  1.0 *       Created:  2014年07月22日 15时59分58秒 *       Revision:  none *       Compiler:  gcc *     CopyRight: open , free , share *       Author:  yexingkong(zhangbaoqing) *     Email: abqyexingkong@gmail.com *       Company:  Xi'an University of post and Telecommunications * * ===================================================================================== */#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXTABSIZE100/*字符串的最大长度 *//* -------------------------------------------------------------------*//**  * @Synopsis=   找出在string_tab_b中而不在string_tab_a中的字符 (字符可为ascii 33 ~ 126的字符) *  * @Param= string_table_a   要查寻的字符串表a * @Param= string_table_b   要查寻的字符串表b *  * @Returns=返回0,成功, 否则失败  *//* ----------------------------------------------------------------------------*/int findDiffCharWithHash(char *string_table_a, char *string_table_b){int string_len_a = 0, string_len_b = 0;int i = 0 ;char *flag_tab = NULL;        //指向string_tab_a字符存在标志数组int hash_key = 0;string_len_a = strlen(string_table_a);          //字符数组a的长度string_len_b = strlen(string_table_b);          //字符数组b的长度flag_tab = (char *)malloc(MAXTABSIZE*sizeof(char));           //标志数组memset(flag_tab,'n',MAXTABSIZE*sizeof(char));          //数组赋值为‘n’for (i = 0 ; i < string_len_a; i++){hash_key = string_table_a[i] - 33;//哈希直接定址法if ('n' == flag_tab[hash_key]){  flag_tab[hash_key] = 'y';          }}printf("\n");printf("The characters in the \"%s\" ,but not in the \"%s\"  are:  \n",string_table_b,string_table_a );for (i = 0 ; i < string_len_b; i++){hash_key = string_table_b[i] - 33;if ('n' == flag_tab[hash_key])   //如果字符string_table_b[i]不在string_table_a中,则打印出来{printf("%c ",string_table_b[i]);}}printf("\n");free(flag_tab);return 0;}int main(int argc, char *argv[]){char string_tab_a[MAXTABSIZE], string_tab_b[MAXTABSIZE];printf("Please input the first string\n");scanf("%s",string_tab_a);printf("Please input the second string\n");scanf("%s",string_tab_b);findDiffCharWithHash(string_tab_a,string_tab_b);return EXIT_SUCCESS;}

 可以看出,此算法所花费的时间就在findDiffCharWithHash( )函数中的两个for循环里,故此算法的时间复杂度就为:

  O(string_len_a + string_len_b).平均时间复杂度 为O(n)。所以方法二的效率比方法一更高点!!


0 0
原创粉丝点击