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';

     如果有更优的方法 请赐教

  • 相关阅读:
    算分-DESIGN THECHNIQUES
    高级数据结构笔记摘要
    红黑树和AVL树笔记摘要
    索引笔记摘要
    检索笔记摘要
    外排序笔记摘要
    内排序笔记摘要
    线性表总结
    数论的一点前置知识
    线段交模板
  • 原文地址:https://www.cnblogs.com/cgjcgs/p/7127802.html
Copyright © 2011-2022 走看看