找回密码
 加入
搜索
楼主: 大绯狼

[效率算法] N个数中取走一个,如何知道取走的是哪个

 火.. [复制链接]
发表于 2010-6-27 11:29:23 | 显示全部楼层
#include <Array.au3>
$difftime = TimerInit();計時開始
Local $sText
Local $avArray[10000000] ;一万个数

For $i = 0 To UBound($avArray) - 1
        $avArray[$i] = Random(1, 100, 1)
        $sText &= $avArray[$i]
Next

;_ArrayDisplay($avArray, '原数组') ;原数组

$avArray[Random(0, UBound($avArray) - 1, 1)] = '(.+?)' ;从原数组中替换一个元素
;_ArrayDisplay($avArray, '新数组') ;某元素被替换后得到的新数组

$sString = _ArrayToString($avArray, '')
$aReg1 = StringRegExp('aaaaaaaaaa' & $sString & 'zzzzzzzzzz', '.{10}\(.+?\).{10}', 3)
$aReg2 = StringRegExp('aaaaaaaaaa' & $sText & 'zzzzzzzzzz', $aReg1[0], 3)
MsgBox(0, '用时:' & TimerDiff($difftime), '刚刚被替换的数是  ' & $aReg2[0])
 楼主| 发表于 2010-6-27 11:35:14 | 显示全部楼层
回复 15# pusofalse


很好的想法,不知道效率如何,因为需要用到2个大字符串,不知道P大能给出一个有效率点的算法出来不。
 楼主| 发表于 2010-6-27 11:37:10 | 显示全部楼层
回复 16# 水木子


我有空了测试下,这个不会碰到字符数限制?
发表于 2010-6-28 22:02:36 | 显示全部楼层
再来个递归二分法。应该不会内存溢出。
#include <Array.au3>
Local $avArray[10000], $anArray[10000];一万个数
Local $n[4]
$begin = TimerInit()

For $i = 0 To UBound($avArray) - 1
        $abc=Random(1, 100, 1)
        $avArray[$i] = $abc
        $anArray[$i] = $abc
Next

$half = UBound($avArray) / 2
$truehalf=$half
$n[0] = $half
$n[1] = UBound($avArray)
$num=Random(0, UBound($avArray) - 1, 1)
_ArrayDelete($avArray, $num) ;从数组中随机删除一个元素
;MsgBox(0,0,$num)
Runs()
For $i=Int($n[0]) To Int($n[1])
        If $avArray[$i]<>$anArray[$i] Then
                MsgBox(0,TimerDiff($begin),$i&@TAB&$avArray[$i]&@CRLF&$num&@TAB&"校验")
                ExitLoop
        EndIf
Next
        


Func Runs()
        If $avArray[$half-1]=$anArray[$half-1] Then
                If $n[1]-$n[0]<=4 Then 
                        ;MsgBox(0,TimerDiff($begin),"只能是"&$n[0]&"--"&$n[1])
                        Return
                EndIf
                add()
        Else
                jian()
        EndIf
EndFunc

Func add()
        $n[2]=$n[0]
        $half=($n[1]-$n[0])/2+$n[0]
        $n[0]=$half
        Runs()
EndFunc

Func jian()
        $n[0]=$n[2]
        $n[2]=$n[0]
        $n[3]=$n[1]
        $half=($n[1]-$n[0])/2+$n[0]        
        $n[1]=$half
        If $avArray[$half-1]=$anArray[$half-1] Then
                $n[0]=$n[1]
                $n[1]=$n[3]
                
                ;MsgBox(0,"","只能是")
                ;_ArrayDisplay($n,"减")
                Runs()
        Else
                ;_ArrayDisplay($n,"减")
                Runs()
        EndIf
EndFunc

评分

参与人数 1威望 +2 收起 理由
afan + 2

查看全部评分

发表于 2010-6-30 15:16:58 | 显示全部楼层
都是高手...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-15 15:07 , Processed in 0.071232 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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