+ -
当前位置:首页 → 问答吧 → 【精英博主】简单的去重算法!

【精英博主】简单的去重算法!

时间:2011-07-14

来源:互联网

应用场景:按照某个关键字去掉重复的数据,多用在从数据库里取出某个字段非重复的数据

简单介绍:虽然可以通过SQL语句的GROUP BY以及distinct来达到去重的效果,但是效率却非常低下,下面我来说说简单的用程序来去重的方法

算法描述:

1:确定要从数据库里(或者其他存储中,比如变量比如cache)取出的数据的数量,假设为N

2:为了方便去掉重复后返回的数据量还为N,请在N的基础上根据重复度增加M调数据,这样需要从数据库里取出的数据为N+M条记录

3:遍历取出来的所有记录,维护一个已存在的非重复字段的数组

4:每次遍历的时候去查看该数据是否存在在非重复字段数组中,不存在则是你想要的数据,并更新非重复字段数组,存在则跳过。

5:当得到的有效数据条数达到N的时候则结束遍历

实例函数:

<?php
/**
* 去重算法
* @param array $arr 要操作的二维数组
* @param string $key 参数2,要去重的key
* @return int $nums 返回的数据条数
*/
function dedup($arr,$key,$nums){
    if(is_array($arr)){
        $arrTmp=array();//用来存放已经存在的key值
        $i=0;//用来计算多少非重复的数据
        foreach($arr as $v){
            if(is_array($v)){
                if(!in_array($v[$k],$arrTmp)){
                    $i++;
                    $arrTmp[]=$v[$k];
                    $list[]=$v;
                    if($i==$nums){
                        break;
                    }
                }
            }else{
                return false;
            }
        }
        return $list;   
    }else{
        return false;
    }
}



作者: 纳美人   发布时间: 2011-07-14

array_unique 

作者: liuxingyuyuni   发布时间: 2011-07-14

有时我并不确定应该把这件工作交给谁来做, 比如说记录比较多的时候.
在分页显示(上万页或更多)时, 按我的习惯, 肯定会把工作交给数据库, 只返回当前页需要显示的N条记录, 而绝不会把全部记录交给程序处理. 若返回一个庞大的记录集并使用楼主的方法来过滤, 此时程序的任务会不会太重了点?
我的观点是, 这依赖于网站的规模. 如果数据库运行比较轻松, 还是交给数据库吧, 至少可以控制代码的可读性及程序的内存占用率.

另外我并没有深入比较过内存占用方面的优劣. PHP处理一个大记录集会占用大量内存和处理器时间, 数据库在处理时同样也要占用, 不知道是否有人量化并比较过.
实话说我还是倾向于使用数据库, 因为我感觉在内存方面, 数据库无论如果是要占用的, 所以并不会额外增加多少压力; 相反对于PHP来说, 每一次都是一项全新的繁重的任务. 想象一下在客户端连续不停的翻页吧, 此时把工作交给数据库, 它一定会表示"没有鸭梨", 因为它有海量缓存.

个人以为如此, 欢迎指正.

作者: sztime   发布时间: 2011-07-14