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

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

 火... [复制链接]
发表于 2010-1-18 18:34:37 | 显示全部楼层
array.au3的ArraySort是支持两维的,不知道会否影响效率,所以我用了提取后的单维算法,不过还真没测试过实际差别
发表于 2010-1-19 11:42:28 | 显示全部楼层
能力问题啊!!!
发表于 2010-1-19 12:58:21 | 显示全部楼层
本帖最后由 supersp 于 2010-1-19 13:02 编辑

本地运行时间,2.3毫秒
$begin = TimerInit()
$chars = FileRead("a.txt")
Local $outs,$array
For $i = 65 To 90
        $var = "(:(?i:"&Chr($i)&")\S*(?i:\r\n\S+)+)"
        $array = StringRegExp($chars,$var,3)
        If IsArray($array) Then
                for $j = 0 to UBound($array) - 1
                        $outs &= @CRLF & $array[$j] & @CRLF
                Next
        EndIf
        $array=0
Next
$dif = TimerDiff($begin)
msgbox (0,"",$dif&@CRLF&$outs)
原本正则前面有 (?i:^|\n)的..但是取出的第一行总是少个@Crlf,在循环中要加个判断,为了方便跟效率就去掉了,虽然不是完全跟a.txt里一样,但输出符合格式就行..
发表于 2010-1-19 13:05:46 | 显示全部楼层
回复 48# supersp


    好像排序还是有点问题哦~ :tr :te
发表于 2010-1-19 13:11:22 | 显示全部楼层
本帖最后由 supersp 于 2010-1-19 15:50 编辑

我这里测试没有吧..
按顺序从a-z来匹配段落,并合并到字符串
不过没考虑段落中间有空行的情况

对了,理解错了,,,我只考虑了首字母排序问题...
=.= 因为考虑到不使用数组函数..
所以tr te就是原来的顺序了
发表于 2010-1-19 14:17:43 | 显示全部楼层
来这里混了这么久!连这个题目都做不出来!真是。。。。。。。。。。。
发表于 2010-1-19 15:49:46 | 显示全部楼层
咳...楼上是说我吗?
虽然2008年注册的,不过在线时间8小时..
差不多3小时是今天挂的
发表于 2010-1-20 01:58:07 | 显示全部楼层
本帖最后由 298311657 于 2010-1-20 03:03 编辑

几天没上论坛,又出新题目了啊
我用正则匹配写了一个
Dim $a[1][2] = [[1,'']], $Out = ''
$begin = TimerInit()
;取文本数据
$file = FileOpen("a.txt", 0)
If $file = -1 Then Exit
$chars = FileRead($file)&@CRLF&@CRLF
FileClose($file)
;正则匹配取得的文本内容
$nOffset = 1
While 1
        $array = StringRegExp($chars, '^:.*?|\n:.*?', 1, $nOffset)
    If @error = 0 Then
        $nOffset = @extended
                ReDim $a[$a[0][0] + 1][2]
                $a[0][0] += 1
                $a[$a[0][0]-1][0] = $nOffset - 1
    Else
        ExitLoop
    EndIf
WEnd
$a[0][0] -= 1

If $a[0][0] = 0 Then Exit;未发现:开始的段落则退出
;取出各段落的内容
For $i = 1 To $a[0][0]
        If $i = $a[0][0] Then
                $a[$i][1] = StringMid($chars,$a[$i][0])
        Else
                $a[$i][1] = StringMid($chars,$a[$i][0],$a[$i+1][0]-$a[$i][0])
        EndIf
Next
;对段落进行排序,也许还有更高效的算法
For $i = 1 To $a[0][0]
        For $s = $i To $a[0][0] - 1
                If $a[$i][1] > $a[$s+1][1] Then
                        $tmp0 = $a[$i][0]
                        $tmp1 = $a[$i][1]
                        $a[$i][0] = $a[$s+1][0]
                        $a[$i][1] = $a[$s+1][1]
                        $a[$s+1][0] = $tmp0
                        $a[$s+1][1] = $tmp1
                Else
                        ExitLoop
                EndIf
        Next
Next
;整理输出
For $i = 1 To $a[0][0]
        If $i = $a[0][0] Then
                $Out &= StringRegExpReplace($a[$i][1],'\n\s*\r','');删除最后的输出段落的空白符
        Else
                $Out &= $a[$i][1]
        EndIf
Next
$dif = TimerDiff($begin)
MsgBox(0,'耗时'&$dif,$Out)

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 学习了

查看全部评分

发表于 2010-1-20 02:02:51 | 显示全部楼层
本帖最后由 298311657 于 2010-1-20 02:19 编辑

网络太卡了,造成连贴两楼,这层清理掉~
发表于 2010-1-20 02:53:58 | 显示全部楼层
本帖最后由 afan 于 2010-1-20 02:55 编辑

回复 53# 298311657


    好像排序还是有点问题,比如下面这段测试文本:
:zxv:jhlkj
fjhgkgh,:

:aaggjgj
sfsdgsh

jyjyjkyk
fghrt,uy5:6.766

:true
true??
assign!


:false
false??

:asf
sddgfdfh_:ds

:loop
L$***,G$***

:M$
M$###,M-obj

:kkkasdf
&&&fff****232

:test
^^~!!%%^^
false??
发表于 2010-1-20 03:06:23 | 显示全部楼层
回复 55# afan

修改了一下正则,现在应该好了
发表于 2010-1-20 03:09:29 | 显示全部楼层
回复 56# 298311657


    还是同样的问题, :l  :k :M
发表于 2010-1-22 00:16:46 | 显示全部楼层
传说中的正则之神么?
发表于 2010-1-30 13:43:39 | 显示全部楼层
高人呀,不顶不行
发表于 2010-1-31 16:04:55 | 显示全部楼层
看不懂,先收藏慢慢学习
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:31 , Processed in 0.187046 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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