TOP k问题

2023-05-16

题目:有1千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。


解析:对于本题来说,某些面试者想用数据库的办法来实现:首先将文本导入数据库,再利用select语句某些方法得出前10条短信。但实际上用数据库是满足不了5分钟解决这个条件的。这是因为1千万条短信即使1秒钟录入1万条(这已经算是很快的数据录入了)5分钟才300万条。即使真的能在5分钟内录入完1千万条,也必须先建索引,不然sql语句5分钟内肯定得不出结果。但对1千万条记录建索引即使在5分钟之内都不可能完成的。所以用数据库的办法是不行的。
      这种类型的题之所以会出现,这是因为互联网公司无时无刻都在需要处理由用户产生的海量数据/日志,所以海量数据的题现在很热,基本上互联网公司都会考。重点考察的是你的数据结构设计和算法的基本功。类似题目是如何根据关键词搜索访问最多的前10个网站。

答案:
方法1:可以用哈希表的方法对1千万条分成若干组进行边扫描边建散列表。第一次扫描,取首字节,尾字节,中间随便两字节作为Hash Code,插入到hash table中。并记录其地址和信息长度和重复次数,1千万条信息,记录这几个信息还放得下。同Hash Code且等长就疑似相同,比较一下。相同记录只加1次进hash table,但将重复次数加1。一次扫描以后,已经记录各自的重复次数,进行第二次hash table的处理。用线性时间选择可在O(n)的级别上完成前10条的寻找。分组后每份中的top10必须保证各不相同,可hash来保证,也可直接按hash值的大小来分类。

方法2:可以采用从小到大排序的方法,根据经验,除非是群发的过节短信,否则字数越少的短信出现重复的几率越高。建议从字数少的短信开始找起,比如一开始搜一个字的短信,找出重复出现的top10并分别记录出现次数,然后搜两个字的,依次类推。对于对相同字数的比较常的短信的搜索,除了hash之类的算法外,可以选择只抽取头、中和尾等几个位置的字符进行粗判,因为此种判断方式是为了加快查找速度但未能得到真正期望的top10,因此需要做标记;如此搜索一遍后,可以从各次top10结果中找到备选的top10,如果这top10中有刚才做过标记的,则对其对应字数的所有短信进行精确搜索以找到真正的top10并再次比较。

方法3:可以采用内存映射的办法,首先1千万条短信按现在的短信长度将不会超过1G空间,使用内存映射文件比较合适。可以一次映射(当然如果更大的数据量的话,可以采用分段映射),由于不需要频繁使用文件I/O和频繁分配小内存,这将大大提高数据的加载速度。其次,对每条短信的第i(i从0到70)个字母按ASCII嘛进行分组,其实也就是创建树。i是树的深度,也是短信第i个字母。

    该问题主要是解决两方面的内容,一是内容加载,二是短信内容比较。采用文件内存映射技术可以解决内容加载的性能问题(不仅仅不需要调用文件I/O函数,而且也不需要每读出一条短信都分配一小块内存),而使用树技术可以有效减少比较的次数。

题目:如何从100万个数中找出最大的前100个数。

 1. 算法如下:根据快速排序划分的思想 
(1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 
(2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 
(3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果个数不够,继续(3)操作,如果个数超过100的就重复1操作,直到最后右边只有100个数为止。 

2.先取出前100个数,维护一个100个数的最小堆,遍历一遍剩余的元素,在此过程中维护堆就可以了。

具体步骤如下: 
step1:取前m个元素(例如m=100),建立一个小顶堆。保持一个小顶堆得性质的步骤,运行时间为O(lgm);建立一个小顶堆运行时间为m*O(lgm)=O(m lgm);       
step2:顺序读取后续元素,直到结束。每次读取一个元素,如果该元素比堆顶元素小,直接丢弃 
如果大于堆顶元素,则用该元素替换堆顶元素,然后保持最小堆性质。最坏情况是每次都需要替换掉堆顶的最小元素,因此需要维护堆的代价为(N-m)*O(lgm); 
最后这个堆中的元素就是前最大的10W个。时间复杂度为O(N lgm)。 


补充:这个方法的说法也可以更简化一些:
假设数组arr保存100个数字,首先取前100个数字放入数组arr,对于第101个数字k,如果k大于arr中的最小数,则用k替换最小数,对剩下的数字都进行这种处理。

3.分块查找 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TOP k问题 的相关文章

  • TOP k问题

    题目 xff1a 有1千万条短信 xff0c 有重复 xff0c 以文本文件的形式保存 xff0c 一行一条 xff0c 有重复 请用5分钟时间 xff0c 找出重复出现最多的前10条 解析 xff1a 对于本题来说 xff0c 某些面试者
  • [leetcode]347. Top K Frequent Elements

    Given a non empty array of integers return the k most frequent elements Example 1 Input nums 61 1 1 1 2 2 3 k 61 2 Outpu
  • mysql+e+eof_OS + linux crontab / top / ntpdate / nmon

    root 64 app01 crontab l 30 usr sbin ntpdate 192 168 118 201 00 00 nmon nmon x86 rhel54 f N m nmon s 60 c 1440 1 opt IBM
  • 2018:Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    摘要 本文中 xff0c 我们提出一种结合bottom up和top down的注意力机制 xff0c 能够在对象和其它显著图像区域的水平上计算注意力 在我们的方法中 xff0c bottom up的机制 基于Faster R CNN 提出
  • TOP to Down设计简单例子 Creo3.0

    1 打开Creo3 0 xff0c 新建装配 xff1a 2 点击模型 创建 xff0c 创建骨架模型 3 点击创建 子装配体 xff1b 用户定义默认 4 打开创建的子装配体 xff0c 创建零件 xff1b 约束默认 5 打开骨架零件
  • [CVPR2018]Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    Bottom Up and Top Down Attention 附 xff1a 论文下载地址 主要贡献 提出了一个新的LSTM组合模型 xff0c 包括了attention LSTM和language LSTM 两个组件 在这个组合模型的
  • top 默认使用内存排序的命令

    linux下 xff0c top默认使用cpu来排序 xff0c 如果希望改用内存占用情况或其他项来排序 xff0c 可以通过 o选项 top o MEM 通过 man top 查看其用法 xff0c 里面描述了 o 选项 xff0c 用于
  • PX4运行时,输入top命令,查看系统运行状态

  • Top-down Design简介

    自顶向下 xff0c 逐步求精的方法 在英文中称作Top down Design xff0c 是一种计算机编程使用的算法思想 xff0c 顾名思义 xff0c 这种方法的思想就是对现在遇到的复杂或者抽象化的问题 xff0c 进行纵向深入分解
  • 【论文阅读笔记】Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering.

    Bottom Up and Top Down Attention for Image Captioning and Visual Question Answering 2018 CVPR P Anderson X He C Buehler
  • Bottom-Up and Top-Down

    top down xff1a 在模式识别中使用了上下文信息 xff08 机器的处理方式 xff09 举例 xff1a 当你看到一张字迹潦草难以辨认的手写文本时 xff0c 你可以利用整个文本来辅助你理解其中含义 xff0c 而不是每个字单独
  • “Top-down”---至顶向下的设计方法

    Top down 至顶向下的设计方法 曾经看到有人说 xff0c 人活着的过程就是在不断地解决问题的过程 我觉得这句话很有道理 xff0c 从年幼时的牙牙学语 xff0c 到学习阶段的各种作业 xff0c 当然还有各种编程难题 xff0c
  • Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    一 摘要 自下而上的机制 基于 Faster R CNN xff1a 提取出图像区域 xff0c 每个区域都有一个相关的特征向量 自上而下的机制 xff1a 确定特征权重 提出了一种自下而上和自上而下的结合注意力机制 xff0c 使注意力能
  • Bottom-up And Top-down

    Bottom up 自下而上的处理可以理解为 xff1a 将感应器结果作为输入 xff0c 也就是激励 因此自下而上可以被描述为是数据驱动的 例如 xff0c 在一个人的花园正中有一朵花儿 xff0c 这个花儿的视觉和所有的激励信息都从视网
  • Linux进程管理动态查看进程top

    目录 一 解读top命令的显示信息 1 上半部分解读 xff08 前五行 xff09 2 后半部分 xff08 进程信息 xff09 二 top常用内部指令 一 解读top命令的显示信息 命令 xff1a top 注意 xff1a 在top
  • 【论文-损失函数】Learning with Average Top-k Loss

    基本信息 paper Learning with Average Top k Loss code pytorch 论文思路 该损失适用于在线难例挖掘 即在训练时选择前K个loss较大的样本进行back propagate bp xff0c
  • TOP 命令 使用技巧

    TOP 命令 使用技巧 参数解释 PID xff08 Process ID xff09 xff1a 进程标示号 每个 process 的 ID USER xff1a 进程所有者的用户名 该 process 所属的使用者 PR xff1a 进
  • linux中用top、ps命令查看进程中的线程

    在Linux上显示某个进程的线程的几种方式 方法一 PS 在ps命令中 T 选项可以开启线程查看 下面的命令列出了由进程号为
  • linux top详解

    语法 root incloudos logs top h procps ng version 3 3 10 Usage top hv bcHiOSs d secs n max u U user p pid s o field w cols
  • Linux Top查看指定进程的CPU状态

    查看top帮助信息 不管linux还是unix 大多数命令都是支持man命令来查看帮助信息的 语法是下面这样 进入到交互界面后 用法类似vi 然后按 q 可以退出 输入 再输入关键字 可以查询相关关键字 man top 帮助信息回显 TOP

随机推荐

  • 数组中重复的数字|||数组中只出现一次的数

    1 找出数组中重复的数字 题目描述 xff1a 在一个长度为n的数组里的所有数字都在0 n 1的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字重复了 xff0c 也不知道每个数字重复了几次 请找出数组中任意一个重复的数字 例
  • spring aop思想

    spring插件 xff1a STS插件 spring整合junit测试 每一个方法都不需要先获得容器再获得对象了 帮我们创建容器 64 RunWith SpringJUnit4ClassRunner class 指定创建容器时使用哪个配置
  • 线程池种类以及参数设置问题

    JDK1 5中引入了强大的concurrent包 xff0c 线程池的实现ThreadPoolExcutor 线程池种类 通常开发者都是利用Executors提供的通用线程池创建方法 xff0c 去创建不同配置的线程池 xff0c 主要区别
  • 乐观锁、悲观锁,实现一个乐观锁

    悲观锁 总是假设最坏的情况 xff0c 每次去拿数据的时候都认为别人会修改 xff0c 所以每次在拿数据的时候都会上锁 xff0c 这样别人想拿这个数据就会阻塞直到它拿到锁 传统的关系型数据库里边就用到了很多这种锁机制 xff0c 比如行锁
  • 优化查询的方法

    1 使用索引 应尽量避免全表扫描 xff0c 首先应考虑在where及order by xff0c group by涉及的列上建立索引 2 优化SQL语句 3 优化数据库对象 优化表的数据类型对表进行拆分使用中间表来提高查询速度 4 硬件优
  • 【远景能源】截取字符串

    截取字符串 package 远景能源 import java util Scanner public class 截取字符串2 public static void main String args Scanner sc 61 new Sc
  • JVM内存模型以及栈溢出、堆溢出

    JVM内存模型 线程共享 xff1a 堆 方法区 线程私有 xff1a 虚拟机栈 本地方法栈 程序计数器 堆 xff1a 存放所有对象实例 xff1b 方法区 xff1a 存储已被虚拟机加载的类信息 xff0c 常量 静态变量 xff0c
  • 线程和进程的区别

    线程和进程的区别 xff1a 调度 xff1a 线程作为调度和分配的基本单位 xff0c 进程是拥有资源的基本单位 xff1b 并发性 xff1a 不仅进程之间可以并发执行 xff0c 同一个进程的不同线程之间也可以并发执行 xff1b 拥
  • Spring容器应用到项目

    1 管理Service对象和DAO对象 2 Listener xff1a 监听器 xff08 监听属性创建销毁 xff09 xff0c 监听器中方便获得事件源 管理容器在项目中的生命周期 配置Listener来管理ApplicationCo
  • 使用注解配置spring

    为主配置文件引入新的命名空间 xff08 context约束 xff09 xff1b 开启使用注解代理配置文件 xff1b 在类中使用注解完成配置 xff1b 自动装配有缺点 xff1a 如果匹配到多个类型一致的对象 xff0c 将无法选择
  • ArchLinux安装全过程

    文章目录 安装桌面软件美化 arch很美好 xff0c 不多说直接开搞 xff0c 记录我的安装过程并解决问题 安装 1 镜像下载 清华大学开源镜像站 xff1a TUNA 2 虚拟机加载 选择 Arch Lnuxarchiso x86 6
  • spring bean的生命周期

    Spring Bean的完整生命周期从创建Spring容器开始 xff0c 直到最终Spring容器销毁Bean 一个Bean从创建到销毁 xff0c 如果是用BeanFactory来生成 管理Bean的话 xff0c 会经历以下几个阶段
  • 线程的状态总结以及各状态之间转换

    1 初始 xff08 NEW xff09 xff1a 新创建了一个线程对象 xff0c 但还没有调用start xff08 xff09 方法 xff1b 实现Runnable接口和继承Thread类可以得到一个线程类 xff0c new一个
  • HTTP和HTTPS

    HTTPS就是HTTP加上加密处理 xff08 一般是SSL安全通信线路 xff09 43 认证 43 完整性保护 HTTPS的作用 xff1a 内容加密 xff1a 建立一个信息安全通道 xff0c 来保证数据传输的安全 xff1b 身份
  • spring整合JDBC+spring aop事务

    1 spring整合JDBC spring中提供了一个可以操作数据库的对象 xff0c 对象封装了JDBC技术 JDBCTemplate xff1a JDBC模板对象 与DBUtils中的QueryRunner非常相似 JDBCDaoSup
  • 网站高并发&高可用处理

    1 三大问题 高并发 xff1a 多个进程或线程同时访问同一资源会产生并发问题 xff1b 高可用大数据量 2 解决方案 初级解决方案 xff1a 系统或服务器级别的解决方案 xff1a 增大服务器的CPU xff1b 增加内存条 xff1
  • 背包问题详解

    1 0 1背包问题 问题描述 xff1a 有N件物品和一个容量为V的背包 第i件物品的重量是w i xff0c 价值是p i 求解将哪些物品装入背包可使这些物品的总重量不超过背包容量 xff0c 且价值总和最大 思路 xff1a 每种物品仅
  • 堆排序原理与实现

    堆排序实际上是利用堆的性质来进行排序的 xff0c 我们通常说的堆就是二叉堆 xff0c 二叉堆又称完全二叉树或者近似完全二叉树 堆排序是选择排序的一种 可以利用数组的特点快速定位指定索引的元素 数组可以根据索引直接获取元素 xff0c 时
  • Hashmap1.7和1.8区别+ConcurrentHashmap1.7和1.8区别

    Hashmap JDK1 7中 使用一个Entry数组来存储数据 xff0c 用key的hashcode取模来决定key会被放到数组里的位置 xff0c 如果hashcode相同 xff0c 或者hashcode取模后的结果相同 xff0c
  • TOP k问题

    题目 xff1a 有1千万条短信 xff0c 有重复 xff0c 以文本文件的形式保存 xff0c 一行一条 xff0c 有重复 请用5分钟时间 xff0c 找出重复出现最多的前10条 解析 xff1a 对于本题来说 xff0c 某些面试者