笔试题--TopK问题

笔试题--TopK问题
   CVTE笔试题 题目:本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
    这个题目就是典型的TopK问题,在众多的数据中求前K个数据。
    观察题目可以发现,这种题目不仅是简单的排序,在排序前还需要将相同键值的数据合并,所以我们首先可以想到,需要先进行统计所有水果的次数,我们可以通过遍历数组,来统计次数,但是这种方法当数据庞大时,开销太大,并不适用。
    我们可以很迅速的想到使用STL的容器map来进行快速的统计次数。map的底层是K/V结构的红黑树,具有防冗余的特性(即当前插入元素已存在时,则插入失败)
    STL中map的insert接口,返回值的一个pair,pair是一个结构体,包含一个迭代器和一个bool类型的值。即表示若插入成功,则返回一个被插入元素的迭代器,并且将第二个参数设置为true,否则返回容器中已经存在的和当前插入元素相同的元素的迭代器且将第二个参数设置为false
                                                                   

    所以我们第一个函数先要来实现计数
    
    这个函数的实现较为简单,只要理解map的insert函数的具体实现就可以很容易的实现这个函数。所以在这里就不过多的讲这个函数的实现
    接下来就是TopK问题的关键部分,排序比较出TopK,当然当数据过多时,排序算法就有些难以实现,但是也勉强可以算是一种方法
    方法一:使用优先级队列(优先级队列的方法较为简单,熟悉STL里的优先级队列,就可以很容易的实现这个代码)
    
     
    
    程序运行结果
    
   
    方法二:借助vector来实现,将map中的数据全部存储到vector中,然后使用排序算法来对vector中的数据进行排序,但是这种方法具有一定的局限性,当数据过多时,vector的存储空间会特别大,排序算法的效率也会比较低
    
     
    
    运行结果:
    
    
    方法三:借助vector,使用堆排序来实现,求TopK问题,可以建一个K大小的小堆,当数据很多时,也比较方便使用,小堆的堆顶数据是当前K各数中的最小值,当数据和堆顶数据比较时,比堆顶数据大就将原本的堆顶数据pop,将当前数据push。
    
    
    
    
 
    方法四:可以使用set来解决这个问题,但是set容器具有防冗余的特性,所以当map中的数据的second相等时,set就会出错,并不会将相等数据插入。但是这种方法也算一种思路,set本身就是排序的,所以使用set方法时,可以免去排序的步骤
    
     
    
    
   
    想要迅速高效的解决此类问题,就必须熟练的掌握使用STL中的容器和算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值