开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6125|回复: 11
打印 上一主题 下一主题
收起左侧

[已回应] 精易模块【文本_去重复文本】优化建议

[复制链接]
跳转到指定楼层
楼主
发表于 2020-12-29 16:36:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式   山东省滨州市
本帖最后由 禁回忆 于 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
数组_去重复(汇编分割)————使用【文本_逐字分割_汇编】命令分割,再使用【数组_去重复】
数组_去重复 ————使用文本_逐字分割】命令分割,再使用【数组_去重复】
文本_去重复文本————精易模块自身的命令

  1. 百万字测试

  2. * “随机文本生成完毕,生成启动时间 :1494421656”
  3. * “文本_去重复文本_汇编分割_优化 : 27000”
  4. * “文本_去重复文本_汇编分割 : 62782”
  5. * “文本_去重复文本 : 91968”
  6. * “数组_去重复 : 90297”
  7. * “数组_去重复(汇编分割) : 58891”
  8. * “随机文本生成完毕,生成启动时间 :1494753828”
  9. * “文本_去重复文本_汇编分割_优化 : 29531”
  10. * “文本_去重复文本_汇编分割 : 59344”
  11. * “文本_去重复文本 : 88000”
  12. * “数组_去重复 : 87843”
  13. * “数组_去重复(汇编分割) : 57657”
  14. * “随机文本生成完毕,生成启动时间 :1495077468”
  15. * “文本_去重复文本_汇编分割_优化 : 29750”
  16. * “文本_去重复文本_汇编分割 : 60984”
  17. * “文本_去重复文本 : 88516”
  18. * “数组_去重复 : 89406”
  19. * “数组_去重复(汇编分割) : 59344”
  20. * “随机文本生成完毕,生成启动时间 :1495407062”
  21. * “文本_去重复文本_汇编分割_优化 : 30625”
  22. * “文本_去重复文本_汇编分割 : 61438”
  23. * “文本_去重复文本 : 90516”
  24. * “数组_去重复 : 91656”
  25. * “数组_去重复(汇编分割) : 59797”


  26. 万字,十次

  27. ---------------------
  28. 随机文本生成完毕
  29. 文本_去重复文本_汇编分割_优化 : 94
  30. 文本_去重复文本_汇编分割 : 156
  31. 文本_去重复文本 : 94
  32. 数组_去重复 : 281
  33. 数组_去重复(汇编分割) : 266
  34. ---------------------
  35. ---------------------
  36. 随机文本生成完毕
  37. 文本_去重复文本_汇编分割_优化 : 62
  38. 文本_去重复文本_汇编分割 : 172
  39. 文本_去重复文本 : 235
  40. 数组_去重复 : 234
  41. 数组_去重复(汇编分割) : 172
  42. ---------------------
  43. ---------------------
  44. 随机文本生成完毕
  45. 文本_去重复文本_汇编分割_优化 : 63
  46. 文本_去重复文本_汇编分割 : 156
  47. 文本_去重复文本 : 234
  48. 数组_去重复 : 234
  49. 数组_去重复(汇编分割) : 156
  50. ---------------------
  51. ---------------------
  52. 随机文本生成完毕
  53. 文本_去重复文本_汇编分割_优化 : 63
  54. 文本_去重复文本_汇编分割 : 140
  55. 文本_去重复文本 : 235
  56. 数组_去重复 : 250
  57. 数组_去重复(汇编分割) : 156
  58. ---------------------
  59. ---------------------
  60. 随机文本生成完毕
  61. 文本_去重复文本_汇编分割_优化 : 63
  62. 文本_去重复文本_汇编分割 : 156
  63. 文本_去重复文本 : 234
  64. 数组_去重复 : 266
  65. 数组_去重复(汇编分割) : 141
  66. ---------------------
  67. ---------------------
  68. 随机文本生成完毕
  69. 文本_去重复文本_汇编分割_优化 : 62
  70. 文本_去重复文本_汇编分割 : 141
  71. 文本_去重复文本 : 218
  72. 数组_去重复 : 266
  73. 数组_去重复(汇编分割) : 156
  74. ---------------------
  75. ---------------------
  76. 随机文本生成完毕
  77. 文本_去重复文本_汇编分割_优化 : 62
  78. 文本_去重复文本_汇编分割 : 141
  79. 文本_去重复文本 : 234
  80. 数组_去重复 : 250
  81. 数组_去重复(汇编分割) : 156
  82. ---------------------
  83. ---------------------
  84. 随机文本生成完毕
  85. 文本_去重复文本_汇编分割_优化 : 47
  86. 文本_去重复文本_汇编分割 : 140
  87. 文本_去重复文本 : 219
  88. 数组_去重复 : 250
  89. 数组_去重复(汇编分割) : 141
  90. ---------------------
  91. ---------------------
  92. 随机文本生成完毕
  93. 文本_去重复文本_汇编分割_优化 : 62
  94. 文本_去重复文本_汇编分割 : 125
  95. 文本_去重复文本 : 234
  96. 数组_去重复 : 250
  97. 数组_去重复(汇编分割) : 172
  98. ---------------------
  99. ---------------------
  100. 随机文本生成完毕
  101. 文本_去重复文本_汇编分割_优化 : 78
  102. 文本_去重复文本_汇编分割 : 140
  103. 文本_去重复文本 : 219
  104. 数组_去重复 : 250
  105. 数组_去重复(汇编分割) : 172
  106. ---------------------



  107. 十万字


  108. ---------------------
  109. 随机文本生成完毕
  110. 文本_去重复文本_汇编分割_优化 : 2265
  111. 文本_去重复文本_汇编分割 : 4250
  112. 文本_去重复文本 : 5203
  113. 数组_去重复 : 5625
  114. 数组_去重复(汇编分割) : 3953
  115. ---------------------
  116. ---------------------
  117. 随机文本生成完毕
  118. 文本_去重复文本_汇编分割_优化 : 1843
  119. 文本_去重复文本_汇编分割 : 3875
  120. 文本_去重复文本 : 5125
  121. 数组_去重复 : 5594
  122. 数组_去重复(汇编分割) : 3969
  123. ---------------------
  124. ---------------------
  125. 随机文本生成完毕
  126. 文本_去重复文本_汇编分割_优化 : 1813
  127. 文本_去重复文本_汇编分割 : 3765
  128. 文本_去重复文本 : 5141
  129. 数组_去重复 : 5719
  130. 数组_去重复(汇编分割) : 4140
  131. ---------------------
  132. ---------------------
  133. 随机文本生成完毕
  134. 文本_去重复文本_汇编分割_优化 : 1829
  135. 文本_去重复文本_汇编分割 : 3750
  136. 文本_去重复文本 : 5078
  137. 数组_去重复 : 5422
  138. 数组_去重复(汇编分割) : 3938
  139. ---------------------
  140. ---------------------
  141. 随机文本生成完毕
  142. 文本_去重复文本_汇编分割_优化 : 1750
  143. 文本_去重复文本_汇编分割 : 3672
  144. 文本_去重复文本 : 5219
  145. 数组_去重复 : 5453
  146. 数组_去重复(汇编分割) : 3750
  147. ---------------------
  148. ---------------------
  149. 随机文本生成完毕
  150. 文本_去重复文本_汇编分割_优化 : 1828
  151. 文本_去重复文本_汇编分割 : 3750
  152. 文本_去重复文本 : 5250
  153. 数组_去重复 : 5484
  154. 数组_去重复(汇编分割) : 3875
  155. ---------------------
  156. ---------------------
  157. 随机文本生成完毕
  158. 文本_去重复文本_汇编分割_优化 : 1813
  159. 文本_去重复文本_汇编分割 : 3766
  160. 文本_去重复文本 : 5078
  161. 数组_去重复 : 5406
  162. 数组_去重复(汇编分割) : 3797
  163. ---------------------
  164. ---------------------
  165. 随机文本生成完毕
  166. 文本_去重复文本_汇编分割_优化 : 1828
  167. 文本_去重复文本_汇编分割 : 3750
  168. 文本_去重复文本 : 5016
  169. 数组_去重复 : 5328
  170. 数组_去重复(汇编分割) : 3797
  171. ---------------------
  172. ---------------------
  173. 随机文本生成完毕
  174. 文本_去重复文本_汇编分割_优化 : 1813
  175. 文本_去重复文本_汇编分割 : 3766
  176. 文本_去重复文本 : 5125
  177. 数组_去重复 : 5500
  178. 数组_去重复(汇编分割) : 3718
  179. ---------------------
  180. ---------------------
  181. 随机文本生成完毕
  182. 文本_去重复文本_汇编分割_优化 : 1829
  183. 文本_去重复文本_汇编分割 : 3828
  184. 文本_去重复文本 : 4984
  185. 数组_去重复 : 5469
  186. 数组_去重复(汇编分割) : 3750
  187. ---------------------
复制代码










评分

参与人数 1精币 +1 收起 理由
项目部004 + 1 没有必要的情况下不考虑用汇编!感谢支持!

查看全部评分

12
发表于 2021-2-4 16:16:07 | 只看该作者   上海市上海市
我看的一脸懵
回复 支持 反对

使用道具 举报

签到天数: 6 天

11
 楼主| 发表于 2020-12-30 12:08:16 | 只看该作者   山东省滨州市
禁回忆 发表于 2020-12-30 12:07
那就请先修改分割后的文本数组的遍历方式,模块中所用的【内部_数组成员是否存在_文本】子程序每次遍历都全 ...

@项目部004
回复 支持 反对

使用道具 举报

签到天数: 6 天

10
 楼主| 发表于 2020-12-30 12:07:01 | 只看该作者   山东省滨州市
那就请先修改分割后的文本数组的遍历方式,模块中所用的【内部_数组成员是否存在_文本】子程序每次遍历都全部遍历一遍,时间复杂度位O(n²)@项目部004
回复 支持 反对

使用道具 举报

结帖率:30% (6/20)

签到天数: 12 天

9
发表于 2020-12-29 18:44:46 | 只看该作者   江西省九江市
汇编的东西不能用太多 不然什么BUG 都照不出来

评分

参与人数 1精币 +1 收起 理由
项目部004 + 1 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:30% (6/20)

签到天数: 12 天

8
发表于 2020-12-29 18:39:59 | 只看该作者   江西省九江市
优化还不够啊 再优化下吧
回复 支持 反对

使用道具 举报

结帖率:100% (26/26)

签到天数: 3 天

7
发表于 2020-12-29 17:47:17 | 只看该作者   江苏省南通市
百万行文本用哈希表大概也就两三秒吧
回复 支持 反对

使用道具 举报

签到天数: 6 天

6
 楼主| 发表于 2020-12-29 17:04:01 | 只看该作者   山东省滨州市
wei615 发表于 2020-12-29 16:50
能解决问题就是好的咯

强迫症,没办法,实现同样的问题,我肯定追求效率高的,何况是这种一眼就能看出来效率问题的
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)
地下
发表于 2020-12-29 16:50:58 | 只看该作者   柬埔寨
禁回忆 发表于 2020-12-29 16:49
没啥,就是看到问答区那个帖子后,去看了一下精易论坛的【文本_去重复文本】命令,他写的效率太低了,他 ...

能解决问题就是好的咯
回复 支持 反对

使用道具 举报

签到天数: 6 天

地板
 楼主| 发表于 2020-12-29 16:49:24 | 只看该作者   山东省滨州市
wei615 发表于 2020-12-29 16:40
我看的一脸懵  哈哈哈 支持咯

没啥,就是看到问答区那个帖子后,去看了一下精易论坛的【文本_去重复文本】命令,他写的效率太低了,他自己都已经写了更高效的文本分割,结果没用,有可能是考虑到其他因素。但是这个遍历循环我实在是忍不了
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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