找回密码
 加入
搜索
查看: 4934|回复: 6

[效率算法] 关于删除重复行[已解决]

  [复制链接]
发表于 2011-4-20 00:10:15 | 显示全部楼层 |阅读模式
本帖最后由 love5173 于 2011-4-20 23:08 编辑

相关帖子http://www.autoitx.com/forum.php ... p;extra=&page=1
3M的代码
#include <File.au3>
 
$aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"","文本文件 (*.txt)", 1 + 4)
If @error Then 
        MsgBox(0,0,"文件未选择",3)
        Exit
EndIf
$begin = TimerInit()
Local $str='',$file_array
_FileReadToArray($aFile,$file_array)
;_ArrayDisplay($file_array)
For $i = 1 To UBound($file_array)-1
        $temp=$file_array[$i]
        If Not IsDeclared($temp) Then
                Assign($temp, $i)               
                $str&=$temp&@CRLF
        EndIf
Next
$dif = TimerDiff($begin)
        $out_file=StringTrimRight($aFile,4)&'_已完成.txt'
        if FileExists($out_file) then FileDelete($out_file)
        FileWrite($out_file,$str)
        ShellExecute($out_file)
        WinWaitActive("[CLASS:Notepad]")
        WinSetTitle("[CLASS:Notepad]", "", '处理'&UBound($file_array)&'行'&'     用时'&int($dif)&'毫秒')
Exit
我修改的
#include <File.au3>
 
$aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"","文本文件 (*.txt)", 1 + 4)
If @error Then 
        MsgBox(0,0,"文件未选择",3)
        Exit
EndIf
$begin = TimerInit()
Local $str='',$file_array
_FileReadToArray($aFile,$file_array)
;_ArrayDisplay($file_array)
For $i = 1 To UBound($file_array)-1
        ;$temp=$file_array[$i]
        If Not StringInStr($str,$file_array[$i],1) Then
               ; Assign($temp, $i)               
                $str&=$file_array[$i]&@CRLF
        EndIf
Next
$dif = TimerDiff($begin)
        $out_file=StringTrimRight($aFile,4)&'_已完成.txt'
        if FileExists($out_file) then FileDelete($out_file)
        FileWrite($out_file,$str)
        ShellExecute($out_file)
        WinWaitActive("[CLASS:Notepad]")
        WinSetTitle("[CLASS:Notepad]", "", '处理'&UBound($file_array)&'行'&'     用时'&int($dif)&'毫秒')
Exit
我只是想知道为什么StringInStr的效率这么低下呢?
这个命令耗时在什么地方?
发表于 2011-4-20 00:44:19 | 显示全部楼层
打个比方:相当于在一万个人里找相同的人.
代码1:先拖一个人出来,首先检查档案库=>如果没有建立档案,立即建立.如果已有档案,斩,此人消失.复杂程度:1
代码2:先拖一个人出来,在一万个人里找一遍,如果有相同的人,斩一个,此人消失.复杂程度10000
发表于 2011-4-20 07:53:34 | 显示全部楼层
托下来学习学习
发表于 2011-4-20 20:34:30 | 显示全部楼层
其实,有些很经典的算法你们一定要会的,象此类问题,用折半法啊
发表于 2011-4-20 20:49:46 | 显示全部楼层
既然读到数组了,直接用_arrayunique不就行了
 楼主| 发表于 2011-4-20 23:02:02 | 显示全部楼层
回复 5# netegg
谢谢
发表于 2011-4-25 16:14:07 | 显示全部楼层
其实,有些很经典的算法你们一定要会的,象此类问题,用折半法啊
asdasdasd 发表于 2011-4-20 20:34

折半法?
无序数怎么用折半法。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 20:38 , Processed in 0.084776 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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