明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 11

准备写个图形简繁转换的程序,大家说说怎样提高运行速度

  [复制链接]
发表于 2005-9-11 21:27:00 | 显示全部楼层 |阅读模式
最基本的方法就是一个字符一个字符的替换。而且需要在对照表顺查找字符。而做了统计,需要对照的汉字大约有2.2万个。如果说每个汉字都要在对照表中一个一个字的查找,速度显然是慢了。就着“齄”字,它是对照表中的最后一个字,如果需要替换字符串都是这个字,则每次都需要查2.2万次才能找到这个字。如果有100个这样的字,呵呵,那真的有些慢,虽然我没有试运行过。程序如下:
[注意其中ChsStr为整个简体对照表,ChtStr为繁体对照表,简体和繁体的位置是一一对应的。]
  1. Function Cht2Chs(Str As String) As String
  2.     Dim i As Long
  3.     Dim j  As Long
  4.     Dim tmpStr As String
  5.     Dim s  As String
  6.     For i = 1 To Len(Str)
  7.         s = Mid(Str, i, 1)
  8.         For j = 1 To Len(ChsStr)
  9.             If s = Mid(ChsStr, j, 1) Then
  10.                 s = Mid(ChtStr, j, 1)
  11.                 Exit For
  12.             End If
  13.         Next
  14.         tmpStr = tmpStr & s
  15.     Next
  16.     Cht2Chs = tmpStr
  17. End Function
我已经找到一个比较快的方法,而且也写出来了。但希望大家一起来想,所以这种方法暂时不公布。
这个程序完成后,我会把主要代码公布出来。
发表于 2005-9-12 11:33:00 | 显示全部楼层

用数据库试试:)

发表于 2005-9-12 12:54:00 | 显示全部楼层

直接换字库文件行吗?

你不是说:“注意其中ChsStr为整个简体对照表,ChtStr为繁体对照表,简体和繁体的位置是一一对应的。”

 

 

发表于 2005-9-12 18:34:00 | 显示全部楼层

想不到不一个个去找还有什么简便方法,看看老大的方法。

简繁字转换我用不着,不过想做一个选择所有文件完成这些文件内文字替换的程序,看看有什么可以参考的。

 楼主| 发表于 2005-9-12 19:33:00 | 显示全部楼层

我还是不卖关子了。
我的方法非常简单,不需要在对照表中一个字一个字的查找对应的字。速度可提高上万倍。也不用数据库。
我是通过数组来解决。把简体字的ASCII码做为数组的下标,繁体字的ASCII码做为数组指定下标的值。
首先在程序运行时做一些填充数组的工作,然后就直接在程序中使用。
在替换字时直接取得字的ASCII码,通过该下标就可以直接读到对应的数组值。一转换出来就是繁体字了。

是不是非常简单和快。

还有没有更快的方法。

 楼主| 发表于 2005-9-12 21:40:00 | 显示全部楼层
主要代码:
  1. Function ChtToChs(Str As String) As String
  2.     Dim i As Long
  3.     Dim tmpStr As String
  4.     Dim s  As String
  5.     Dim StrList As Variant
  6.     StrList = GetStrList
  7.     For i = 1 To Len(Str)
  8.         s = Mid(Str, i, 1)
  9.         If Asc(s) <= -2050 Then
  10.             s = Chr(StrList(Asc(s) + 24159))
  11.         End If
  12.         tmpStr = tmpStr & s
  13.     Next
  14.     ChtToChs = tmpStr
  15. End Function
  16. Function GetStrList() As Variant
  17.     Dim StrList(22109) As Long
  18.     Dim i As Long
  19.     Dim ChsStr As String
  20.     Dim ChtStr As String
  21.     ChsStr = GetChsStr
  22.     ChtStr = GetChtStr
  23.     For i = 1 To Len(ChsStr)
  24.         StrList(Asc(Mid(ChsStr, i, 1)) + 24159) = Asc(Mid(ChtStr, i, 1))
  25.     Next
  26.     GetStrList = StrList
  27. End Function
 楼主| 发表于 2005-9-13 21:17:00 | 显示全部楼层
应该还有一种方法,也是很快的。
 楼主| 发表于 2005-9-16 06:48:00 | 显示全部楼层
  1. Sub Main()
  2.     Dim Str As String
  3.     Dim tmpStr As String
  4.     Dim tt As Single
  5.    
  6.     Str = GetStr(True)
  7.     tt = Timer()
  8.     tmpStr = ChsToCht0(Str)
  9.     Debug.Print "使用逐个查找法的时间:" & Format(Timer() - tt, "0.00000") & "秒"
  10.     tt = Timer()
  11.     tmpStr = ChsToCht1(Str)
  12.     Debug.Print "使用列表法的时间:" & Format(Timer() - tt, "0.00000") & "秒"
  13.    
  14.     tt = Timer()
  15.     tmpStr = ChsToCht2(Str)
  16.     Debug.Print "使用位置法的时间:" & Format(Timer() - tt, "0.00000") & "秒"
  17.    
  18. End Sub
  1. Function ChsToCht1(Str As String) As String
  2.     Dim i As Long
  3.     Dim tmpStr As String
  4.     Dim s  As String
  5.     Dim StrList As Variant
  6.     StrList = GetStrList
  7.     For i = 1 To Len(Str)
  8.         s = Mid(Str, i, 1)
  9.         If Asc(s) <= -2050 Then
  10.             s = Chr(StrList(Asc(s) + 24159))
  11.         End If
  12.         tmpStr = tmpStr & s
  13.     Next
  14.     ChsToCht1 = tmpStr
  15. End Function
  16. Function ChsToCht2(Str As String) As String
  17.     Dim ChsStr As String
  18.     Dim ChtStr As String
  19.     ChsStr = GetStr(True)
  20.     ChtStr = GetStr(False)
  21.     Dim i As Long
  22.     Dim tmpStr As String
  23.     Dim s  As String
  24.     Dim leftStr As String
  25.     For i = 1 To Len(Str)
  26.         s = Mid(Str, i, 1)
  27.         If Asc(s) <= -2050 Then
  28.         s = Mid(ChtStr, InStrRev(ChsStr, s), 1)
  29.         End If
  30.         tmpStr = tmpStr & s
  31.     Next
  32.     ChsToCht2 = tmpStr
  33. End Function
  34. Function ChsToCht0(Str As String) As String
  35.     Dim ChsStr As String
  36.     Dim ChtStr As String
  37.     ChsStr = GetStr(True)
  38.     ChtStr = GetStr(False)
  39.     Dim i As Long
  40.     Dim j  As Long
  41.     Dim tmpStr As String
  42.     Dim s  As String
  43.     For i = 1 To Len(Str)
  44.         s = Mid(Str, i, 1)
  45.         For j = 1 To Len(ChsStr)
  46.             If s = Mid(ChsStr, j, 1) Then
  47.                 s = Mid(ChtStr, j, 1)
  48.                 Exit For
  49.             End If
  50.         Next
  51.         tmpStr = tmpStr & s
  52.     Next
  53.     ChsToCht0 = tmpStr
  54. End Function
  55. Function GetStrList() As Variant
  56.     Dim StrList(22109) As Long
  57.     Dim i As Long
  58.     Dim ChsStr As String
  59.     Dim ChtStr As String
  60.     ChsStr = GetStr(True)
  61.     ChtStr = GetStr(False)
  62.     For i = 1 To Len(ChsStr)
  63.         StrList(Asc(Mid(ChsStr, i, 1)) + 24159) = Asc(Mid(ChtStr, i, 1))
  64.     Next
  65.     GetStrList = StrList
  66. End Function
  67. Function GetStr(isChs As Boolean) As String
  68.     Dim strFile As String
  69.     Dim strPath As String
  70.     Dim strText As String
  71.     strFile = VBE.ActiveVBProject.FileName
  72.     strPath = Left(strFile, InStrRev(strFile, ""))
  73.     If isChs Then
  74.         strFile = "chsstr.dat"
  75.     Else
  76.         strFile = "chtstr.dat"
  77.     End If
  78.         Open strPath & strFile For Input As #1
  79.     Do Until EOF(1)
  80.         Line Input #1, strText
  81.         GetStr = GetStr & strText
  82.     Loop
  83.     Close #1
  84. End Function
运行后的速度比较:
  1. 使用逐个查找法的时间:12.89063秒
  2. 使用列表法的时间:0.02930秒
  3. 使用位置法的时间:0.97070秒
复制代码
可以看到,我把整个简体表做为需要转换的字符串,整个运行速度中,列表法是最快的,而位置法则还不错。但查找法则不可行。

另外,查找法还可以进行优化,优化的条件是对照表中原始表(即简体表)字符按ASCII码排序,这样则可以通过筛选来一半一半筛选。如20个字,取第10个字,看ASC码与要比较字符的大小而决定是取前面一半的字符还是后面一半的字符继续进行比较。
发表于 2005-9-16 09:31:00 | 显示全部楼层

能看看你的文件吗?

chsstr.dat
chtstr.dat

发表于 2005-9-19 09:24:00 | 显示全部楼层

其实能不能体速关键看你程序的核心。

s = Chr(StrList(Asc(s) + 24159))


已经使速度发挥到极限了。

除非取数组中数值的速度影响程序的运行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 10:44 , Processed in 0.186161 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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