按拼音搜索人名

pathuang68 2011-08-17 07:20:20
今天被人问了一个问题,试了很久也没有找到好的解决办法。恳请各位坛友帮忙。

问题是这样的:
1. 假定在数据库中有一个数据表,该表有两个字段:ch_name和py_name。

2. ch_name用于存放中文姓名,py_name用于存放对应中文姓名的拼音,且用“,”分隔,情形如下:
ch_name py_name
关云长 guan,yun,chang

3. 现在要用输入的拼音字母,搜索,比如:
“gyc”、“gy”、“yc”、“guyuc”、“guayuch”都可以搜索到“关云长”,而
“gc”、“uyc”这样的组合不能搜索到“关云长”

举例说明:
意思就是搜索时,是按顺序从每个汉字的拼音开始的,比如“guayuch”中的“gua”和“关”的拼音的前3个字母是匹配的,“yu”和“yun”的前2个字母是匹配的,“ch”和“长”的拼音的前2个字母是匹配的,因此符合搜索条件。

“gc”中的“g”和“关”的第一个字母匹配,但是“gc”不和“关”的拼音的前2个字母匹配,且按顺序“c”不和“关云长”中的第二个汉字的拼音的第一个字母匹配,因此不符合搜索条件。

我在试图解决这个问题的时候,本来打算直接用sql中的like来解决(like的效率是不高的,但该表的数据量不太,所以认为性能是可以接受的),比如,py_name like '%g%y%c%',但是这样会存在一些不足,比如“uyc”也可以查出“关云长”,而这是不能接受的。也想到了使用,要俺顺序从每个汉字的拼音的第一个字母开始匹配,却发现有太多的组合了,比如“gyc”就至少有8中组合,在sql语句中要把这8个条件or起来,再进行查询...这还不是最糟糕的情况,如果用户输入“guayuch”,那组合就太多了,就算数据表中的数据不算多,这样搞起来,我还是非常担心性能方面的问题...于是就放弃了这方面的试探

问题:
1. 请用C或者C++,解决3中所列出的问题。可以不考虑数据库方面的操作。即用“gyc”、“gy”、“yc”、“guyuc”、“guayuch”均可以搜索到“guan,yun,chang”,而“gc”、“uyc”则不可以。

或者
2. 用sql解决上面的问题。

以上两种方式,任何一种均可。当然还要考虑“爱新觉罗努尔哈赤”这样的名字。

TIA
...全文
1177 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
飒枫 2011-11-08
  • 打赏
  • 举报
回复
小弟也遇到这个问题,楼主能不能共享下。。。
skyaspnet 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 pathuang68 的回复:]

搞定了,结贴。
[/Quote]

建议分享一下解决过程
kobesff 2011-08-21
  • 打赏
  • 举报
回复
同意楼上。
叶子 2011-08-18
  • 打赏
  • 举报
回复
这个功能建议还是不要在数据库里弄的好,如果是根据汉字得到全拼,我倒是可以贡献一个函数。

http://blog.csdn.net/maco_wang/article/details/6290128



--把 set @pinyin = ISNULL(@pinyin +SPACE(1),'')+
--改成 set @pinyin = ISNULL(@pinyin +',','')+
declare @t table (namecol varchar(6))
insert into @t
select '关云长' union all
select '张飞' union all
select '刘备' union all
select '曹操' union all
select '诸葛亮'

select namecol as col1,dbo.fn_GetPinyin(namecol) as col2 from @t
/*
col1 col2
------ -----------------------
关云长 guan,yun,chang
张飞 zhang,fei
刘备 liu,bei
曹操 cao,cao
诸葛亮 zhu,ge,liang
*/


jernymy 2011-08-18
  • 打赏
  • 举报
回复
俺来顶顶帖
pathuang68 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 ouyh12345 的回复:]

我比较倾向于加载到内存后再做
[/Quote]

++
俺现在也是这么想的。
pathuang68 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 todd_liu 的回复:]

生成拼音存储过程(这个google都有);生成拼音那列;有了数据查询还不好办嘛?
[/Quote]

我上面的问题都已经假定对饮的拼音已经存在了,所以不用考虑生成拼音那列啦,你就假当拼音那列已经存在好了。

问题是有了数据,查询还真的不好办呢。上面的maco_wang一看就是对数据库很有经验的人,俺本人也算是对数据库比较了解,所以一开始我也想用数据库的办法来解决这个问题,但是在试图解决的过程发现性能很糟糕...maco_wang和俺也有类似的结论。不是说用数据库的办法解决不了这个问题,而是担心用数据库的方法性能方面的不足。

基于这方面的考虑,所以就到C/C++坛子里来求助了。

昨晚睡觉的时候思考了一下这个问题,感觉用最原始的比较方式,效率可能是最高的。用树、哈希之类的方法反而不行,事实上数据库的查找用的就是这一类的方法。

下午准备自己动手帮公司的小弟写一个,他要的本来是Java代码,发这个帖子的意思是希望C/C++的坛友用C或者C++帮写一个算法,俺再给他翻译成Java滴...关键是要算法...语言实现都不是问题。
2011-08-18
  • 打赏
  • 举报
回复
不懂数据库,路过……

随便乱想一下,是不是可以用类似字典树的方法构造一个巨大的状态机?
pathuang68 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zhao4zhong1 的回复:]

http://zhao4zhong1.download.csdn.net/user/zhao4zhong1/拼音汉字对照表
[/Quote]

大侠,俺小弟要的不是这个。他现在可以动态地获得汉字的拼音(包括一个汉字的多种发音,还包括声调),没有采用对照表的方法。
天蛾糊 2011-08-18
  • 打赏
  • 举报
回复
路过学习
xxmv99 2011-08-18
  • 打赏
  • 举报
回复
分数好高啊。
ouyh12345 2011-08-18
  • 打赏
  • 举报
回复
我比较倾向于加载到内存后再做
shi3590 2011-08-18
  • 打赏
  • 举报
回复
链式字典查找树,或者构建哈希表,与sql相结合,应该可以找到一个相对效率的方法。
具体要根据数据量来确定偏重哪面。
pathuang68 2011-08-18
  • 打赏
  • 举报
回复
搞定了,结贴。
果-果 2011-08-18
  • 打赏
  • 举报
回复
关注一下,顶贴顺便学习
todd_liu 2011-08-18
  • 打赏
  • 举报
回复
生成拼音存储过程(这个google都有);生成拼音那列;有了数据查询还不好办嘛?
快溜 2011-08-18
  • 打赏
  • 举报
回复
数据库计算确实不快,搜索是快。
白云飘飘飘 2011-08-17
  • 打赏
  • 举报
回复
这个问题应该是搞拼音输入法的人很清楚的,重要的是对用户输入的拼音进行合理拆分,在数据库的查找就简单一些了.以前搞过全拼的拆分,要用到图算法.你这个应算做全拼加简拼音,道理是一样的.
pathuang68 2011-08-17
  • 打赏
  • 举报
回复
谢谢各位捧场的朋友。

特别感谢叶子。和叶子的感觉一样,用数据库处理这个问题,总觉得性能不够好。
Jacky和Lucifer也别袖手傍观呀。不用数据库的方法做也可以滴。关键是方法要紧。
加载更多回复(16)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧