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

[效率算法] 效率算法 如何判断一组数中每个数连续出现几次

  [复制链接]
发表于 2011-2-11 17:01:47 | 显示全部楼层 |阅读模式
比如有这样一组数字
1,2,3,4,5
2,3,4,9,10
2,1,3,4,7
9,8,6,5,4
3,2,1,5,6
... ...
怎么判断1,2,3,4,5,6,7,8,9,各连续出现几次,(注意:是连续出现,比如2连续出现了3次,4连续出现了4次)。
我想,用多重循环的土办法,代码可能要写一堆,加上无数的if语句,所以代码写不下去。先问问各位有没有好的速效算法,提供个思路给小弟,不胜感谢!
发表于 2011-2-11 21:40:04 | 显示全部楼层
是这样吗?

$arr = '1,2,3,4,52,3,4,9,102,1,3,4,79,8,6,5,43,2,1,5,6'
For $i = 0 To 9
        $RegExp = StringRegExp($arr, '[' & $i & ']', 3, 1)
        If Not @error Then MsgBox(64, $i & " 出现的次数为:", UBound($RegExp))
Next

不是很理解你的连续.你的注意让人摸不着头脑.
 楼主| 发表于 2011-2-11 22:05:47 | 显示全部楼层
回复 2# ceoguang

C版不好意思,我再表达一次:
$a[5]=[1,2,3,4,5]
$b[5]=[2,3,4,9,10]
$c[5]=[2,1,3,4,7]
$d[5]=[9,8,6,5,4]
$e[5]=[3,2,1,5,6]
这五个数组是连续排下来的,2在$a,$b,$c数组连续出现,1在$a和$c出现,但不是连续出现。
我想问的有没有好的效率算法来确定各个数各连续出现了几次?
发表于 2011-2-12 00:13:22 | 显示全部楼层
我明白你的意思了,但是,你这个依然是可以通过正则来计算的.你没看出规律?
假设你要寻找的数字为2,只是数值在UBound($arr) + 1 内都算是重复出现了对吧?不对,这里又生出多一个新问题.假如$arr的数值为[1,1,1,1,1],这里1算是重复吗?
发表于 2011-2-12 10:55:57 | 显示全部楼层
回复 3# papapa314
这题有点意思,来个笨办法
#include <array.au3>
Local $a[5]=[1,2,3,4,5],$b[5]=[2,3,4,9,10],$c[5]=[2,1,3,4,7],$d[5]=[9,8,6,5,4],$e[5]=[3,2,1,5,6]
_ArrayConcatenate($a,$b)
_ArrayConcatenate($a,$c)
_ArrayConcatenate($a,$d)
_ArrayConcatenate($a,$e)
$u=_ArrayUnique($a)
_ArrayDelete($u,0)
Local $fin[UBound($u)][2]
For $i=0 To UBound($u)-1
        $fin[$i][0]=$u[$i]
        $fin[$i][1]=1
Next

Local $temp[UBound($a)][2]
For $i=0 To UBound($a)-1
        $temp[$i][0]=$a[$i]
        $temp[$i][1]=Int($i/5)+1
Next
_ArraySort($temp)
Local $k=0
For $n=0 To UBound($u)-1
        $array_new=_ArrayFindAll($temp,$u[$n])
        If UBound($array_new)>1 Then
                Local $array_temp[UBound($array_new)][2]
                For $i=0 To UBound($array_new)-1
                        $array_temp[$i][0]=$temp[$array_new[$i]][0]
                        $array_temp[$i][1]=$temp[$array_new[$i]][1]
                Next
                _ArraySort($array_temp,0,0,0,1)
                Local $num=2
                For $i=1 To UBound($array_temp)-1
                        If $array_temp[$i][1]=$array_temp[$i-1][1]+1 Then 
                                $fin[$k][0]=$array_temp[$i][0]
                                $fin[$k][1]=$num
                                $num+=1                        
                        EndIf
                Next                
        Else
                $fin[$k][0]=$u[$n]
                $fin[$k][1]=1
        EndIf
        $k+=1
Next
_ArrayDisplay($fin)
 楼主| 发表于 2011-2-12 14:07:56 | 显示全部楼层
本帖最后由 papapa314 于 2011-2-14 00:32 编辑

回复 5# 3mile

谢谢3mile大哥,我昨晚想了一个晚上,终于想到一个比较好的方法了,可以支持更多连续排列下来的数组,代码也很简单。希望大家给提提意见!!附件是刚从网上找来的数据制作成ini文件,用来读取数组的。
#include <WindowsConstants.au3>
#include <array.au3>

        $total=IniReadSection(@ScriptDir&"\test.ini","测试");得到每行数字所组成的数组
        For $v=1 To 49
                Dim $period[31]
                Dim $t=0;存储单独出现的次数
                Dim $j=0,$value[31];存储包含出现数字信息的新数组
                For $i=0 To 30
                        ;分割每行数字为一个数组
                        $period[$i]=StringSplit($total[$i][1],",")
                        ;遍历数组,查找是否包含指定数字
                        If _ArraySearch($period[$i],$v,1)>0 Then
                                $t+=1                        ;得到单独出现的次数$t
                        EndIf
                        ;由于$period[$i]中第一个元素固定等于数组长度,所以从第二个元素开始查找
                        If _ArraySearch($period[$i],$v,1)>0 Then
                                $value[$j]=1;如果存在,就给$value1[$j]赋值1
                                $j+=1
                        EndIf
                        If _ArraySearch($period[$i],$v,1)=-1 Then
                                $value[$j]=0;如果不存在,就给$value1[$j]赋值0
                                $j+=1
                    EndIf
                        ;这时候就得到了一个包含出现数字信息的数组$value
                        
                Next
                                                
                        $a=StringReplace(_ArrayToString($value),"|","")
                        $b=StringSplit($a,"0");得到一个类似二进制的代码
                        Dim $two=0,$three=0,$four=0,$five=0
                        For $p=1 To UBound($b)-1
                                If $b[$p]="11" Then
                                        $two+=1
                                EndIf
                                If $b[$p]="111" Then
                                        $three+=1
                                EndIf
                                If $b[$p]="1111" Then
                                        $four+=1
                                EndIf
                                If $b[$p]="11111" Then
                                        $five+=1
                                EndIf
                                Next
                                
                        MsgBox(0,"","数字"&$v&"总出现次数为"&$t&",连续出现两次的有"&$two&"次;连续出现三次的有"&$three&"次;连续出现四次的有"&$four&"次,连续出现五次的有"&$five&"次")
                        Next

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-2-12 14:08:45 | 显示全部楼层
回复 4# ceoguang


  谢谢C版,想到一个方法了,希望给提提意见。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 05:31 , Processed in 0.078579 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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