| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 824 人关注过本帖
标题:关于字符串数组比对问题
只看楼主 加入收藏
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:9 
关于字符串数组比对问题
有字符串数组A={"ABCD123", "DWCX55", "88DSS", "CLAN500"}
以及字符串集合B={{"POCL55", "DS88C"}, {"DII879"}, {"SDF88", "DS564", "DS655", "DS97F7"}, {"DWCX55", "ABCD123", "CLAN500", "88DSS"}}
显然忽略顺序后B中的最后一个字符串数组和A是相等的。
确认每项字符串数组中每个字符串都是唯一出现的,求伪代码或者思路可以比较好的解决这种问题。
(如果按照一个一个的比对,时间复杂度就是O(n^2)了)
搜索更多相关主题的帖子: 字符串 
2013-08-11 23:05
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
直接用处理字符串的函数    strcmp   

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-12 07:35
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
借鉴一下KMP算法

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-08-12 08:05
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
回复 3楼 pauljames
KMP算法感觉不能直接解决我的问题。
我想了一下,准备利用状态自动机的思想来解决这个问题。
扫描A产生一个状态转换图,然后我就有两种方案来解决这个问题。
一、将集合B中每一组字符串的每一项分别输入这个自动机,求取结果;
二、将A产生的状态转换图进行符号表示,同时对于集合B中的每一组字符串也进行转换处理,再利用memcmp进行比对可以直接得到结果。
现在有三个问题出现了:
一、这样是不是将问题变得更加麻烦?
二、虽然方案一实现更加简单,但是我个人偏好于方案二,怎么办?
三、(暂时还没想到,但是不说明的话估计会憋死一片人:))

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-08-12 15:42
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
其实没怎么看懂你的目标到底是干嘛,求直接说明
2013-08-12 16:21
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
回复 5楼 czz5242199
其实就是试图实现LR(1)表驱动语法分析器,然后有个问题是检查一个新生成的项集是否已经存在于核心项集中,我将项全部进行了字符串化。
看了一下多模式匹配,我还是准备实现方案二好了,因为如果存在多个A的话集合B中每一个项至少会被匹配一次,所以需要生成一个像是特征码一样的东西,这样可以更加快速的进行匹配。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-08-12 16:37
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:46 
可以用哈希表吗?

对B中的元素S都有着hash[S],而A每次要比较的时候,把A的hash值放入一个int数组中,这样就能先判断hash,如果hash满足再进行字符串比较,而hash比较的时间是相当之短的
2013-08-12 16:48
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
回复 7楼 czz5242199
扩展一下你的想法,然后结合我的思路,看看这个方案是否可行:
一、对字符串数组A,先求其每个字符串的ELFHash为long HashA[],然后对long HashA[]进行排序为long SortHashA[],然后求取SortHashA[]的Hash值为long SortHashA;
二、生成字符串数组A的FSA;
三、扫描字符串集合B,对每一项先比对该项的SortHashX(和SortHashA类似),如果相等则进入步骤四;
四、对该项当中所有字符串,全部输入由A生成的FSA中,如果全部匹配则成功。
-------------------------------------------------------------------------------------
其实我突然觉得,使用方案二就是另一种形式的Hash了,不过这个Hash有点长,用一种类似于正则表达式的形式来描述这个字符串数组。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-08-12 17:22
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
感觉排序的话挺麻烦的,不如直接用一个bool类型数组exist,求出A的hash值之后,把所有exist[HashA[]]=1

之后B就能直接判断了,由于你这个全部重复的几率不大,所以哈希表的大小不用太大,因为没问题
2013-08-12 17:37
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
回复 9楼 czz5242199
嗯,再散列是个好主意。那么Exist就取128好了。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-08-12 19:25
快速回复:关于字符串数组比对问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020542 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved