找回密码
 加入
搜索
查看: 5877|回复: 6

[效率算法] 拼音首字母

  [复制链接]
发表于 2011-4-26 15:43:02 | 显示全部楼层 |阅读模式
目的:获得汉字拼音的首字母

本来论坛已经有相关的解决办法,公认比较完美的是文白兄的方案。但我只需要首字母,用来过滤词条,同时要求效率尽量高。
下面是一种办法
Global Const $key[27]=['吖','八','擦','耷','俄','发','噶','哈','丌','丌','卡','拉','马','拿','哦','趴','七','然','撒','他','挖','挖','挖','西','丫','匝','匝']
Global $str='autoit中文论坛autoit中文论坛autoit中文论坛autoit中文论坛autoit中文论坛autoit中文论坛autoit中文论坛',$L
For $i = 1 To StringLen($str)
        Switch Dec(StringTrimLeft(StringToBinary(StringMid($str,$i,1)),2))
                Case 32 To 127
                        $L&=StringMid($str,$i,1)
                Case 33095 To 62289
                        $L&=Chr(97+_C(StringMid($str,$i,1),0,26))
        EndSwitch
Next
MsgBox(0,'',$L)
Func _C($s,$f,$e)                                ;改进的中值法
                Local $mid=Int(($e-$f)/2)+$f
                If $mid=$f Then Return $f
            If StringCompare($s,$key[$mid])=0 Then
                    Return $mid
            ElseIf StringCompare($s,$key[$mid])>0 Then
                    Return _C($s,$mid,$e)
            ElseIf StringCompare($s,$key[$mid])<0 Then
                    Return _C($s,$f,$mid)
                EndIf
EndFunc

还可以更快么?
发表于 2011-4-26 16:37:50 | 显示全部楼层
功能看出来了
不知道为什么会实现这个功能的
$key[27]是做什么用的
 楼主| 发表于 2011-4-26 16:44:31 | 显示全部楼层
回复 2# love5173

貌似是利用LCID。$key[27]是一些标记,用来分割不同拼音首字母的区段
发表于 2011-4-26 16:52:03 | 显示全部楼层
我在想如果要返回的是整个汉字的拼音,我要怎么做
对半法用的挺好的,特别是递归。
提个小意见,因为过分要求精练,导致代码压缩太厉害,不利于像我们这样的新手分析代码
 楼主| 发表于 2011-4-26 17:04:45 | 显示全部楼层
回复 4# love5173


    你还新手,晕晕
获得整个拼音就用文白的UDF,一楼有超链接,只是搞不懂LCID默认是怎么个排序法,因为我找到好几个版本的标签文字还有,这个排序是基于数据库的吗?
发表于 2011-4-26 22:37:48 | 显示全部楼层
代码很精彩,学习了
发表于 2020-10-3 02:44:38 | 显示全部楼层
赞叹不已,文白兄的是用字典的方式,做起来很是花了一番功夫。但是你这个思路就很清奇了,我赞叹的不是中值法,而是你直接用汉字代表成A-Z,然后想到用stringcompare去比较两个汉字,然后再根据位置加上ASC码直接变成对应字母,虽然功能单一,但是确实是精彩的代码,谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 13:48 , Processed in 0.078930 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表