找回密码
 加入
搜索
楼主: pusofalse

[效率算法] 练习003 - 顺序排列文本中的无序内容

 火... [复制链接]
发表于 2010-1-17 18:24:11 | 显示全部楼层
先回个帖子 看看大伙都怎么弄的
发表于 2010-1-17 18:26:42 | 显示全部楼层
本帖最后由 rolaka 于 2010-1-17 21:11 编辑
$begin = TimerInit()
;拆解文件
Local $file = StringRegExp(FileRead("a.txt"), "(?<=:)[^:]*", 3)
;排序
Local $out
For $n = 0 To UBound($file)-1
        For $i = UBound($file)-1 To 1 Step -1
                If $file[$i] < $file[$i - 1] Then
                        $temp = $file[$i]
                        $file[$i] = $file[$i - 1]
                        $file[$i - 1] = $temp
                EndIf
        Next
        $out &= ":" & $file[$n]
Next
MsgBox(0, "", TimerDiff($begin))
MsgBox(0, "", $out)
好像迟到了- -!


借用了afan的思想。。合成并入主循环

不过 一旦内容里出现: 也会断开...解决办法是 预先替换非行首: 最后合成的时候一口气转换...


修正了排序算法的问题....33楼眼尖-___-+
发表于 2010-1-17 20:36:53 | 显示全部楼层
回复 32# rolaka


    排序方法是错误的,不信你多添几个段落就知道了,譬如在中间加一个:aaa段落和:zzzz段落。。。
发表于 2010-1-17 21:03:22 | 显示全部楼层
本帖最后由 rolaka 于 2010-1-17 21:05 编辑
回复  rolaka


    排序方法是错误的,不信你多添几个段落就知道了,譬如在中间加一个:aaa段落和:zzzz ...
llztt 发表于 2010-1-17 20:36

是的...大文件测试的时候就发现了 冒泡里面内层反了...想连带不用正则版本一起更新- -
发表于 2010-1-17 21:19:38 | 显示全部楼层
本帖最后由 afan 于 2010-1-18 01:33 编辑
哈哈,一直等楼主的解,终于看到了,呵呵

不过可能我太钻牛角尖了,对条件的理解有些多了“4、段落与段落 ...
llztt 发表于 2010-1-17 17:31



    我觉得很有道理~~ 这样的话貌似必须使用一个匹配字符串的函数,StringRegExp、StringSplit之类的。
综合几点考虑:
1,段落内可能会有其它的空行,重排后要保留这些段落内的空行;
2,段落内可能会有其它的非行头的“:”字符;
3,txt文档字符串头部可能有空行、尾部可能没有回车符

重新修改了下~ 为了不使用UBound函数,只好使用StringSplit了,不算拓展类了,呵呵~
其他人的代码还没细看,有时间再学习,再修改 ~~||
Dim $ts = TimerInit(), $strNew, $i, $x, $atmp
Dim $str = FileRead('a.txt')
Dim $sS = StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
For $x = 2 To $sS[0]
        For $i = $sS[0] To 2 Step -1
                If $sS[$i] < $sS[$i - 1] Then
                        $atmp = $sS[$i]
                        $sS[$i] = $sS[$i - 1]
                        $sS[$i - 1] = $atmp
                EndIf
        Next
        $strNew &= ':' & $sS[$x] & @CRLF & @CRLF
Next
MsgBox(0, '完成耗时(s):' & TimerDiff($ts) / 1000, $strNew)
以上代码对付小文件还行,对于几千几万行的文件,实战操作的话我还是选择使用其它函数,比如_ArraySort,效率高很多倍,代码也简洁些
#include <Array.au3>
Dim $ts = TimerInit(), $strNew, $x
Dim $str = FileRead('a.txt')
Dim $sS = StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
_ArraySort($sS, 0, 2)
For $x = 2 To $sS[0]
        $strNew &= ':' & $sS[$x] & @CRLF & @CRLF
Next
MsgBox(0, '完成耗时(s):' & TimerDiff($ts) / 1000, $strNew)
发表于 2010-1-17 21:52:43 | 显示全部楼层
我觉得很有道理~~ 这样的话貌似必须使用一个匹配字符串的函数,StringRegExp、StringSplit之类的 ...
afan 发表于 2010-1-17 21:19

ubound可以用StringRegExpReplace执行成功后的@Extended代替...+ +
发表于 2010-1-17 22:04:29 | 显示全部楼层
本帖最后由 llztt 于 2010-1-17 22:06 编辑

回复 35# afan

StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这个处理办法很好啊,呵呵,简洁多了

排序方式是有问题的,你文件的段落中间多加几个段落,譬如用:A和:Z开头的,再看看结果

PS:UBOUND算是扩展类函数??AU3的函数是怎么分类的啊,我还真不太清楚,望赐教哈
发表于 2010-1-17 22:14:01 | 显示全部楼层
本帖最后由 rolaka 于 2010-1-17 22:17 编辑
$begin = TimerInit()
;读取文件
Local $file_ = FileRead("a.txt")
;拆解文件
Local $file = StringRegExp($file_, "(?<=:)[^:]*", 3)
;计算数组大小
StringRegExpReplace(@CRLF & $file_, "\n:", "")
;排序
Local $out
For $n = 0 To @Extended-1
        For $i = @Extended-1 To 1 Step -1
                If $file[$i] < $file[$i - 1] Then
                        $temp = $file[$i]
                        $file[$i] = $file[$i - 1]
                        $file[$i - 1] = $temp
                EndIf
        Next
        $out &= ":" & $file[$n]
Next
MsgBox(0, "", TimerDiff($begin))
MsgBox(0, "", $out)
再折腾一个- -+ UB都不用...在下去我只能StringRegExp把字符一个个文件用循环一个个来拼了- -

已经完全陷进偏门了 20kb的文件跑了4秒
发表于 2010-1-17 22:18:09 | 显示全部楼层
回复  afan

StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这 ...
llztt 发表于 2010-1-17 22:04



    UB不用。。。数组大小就没办法取了 应该可以不算把 split内不算的话
发表于 2010-1-17 22:37:32 | 显示全部楼层
回复 38# rolaka

请教正则里的(?<=:),是什么意思哈?
发表于 2010-1-17 22:43:07 | 显示全部楼层
本帖最后由 rolaka 于 2010-1-17 22:44 编辑
回复  rolaka

请教正则里的(?
llztt 发表于 2010-1-17 22:37

俄 零宽断言

...就是预先要满足这个exp 在他的之后再进行剩余的匹配 算是匹配的准备条件- -

好处就是 他不会被匹配到结果里
发表于 2010-1-17 22:55:19 | 显示全部楼层
我记的正则里没有<>号啊,圆括号里的?:  ?=  ?!都可以理解,但?<=确实没见过呢,呵呵
发表于 2010-1-17 22:58:08 | 显示全部楼层
http://deerchao.net/tutorials/regex/regex.htm
我看这个的时候发现的 满简单的... 也蛮好使
发表于 2010-1-18 01:07:36 | 显示全部楼层
回复  afan

StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这 ...
llztt 发表于 2010-1-17 22:04



    谢谢指正,没来得及细想,照 rolaka 的思路已修正~
发表于 2010-1-18 18:27:15 | 显示全部楼层
#3
呵呵,唯一没有想到的是“ArraySort”这个函数,其它倒试过!!!
呵呵,完全可以依“:a到:z”的顺序判断,属于完美之作----------哈哈
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:29 , Processed in 0.073883 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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