zoukankan      html  css  js  c++  java
  • 一个面试题 64M内存 过滤排序文件内的数字并写入文件

    请编写PHP代码对数据文件(data)进行操作,尝试完成以下几个任务:

    删除不足12位的行、重复行
    按CNAPS号校验算法删除错误数据行 (双模效验 )
    按substr(line,0,3)与substr(line,3,4)双条件正序对数据集进行排序
    保存数据集至用户根目录,文件名为其的SHA1值
    在代码最后一行调用memory_get_peak_usage(false),并将返回值转换为kb输出

    PS:
    数据文件换行符为
    PHP的内存已被限制为64M,不得调高内存限制

    下载data文件 下载 (当图片上传了 下载后命名为: data.xz)

    <?php
    
    /**
     * 执行效果
        win10  CPU:i7  PHP 5.6 
        time:30 second  (29-32秒之间)
        Memcache max: 41.328315734863 M
     */
    
    
    class data{
        
        private $set = [];
        
        public function filter($file='data')
        {
            $f = fopen($file,"r");
            if($f){
               while (!feof($f))
                {
                    $line = trim(fgets($f)); //去掉 
    
                
                    if(self::length($line) && self::cnaps($line)) // 长度 和 双模验证
                    {
                        $key = (int)substr($line,0,3);
                        $this->set[$key][$line] = null ; // 去重
                    }
                }
                fclose($f);
            }
        }
        
        public static function length($str)
        {
            if(strlen($str) < 12)
            {
                return false;
            }
            return true;
        }
        
        public static function cnaps($str)
        {
            $count = strlen($str);
            $p = 10;
            for($i=0;$i<$count-1;$i++)
            {
                $number = (int)$str[$i];
                $p = (($n=($p+$number)%10)?:10)*2%11;
            }
            if($p<2){
                $p=1-$p;
            }else{
                $p=11-$p;
            }
            return $p==$str[$count-1];
        }
        
        public function sortByKey()
        {
            $content = '';
            ksort($this->set); // substr($line,0,3) 排序
    
            foreach($this->set as $key => $val)
            {
                $val = array_keys($val);
                
                usort($val,"self::my_sort");  // substr($b,3,4) 排序
                
                unset($this->set[$key]);
    
                while($row = array_shift($val))
                {
                    $content? $content.="
    $row":$content.=$row;
                }
            }
            $file = sha1($content);
            file_put_contents($file ,$content);
        }
        
        public static function my_sort($a,$b)
        {
            $front = substr($a,3,4);
            $back = substr($b,3,4);
            if ($front==$back) return 0;
            return ($front<$back)?-1:1;
        }
    
    }
    
    $start = time();
    $clas = new data();
    $clas->filter();
    $clas->sortByKey();
    $end = time();
    echo 'time:',($end-$start),' second';    
    $byte =  memory_get_peak_usage(false);
    echo "
     Memcache max: ", $byte/1024/1024,' M';

     如果有更优的方法 请赐教

  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/cgjcgs/p/7127802.html
Copyright © 2011-2022 走看看