说明关系型数据库通过索引提升查询效率的背后原理 。

  1. 如果没有索引,数据库引擎需要通过全表扫描来查找数据,这会产生大量的磁盘IO。

  2. 关系型数据库使用B+树构建索引来加速加快查询。B+树是一种二叉查找树(每个节点的键值必须:比保存在左子树的任何键值都要大,比保存在右子树的任何键值都要小),这样随机查找某个键值时可以通过从根节点执行二叉查找来加速查询,查询成本取决于树的层数。

  3. 针对范围查询和排序的优化:在每个叶子节点保存其下一个叶子节点的指针,这样当指定范围范围查询时,先从根节点根据范围的左值找到其叶子节点,之后通过向后遍历叶子节点即可找到对应范围右值,这样可以加速范围查询、排序、分组等数据库查询动作。

  4. 针对磁盘读写速度的优化:除了叶子节点之外的其他节点只保存键值,这样对磁盘的单次读写可以获取到尽可能多的数据。以MySQL为例,一个1000万行的表对应的B+树按照主键查找理论上只需要3次磁盘IO,这相对于全表扫描带来的磁盘IO是多个量级的性能提升。

  5. MySQL等数据库引擎在实际实现B+树索引的时候,针对磁盘读写做了优化:非叶子节点中只存放key值,叶子节点中除了key值也会存放数据,按照存放数据的不同索引区分为主索引(聚簇索引)和辅助索引:

    a) 主索引的叶子节点中存放该key值对应的完整记录,使用主索引进行查找时,可以直接输出记录;一个表只能创建一个主索引。

    b)
    普通索引的叶子节点则存放对应主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找;一个表可以创建多个辅助索引。

  6. 除了B+树,关系型数据库一般也支持哈希索引,哈希索引能够非常高效地进行随机查找,但是对于范围查询、排序和分组都不支持。

[编程题]寻找最后的山峰

热度指数:1319时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 算法知识视频讲解
山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。

假设 nums[-1] = nums[n] = -∞。

输入描述: 在命令行中输入一行数字,数字之间以空格分割,遇到换行符结束。输入的数字为整型,且总数量在10万以内。

输出描述:
输出索引最大的山峰的索引值(一个数字)

示例1
输入
2 4 1 2 7 8 4
输出
5
说明
索引最大的山峰的高度为8,其索引为5

import  java.util.*;
public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int[] arr = new int[100005];int num = 0;while(in.hasNextInt()){arr[num++] = in.nextInt();}num--;while(num > 0 && arr[num - 1] > arr[num] ){num--;}System.out.println(num);}
}

[编程题]比大小

热度指数:954时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M 算法知识视频讲解
给定一个整数数组,返回一个数组。该返回数组中第i个数字为,原数组中第i个位置的数字至少往右走多少步才能遇到比它大的数字。如果遇不到或者已经处于最右的位置,则置为-1。

输入描述: 输入为多行,第一行为一个整数N,1≤N≤106

接下来一共有N行,每一行为一个整数M,0≤M≤232-1

输出描述: 输出 N 行,每行一个数字表示转换之后的数组

示例1
输入
5
91
10
3
22
40
输出
-1
2
1
1
-1

import java.util.*;public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();int[] d = new int[n];for(int i=0; i<n; i++){d[i] = in.nextInt();}int[] ret = help(d);StringBuilder sb = new StringBuilder();for(int i=0; i<ret.length; i++){sb.append(ret[i]).append("\n");}System.out.print(sb.toString());}private static int[] help(int[] nums){int[] ret = new int[nums.length];Arrays.fill(ret, -1);Stack<Integer> s = new Stack<>();for(int i=0; i<nums.length; i++){while(!s.isEmpty() && nums[i] > nums[s.peek()]){int top = s.pop();ret[top] = i - top;}s.push(i);}return ret;}
}

[编程题]滑动窗口的中位数

热度指数:525时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 算法知识视频讲解
在实时计算中,数据流源源不断地流入计算单元,经常需要借助窗口来处理数据,其中有一类窗口为滑动窗口(Sliding Window),其特点是窗口长度固定,每次滑动一定的位移(slide)

现给定一个数组 nums,有一个长度为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。注意你只可以看到在滑动窗口 k内的数字,滑动位移大小slide=1,即滑动窗口每次只向右移动一位。

要求返回每一个滑动窗口内的中位数,解释中位数定义,例如:对于[2,3,4],中位数是3;对于[2,3],中位数是 (2 + 3) / 2 =
2.5

注意:为了简化窗口计算,规定如果没有累计到窗口大小的数,不能触发计算,即不输出结果!

输入描述: 输入两个数字n,k。n表示数组长度,k表示窗口大小 加下来n个整数用空格隔开,表示nums数组 (1<=k<=n)
(1<=n<=1000)

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int n, k;int[] nums=new int[1005];PriorityQueue<Integer> max = new PriorityQueue<>();PriorityQueue<Integer> min = new PriorityQueue<>(Comparator.<Integer>reverseOrder());n=scanner.nextInt();k=scanner.nextInt();for (int i = 0; i < n; i++) {nums[i]=scanner.nextInt();}for(int i=0;i<n;i++){if (min.size() == 0) {min.add(nums[i]);} else if (min.peek() > nums[i]) {min.add(nums[i]);} else {max.add(nums[i]);}if (i - k >= 0) {int delete = nums[i - k];if (min.peek() >= delete) {min.remove(delete);} else {max.remove(delete);}}while (min.size() > max.size() + 1) {max.add(min.poll());}while (max.size() > min.size()) {min.add(max.poll());}if (i >= k - 1) {if(k%2==0){System.out.print((min.peek()+max.peek())/2.0);}else {System.out.print(min.peek()/1.0);}if(i!=n-1){System.out.print(" ");}}}}
}

美团点评2020校招数据分析方向笔试题相关推荐

  1. 【美团点评2020校招测试方向笔试题】算法题部分1.删除字符 2.队列组合排序 3.寻找最小子字符串 4.最大矩形 5.最短送餐路程计算

    做题网址:点击进入 1.[编程题]删除字符 将给定的字符串,按照规则删除字符,输出删除后的字符串.删除规则为:相同字符连续,则删除,如"aaaab"删除后的字符串为"b& ...

  2. 美团点评2020校招测试方向笔试题

    一: 直接输出, 用flag记录是否有答案,一次循环,时间复杂度O(n). 代码 #include <iostream> #include <cstring> #include ...

  3. 美团点评2020校招前端方向笔试题

    五:斐波那契数列 代码 #include <iostream> #include <cstring>using namespace std; typedef long long ...

  4. 美团校招php笔试题,【美团点评】2020校招数据分析方向笔试题

    这几天做了下美团校招的一些套题.(只写了编程,这两天慢慢更新吧) 这套题还是蛮简单的..我暴力了好几个都能过.一个小时多一点差不多能写完. 4.棋子翻转 题意:在4*4的棋盘上摆满了黑白棋子,黑白两色 ...

  5. 美团点评2020年测试工程师笔试题

    VOL 155 04 2020-09 今天距2021年118天 这是ITester软件测试小栈第155次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  6. 美团2020校招前端方向笔试题

    1.简答题1 答案: 1. i,s,a都在栈中,new出来的对象A在堆上. 2. 执行完后a.i的值还是字符串op. 解析: 1.考察js堆与栈:栈内存主要用于存储各种基本类型的变量,包括Boolea ...

  7. 爱奇艺2020校招Java方向笔试题(第一场)

    1. 计算下列程序的时间复杂度(B) for (i=1;i<n;i++)for(j=1;j<m;j++){a1,a2,a3,a4}; A. O(n) B. O(nm) C. O(m) D. ...

  8. 爱奇艺2020校招Java方向笔试题(第二场)

    1. 以下关于synchronized描述不正确的是(C) A. 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的该synchronized方 ...

  9. 网易2020校招数据分析方向提前批笔试题解析

    网易2020校招数据分析方向提前批笔试题 选择题 简答题 编程题 选择题 有一类二叉树用三叉链表来存储的时候除了带有指向左右孩子节点的两个指针,还有指向父节点的指针,那么这样一棵二叉树有2个节点,那么 ...

最新文章

  1. java编程时 尽量少用_Java编程语言基础知识的要点
  2. 中国钢铁行业产量规模与十四五建设动态分析报告2022-2027年
  3. 2018-2019 20165208 网络对抗 Exp9 Web安全基础
  4. window location href 手机端无法跳转_Window对象在前端领域的角色
  5. mysql5.7单表最大容量_mysql 5.7单表300万数据,性能严重下降,如何破?
  6. 使用电脑adb给Essential Phone刷机 —(官方篇)
  7. !!!随机数生成!!
  8. java httpurlconnection 开链接后跳转_HttpURLConnection长连接详解
  9. 最新京东批量试用助手
  10. 【今日CV 计算机视觉论文速览 第108期】Tue, 30 Apr 2019
  11. WEB应用组合——LAMP软件源码编译安装
  12. 7.1 认识Access报表
  13. [luogu] P1637 三元上升子序列 树状数组
  14. 从控制台输入两个英文字母,输出这两个英文字母之间的所有的字母(包含大小写)
  15. 中国移动物联网连接规模超6000万
  16. IE安全系列之——昨日黄花:IE中的ActiveX(I)
  17. 星际战甲堕落轰击者结合目标_星际战甲牺牲任务流程
  18. “农业机械开发商”AMD的50年求生之路
  19. 关于几款主流的发行版Linux纵向测评(centOS,Ubuntu,deepin,manjaro)
  20. Python正则表达式(附正则表达式教程、调试工具、可视化工具)

热门文章

  1. 叮当快药难寻属于自己的解药
  2. 《杜拉拉升职记》职场36计
  3. 使用 Git上传代码到coding.net代码仓库详解
  4. QQ日志最多添加几条HTML,在微信图文添加超过3个视频的方法,最多可加53个视频...
  5. golang1.15.6 版本 map 源码笔记
  6. 计算机各类语言的区别
  7. 手机通讯录java首字母排序,Android联系人按拼音排序以及按汉字首字母或全拼搜索...
  8. 如何运用netoffice,开发兼容多个版本的outlook插件
  9. Matlab实现Lagrange插值多项式
  10. Centos7 搭建Nginx图片服务超详细新手小白教程