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

[效率算法] 怎么合并计算,或者编程思路?

 火.. [复制链接]
发表于 2012-6-10 13:05:06 | 显示全部楼层
本帖最后由 binghc 于 2012-6-10 13:06 编辑

回复 6# afan


一直用 Assign Eval IsDeclared 组合模拟哈希,计算楼主这样的问题挺爽,但始终没真正的哈希好用
发表于 2012-6-10 18:44:12 | 显示全部楼层
回复 14# netegg

谢谢蛋大!

这是我晚交的功课, 主要利用数组来处理.
#include <array.au3>
Local $Str = _
                '12345        2' & @CRLF & _
                '12344        1' & @CRLF & _
                '22110        2' & @CRLF & _
                '12005        1' & @CRLF & _
                '5512        2' & @CRLF & _
                '22110        5' & @CRLF & _
                '12344        3'
MsgBox(0, '原字符串', $Str)
Local $aSR = StringRegExp($Str, '(\d+)        (\d+)', 3)
Local $sOut[1], $totle[1]
For $i = 0 To UBound($aSR) - 1 Step 2
  $index = _ArraySearch($sOut, $aSR[$i])
  If @error Then
          _ArrayAdd($sOut, $aSR[$i])
          _ArrayAdd($totle, $aSR[$i+1])
          ContinueLoop
  EndIf
  $totle[$index] += $aSR[$i+1]
Next
$Str = ''
For $i = 1 To UBound($sOut) -1
        $Str &= $sOut[$i] & @TAB & $totle[$i] & @CRLF
Next
MsgBox(0, '合并计算', $Str)
发表于 2012-6-10 19:47:02 | 显示全部楼层
Local $Str = _
                "12345"&@TAB&"2"&@CRLF& _
                "12344"&@TAB&"1"&@CRLF& _
                "22110"&@TAB&"2"&@CRLF& _
                "12005"&@TAB&"1"&@CRLF& _
                "5512"&@TAB&"2"&@CRLF& _
                "22110"&@TAB&"5"&@CRLF& _
                "12344"&@TAB&"3"
Local $aSR = StringSplit($Str,@CRLF,1)
Local $arr,$sOut=""
Local $dic = ObjCreate("scripting.dictionary")
For $i = 1 To $aSR[0]
        $arr=StringSplit($aSR[$i],@TAB)
        If $dic.exists($arr[1]) Then
                $dic($arr[1])=$dic($arr[1])+Number($arr[2])
        Else
                $dic($arr[1])=Number($arr[2])
        EndIf
Next
$arr=$dic.keys
For $i=0 To UBound($arr)-1
        $sOut=$sOut&$arr[$i]&@tab&$dic($arr[$i])&@CRLF
Next
MsgBox(0, '合并计算', $sOut)
广开思路吧
发表于 2012-6-10 20:38:32 | 显示全部楼层
Local $Str = _
                '12345        2' & @CRLF & _
                '12344        1' & @CRLF & _
                '22110        2' & @CRLF & _
                '12005        1' & @CRLF & _
                '5512        2' & @CRLF & _
                '22110        5' & @CRLF & _
                '12344        3'

Local $aSR = StringRegExp($Str, '(\d+)        (\d+)', 3)

Local $arr,$sOut=""
Local $dic = ObjCreate("scripting.dictionary")
For $i = 0 To UBound($aSR) - 1 Step 2

     $dic.Item($aSR[$i]) =$dic.Item($aSR[$i])+$aSR[$i+1]

Next
$arr=$dic.keys
For $i=0 To UBound($arr)-1
        $sOut=$sOut&$arr[$i]&@tab&$dic($arr[$i])&@CRLF
Next


MsgBox(0, "", $sOut)


楼上的代码,也可以这么写
不过不管怎么样,还是没有A版的代码效率高
发表于 2012-6-10 23:42:00 | 显示全部楼层
真看不懂做什么
发表于 2012-6-11 09:44:23 | 显示全部楼层
回复 19# gto250
如果是vb中运行,第一次会慢,第二次开始,就会直接引用系统中已经存在的对应项目,效率就相当高了,估计是不是au3中并不存在类似机制,每次都重新建立字典项目,造成了效率降低,如果有很多数据的话倒是可以测试一下
发表于 2012-6-11 11:04:44 | 显示全部楼层
回复 16# binghc

用au3调用SQLite来真正使用Hash表来做这种事吧

的确hash表处理这种事是非常好用和快捷的。还不会因为数据量太大有CPU100%内存1G这种事发生
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 22:11 , Processed in 0.073718 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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