免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1975 | 回复: 2
打印 上一主题 下一主题

有關陣列運算時間效率問題請教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-30 12:15 |只看该作者 |倒序浏览
我不是一個專職的perl程序員 只有自己興趣而研究
我寫出來以下的 陣列是序號產生器 執行要很久 要如何修正才能讓他更快

#!c:\perl\bin
        use File::Glob;
        #陣列碼設定-開始
        my @Code_Num=(
                [9,1,3,1,8,7,8,2,4,2,0,6,4,0,0,2],#0
                [5,1,3,1,8,7,8,2,4,2,0,6,4,0,0,2],#1
                [6,5,6,6,7,4,2,5,2,6,6,2,4,9,7,1],#2
                [0,4,4,8,4,2,2,8,9,8,4,5,3,7,3,2],#3
                [3,2,8,7,9,0,6,7,3,7,1,4,0,1,0,6],#4
                [0,5,5,4,2,5,0,3,2,3,3,4,2,3,1,3],#5
                [9,2,7,9,7,2,8,5,7,1,1,5,7,8,9,6],#6
                [9,6,3,9,6,2,7,5,7,8,9,1,7,4,1,6],#7
                [5,2,4,9,6,0,1,7,0,5,0,0,9,4,0,7],#8
                [6,9,0,2,8,9,0,1,0,8,6,2,6,4,9,6],#9
                [0,6,9,0,7,0,2,8,6,6,9,1,8,0,7,5],#A
                [6,8,3,6,0,8,6,1,5,0,6,1,5,5,9,6],#B
                [5,7,6,5,6,7,3,0,3,6,5,6,7,9,5,4],#C
                [6,5,6,2,4,1,0,1,3,2,9,4,4,1,9,8],#D
                [0,9,4,3,3,4,9,8,0,5,7,9,3,6,4,1],#E
                [3,3,6,5,8,0,9,5,2,1,1,4,4,2,6,1] #F
                #0 1 2 3 4 5 6 7 8 9 A B C D E F
        );
        #陣列碼設定-結束
       
        #輸入啟動碼-開始
        print"\n";print "請輸入程式要求回應之啟動碼 11 碼:";$Get_Codenum=<STDIN>;chomp($Get_Codenum);
        if(length($Get_Codenum) > 11){
                print "您輸入超過 11 碼之啟動碼,請重新輸入\n";
                exit;
        }elsif(length($Get_Codenum) < 11){
                print "您輸入小於 11 碼之啟動碼,請重新輸入\n";
                exit;
        }
        #輸入啟動碼-結束
        print "請稍候.....序號產生中.....大約會等待 10-15 分鐘\n";
        $times_start = time();
        #產生啟始碼-開始
        @DIM_SORT="";@DIM_SORTT="";$GDF=0;
        for $GY(0...hex(F)){                  #Y
                for $GX(0...hex(F)){          #X
                        if($Code_Num[$GY][$GX] eq substr($Get_Codenum,0,1)){
                                $GYF = uc sprintf "%x", $GY;
                                $GXF = uc sprintf "%x", $GX;
                                $DIM_SORT[$GDF]="$GYF$GXF";
                                $GDF++;
                        }
                }
        }
        #產生啟始碼-結束

        #產生後序碼-開始
        $RunScript = length($Get_Codenum);
        for $PP(1...($RunScript)){
                $GDF=0;$DIM_SUB=0;
                while(<@DIM_SORT>){
                        for $GY(0...hex(F)){                 #Y
                                for $GX(0...hex(F)){             #X
                                        $GYF = uc sprintf "%x", $GY;
                                        $GXF = uc sprintf "%x", $GX;
                                        $KK= ($PP*2)-1;
                                        $Check_Source = substr($DIM_SORT[$GDF],$KK,1);
                                        if($Code_Num[$GY][$GX] eq substr($Get_Codenum,$PP,1) && "$Check_Source" eq "$GYF"){
                                                $DIM_SORTT[$DIM_SUB]=$DIM_SORT[$GDF] . "$GYF$GXF";
                                                $DIM_SUB++;
                                        }
                                }
                        }
                        $GDF++;
                }
                @DIM_SORT = "";@DIM_SORT = @DIM_SORTT;
        }
        #產生啟始碼-結束

        #組合啟始碼並合並輸出序號-開始
        $KSD=0;$KTCON=1;
        while(<@DIM_SORTT>){
                $DIM_SORTR[$KSD] = substr($DIM_SORTT[$KSD],0,1);
                for ($KKP=1;$KKP<($RunScript*2);$KKP = $KKP+2){
                        $DIM_SORTR[$KSD] .= substr($DIM_SORTT[$KSD],$KKP,1);
                }
                $PDSD = length($DIM_SORTR[$KSD]);
                if($PDSD eq ($RunScript+1)){
                        $LA1 = substr($DIM_SORTR[$KSD],0,4);
                        $LA2 = substr($DIM_SORTR[$KSD],4,4);
                        $LA3 = substr($DIM_SORTR[$KSD],8,4);
                        $DFW = "$LA1-$LA2-$LA3\n";
                        my $Input_StringA = "$DFW";
                        $Input_StringA =~ s/-//g;
                        $Get_CodenumA="";
                        for($Split_WordyA=0;$Split_WordyA<$RunScript;$Split_WordyA++){
                                $cmaA=hex(substr($Input_StringA,$Split_WordyA,1));
                                $cmbA=hex(substr($Input_StringA,$Split_WordyA+1,1));
                                $Get_CodenumA .= $Code_Num[$cmaA][$cmbA];
                        }
                        $Rand_Put_Code[$KTCON] = "啟動碼 = $Get_Codenum 產生之序號 " . $LA1 . "-" . $LA2 . "-" . $LA3 . " 反解譯啟動碼 = $Get_CodenumA";
                        #print "啟動碼 = $Get_Codenum 產生之序號 " . $LA1 . "-" . $LA2 . "-" . $LA3 . " 反解譯啟動碼 = $Get_CodenumA\n";
                        $KTCON++;
                }
                $KSD++;
        }
        #組合啟始碼並合並輸出序號-結束
        print "可以使用之序號為:\n";
        #亂數取出 10 筆
        for $RG_Code(1...10){
                print $Rand_Put_Code[rand($KTCON)] . "\n";
        }
        $times_end = time();
        $time_total = $times_end - $times_start;
        print "\#\#\#\#總共耗費 $time_total 秒產生 $KTCON 筆序號 亂數取出 10 筆\n";


多謝大大指教 謝謝

论坛徽章:
0
2 [报告]
发表于 2006-03-31 11:14 |只看该作者
產生後序碼这一段循环太多,导致很慢,我不知道你的逻辑是什么。不过建议你采用空间换时间的办法减少循环。比如采用一些好的数据结构,使用perl特色的比较方法。

论坛徽章:
0
3 [报告]
发表于 2006-03-31 11:40 |只看该作者
因為 啟動碼 如果是 12345678901


所以啟始碼 會先抓 12345678901 的 第1個 1 來先做陣列組合 的開頭

例如 1 就可能有
01
03
11
13
...
的 序號 開頭

後序碼是用 啟始碼 來抓應該有的組合可能
也就是
01==>可能會有 5=>5個再用在下一次比較
03==>可能會有 3=>3個再用在下一次比較

因此 就會抓出 啟動碼 12345678901 在陣列裡 可能有幾種序號組合
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP