找回密码
 加入
搜索
楼主: 骗子

[效率算法] 文本对比的效率算法【已解决】

 火.. [复制链接]
 楼主| 发表于 2012-12-10 16:53:09 | 显示全部楼层
WIN7 3.3.9.4正常
发表于 2012-12-10 17:01:31 | 显示全部楼层
回复 15# annybaby


    没试过数据量巨大的情况,如此的话可能需要分段处理…
发表于 2012-12-10 17:02:25 | 显示全部楼层
回复 16# 骗子

嗯,是的,代码没有问题,是我的文本查看器的小问题~~

assign和IsDeclared用于去重还是很好用的,方便,高效,代码简单,可惜就是堆栈的大小不知道怎么改,如果你的不重复数据超过30万(也就是需要声明的变量个数超30万)就会造成堆栈溢出错误,可能还与具体的系统有一点关系,我的机子超过288288就铁定会出错~~
发表于 2012-12-10 17:04:45 | 显示全部楼层
谢谢 ,一直没弄明白Assign到底是怎么用,刚才东拼西凑出来下面的内容,但是结果确实错误的,重复文件里的 ...
骗子 发表于 2012-12-10 16:07



    Assign声明需要赋值的变量名. 不能是数组元素.需要预处理“[”
另外不要直接FileWrite文件,因为你的“B.txt”是UTF8格式。
发表于 2012-12-10 17:12:52 | 显示全部楼层
回复 19# afan

哈哈,A大,不知道你自己有没有试过
其实,虽然文档里说assign赋值的变量名不能是一个数组元素,但你试一下,其实是可以的哦!~
发表于 2012-12-10 17:16:20 | 显示全部楼层
回复 20# annybaby


    以前就试过了,不行的。 具体说“变量名不能是一个数组元素”其实是指不能包含含有“[]”的字符串。
不信你可以自己试试。

评分

参与人数 2金钱 +30 收起 理由
骗子 + 20 这也就是要替换[的原因吧?
annybaby + 10 学习了~~~

查看全部评分

发表于 2012-12-10 17:31:31 | 显示全部楼层
回复 21# afan

原来是指这个,我的意思是:
这个帖子里,3mile前辈那个赋值给$temp变量的操作其实是没有必要的~~
发表于 2012-12-10 18:32:42 | 显示全部楼层
本帖最后由 annybaby 于 2012-12-10 18:57 编辑

回复 8# afan






+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
重新编辑此帖,以免后来看到的朋友会被误导,说明下:
虽然这样的确可以提高效率,但可靠性被降低,除非你确定脚本中其它的变量定义不会影响到你的最终结果并且非常强调效率,否则不建议这样做,原因楼下A大已经有说明了~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-12-10 18:41:50 | 显示全部楼层
回复 23# annybaby


    呵呵,这个主要是预防和你的脚本里的变量同名。比如如果你是这样的申明
Local $abc = xxx

而 B.txt 中刚好有 “abc”这一行,那么恭喜你,就算 “A.txt”中没有这一行,它仍将被载入“A中已包含.txt”……

加“~”是因为常规的 $~abc 是错误的,而这正好起了规避的作用。

评分

参与人数 1金钱 +30 收起 理由
annybaby + 30 学习了,很高明的想法~~

查看全部评分

发表于 2012-12-10 18:51:22 | 显示全部楼层
回复 24# afan

高!!!
怪不得以前看P版的代码会看到加了这个东东~~一直想不明白为什么要加个多余反而会降低效率的前缀

双学到一招!!
 楼主| 发表于 2012-12-11 10:02:00 | 显示全部楼层
回复 24# afan
学习了,谢谢
发表于 2012-12-11 12:18:21 | 显示全部楼层
回复 19# afan
请问A大,怎么知道B.txt是UTF-8的格式?
发表于 2012-12-11 12:29:04 | 显示全部楼层
回复 27# xms77


    一般有 BOM 标记的用 FileGetEncoding() 就知道了,128 = UTF-8
发表于 2012-12-15 16:42:42 | 显示全部楼层
Au3 1秒完成
afan 发表于 2012-12-10 15:20

收藏一下!!!
发表于 2012-12-16 22:36:17 | 显示全部楼层
贴一个时间复杂度高一点点的,但不到2m


#include <Array.au3>
#include <File.au3>

Global $arrayA, $arrayB
Global $dic = ObjCreate("Scripting.Dictionary")
Global $strAinc = "", $strADiff = ""
$foutInc = FileOpen("AI.txt", 2)
$foutDiff = FileOpen("C.txt", 2)

$stime = TimerInit()
_FileReadToArray("A.txt", $arrayA)
_FileReadToArray("B.txt", $arrayB)

For $index = 1 To $arrayA[0]
    $dic.Add($arrayA[$index], 1)
Next

For $index = 1 To $arrayB[0]
    If($dic.Exists($arrayB[$index]))then
        $strAinc &= $arrayB[$index]&@CRLF
    Else
        $strADiff &= $arrayB[$index]&@CRLF
    EndIf
Next

FileWrite($foutInc, $strAinc)
FileWrite($foutDiff, $strADiff)
FileClose($foutInc)
FileClose($foutDiff)

$etime = TimerDiff($stime)
MsgBox(64, "耗时", $etime)

评分

参与人数 1金钱 +20 收起 理由
骗子 + 20 学习了,谢谢

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 17:20 , Processed in 0.073706 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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