|

本帖最后由 禁回忆 于 2020-12-29 16:46 编辑
先说结论,今天我现写的这个文本去重,效率大约是现有的开源免费的最新版本的精易模块中【文本_去重复文本】的三倍左右。
在测试中,万字的速度提升尤为明显,稍微不到精易模块的四倍,十万字稍不到三倍,百万字三倍速度。
当然,这是随机字符的测试结果,再极特殊的情况下,现写的这个子程序理论上耗时也会比精易模块的【文本_去重复文本】少40%左右,具体是多少我这懒得算了。
这个优化主要优化在检测文本是否存在和分割文本上。类比冒泡排序和冒泡排序的优化版。
精易模块对分割后的文本与其他文本段都进行了对比,而已知当前文本段是重复的文本时是不需要再去对比的。
就现在来看,效率还能进一步提升。
优化后的代码先贴出来,具体测试结果请往后看
测试源代码:
使用模块【精易模块】
文本重复测试.e
(870.07 KB, 下载次数: 24)
优化版本
|
文本_去重复文本3 | 文本型 | | |
原文本 | 文本型 | | | | 分割符 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_数组 | 文本型 | | 0 | 局_计次 | 整数型 | | | 局_次数 | 整数型 | | | 局_临时数组 | 文本型 | | 0 | 局_计次1 | 整数型 | | | 局_次数1 | 整数型 | | | 局_文本 | 文本型 | | |
如果 (是否为空 (分割符 )) 文本_逐字分割_汇编 (原文本, 局_数组 ) 局_数组 = 分割文本 (原文本, 分割符, ) 局_次数 = 取数组成员数 (局_数组 ) 计次循环首 (局_次数, 局_计次 ) 局_次数1 = 取数组成员数 (局_临时数组 ) 计次循环首 (局_次数1, 局_计次1 )   如果真 (局_数组 [局_计次 ] = 局_临时数组 [局_计次1 ])  跳出循环 ()
  如果真 (局_计次1 = 局_次数1 )  加入成员 (局_临时数组, 局_数组 [局_计次 ])   局_文本 = 局_文本 + 局_数组 [局_计次 ] + 分割符     计次循环尾 () 计次循环尾 ()局_文本 = 取文本左边 (局_文本, 取文本长度 (局_文本 ) - 取文本长度 (分割符 )) 返回 (局_文本 )
![]()
缘由:
今天在问答区看到了一个帖子新手路过,取出不重复的数字!
可以在评论区看到,有说加入HASH表的,有说用精易模块的文本_去重复文本 (, )命令的。用户@wei615 提供的解决方法我看了一下(未经测试),效率并不高,而且浪费空间,强迫症。
HASH表是一个好选择,但是易语言操作HASH表过于麻烦(还是我大Java香)
想到精易模块已经是一个成熟的模块了,就去下载看了一下精易模块的相关源代码。
你已经是一个成熟的模块了.jpg
变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_数组 | 文本型 | | 0 | 局_数组1 | 文本型 | | 0 | 局_计次 | 整数型 | | | 局_文本 | 文本型 | | |
如果 (是否为空 (分割符 )) 文本_逐字分割 (原文本, 局_数组 ) 局_数组 = 分割文本 (原文本, 分割符, ) 计次循环首 (取数组成员数 (局_数组 ), 局_计次 ) 如果真 (内部_数组成员是否存在_文本 (局_数组1, 局_数组 [局_计次 ]) = -1 ) 加入成员 (局_数组1, 局_数组 [局_计次 ])  局_文本 = 局_文本 + 局_数组 [局_计次 ] + 分割符   计次循环尾 ()局_文本 = 取文本左边 (局_文本, 取文本长度 (局_文本 ) - 取文本长度 (分割符 )) 返回 (局_文本 )
这是精易模块的【文本_去重复文本】子程序,可以很清楚的看到使用了【内部_数组成员是否存在_文本】,我对其性能有一点点担心。
并且在模块中发现了【文本_逐字分割】和【文本_逐字分割_汇编】,这担心的心情逐渐加重。
![]()
测试:
我对几个子程序的组合进行了搭配,并和我自己现写的文本去重进行了对比。
|
文本_去重复文本2 | 文本型 | | |
原文本 | 文本型 | | | | 分割符 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_数组 | 文本型 | | 0 | 局_数组1 | 文本型 | | 0 | 局_计次 | 整数型 | | | 局_文本 | 文本型 | | |
如果 (是否为空 (分割符 )) 文本_逐字分割_汇编 (原文本, 局_数组 ) 局_数组 = 分割文本 (原文本, 分割符, ) 计次循环首 (取数组成员数 (局_数组 ), 局_计次 ) 如果真 (内部_数组成员是否存在_文本 (局_数组1, 局_数组 [局_计次 ]) = -1 )加入成员 (局_数组1, 局_数组 [局_计次 ])局_文本 = 局_文本 + 局_数组 [局_计次 ] + 分割符   计次循环尾 ()局_文本 = 取文本左边 (局_文本, 取文本长度 (局_文本 ) - 取文本长度 (分割符 )) 返回 (局_文本 )|
文本_去重复文本3 | 文本型 | | |
原文本 | 文本型 | | | | 分割符 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_数组 | 文本型 | | 0 | 局_计次 | 整数型 | | | 局_次数 | 整数型 | | | 局_临时数组 | 文本型 | | 0 | 局_计次1 | 整数型 | | | 局_次数1 | 整数型 | | | 局_文本 | 文本型 | | |
如果 (是否为空 (分割符 )) 文本_逐字分割_汇编 (原文本, 局_数组 ) 局_数组 = 分割文本 (原文本, 分割符, ) 局_次数 = 取数组成员数 (局_数组 ) 计次循环首 (局_次数, 局_计次 )局_次数1 = 取数组成员数 (局_临时数组 ) 计次循环首 (局_次数1, 局_计次1 ) 如果真 (局_数组 [局_计次 ] = 局_临时数组 [局_计次1 ])跳出循环 ()
如果真 (局_计次1 = 局_次数1 )加入成员 (局_临时数组, 局_数组 [局_计次 ])局_文本 = 局_文本 + 局_数组 [局_计次 ] + 分割符    计次循环尾 () 计次循环尾 ()局_文本 = 取文本左边 (局_文本, 取文本长度 (局_文本 ) - 取文本长度 (分割符 )) 返回 (局_文本 )
其上,2是根据精易模块进行优化的版本,3是现场写的版本。
测试结果如下:文本_去重复文本_汇编分割_优化————文本_去重复文本3
文本_去重复文本_汇编分割————文本_去重复文本2
数组_去重复(汇编分割)————使用【文本_逐字分割_汇编】命令分割,再使用【数组_去重复】
数组_去重复 ————使用【文本_逐字分割】命令分割,再使用【数组_去重复】
文本_去重复文本————精易模块自身的命令
|
评分
-
查看全部评分
|