吴军老师的《硅谷来信》中的第080封信,讲了一道Google面试题。

题目如标题,主要考察两方面:

1、考察计算机科学的基本知识

2、看候选人分解问题、解决问题的能力

首先处理一个问题要先全面了解问题,否则答非所问或者没有体会出题人的考察点。我刚开始思考这道题,忽略掉了有点个关键点:

1、汽车是移动的,结果会不断更新,计算速度不能很慢。

2、这个产品不同的使用场景,对准确度接受度是不同的。如果两个加油站差200米,司机和行人对200米感受是不一样的。

3、汽车是有方向且移动的。汽车位置只有GPS定位,需要转换成街道地址的范围等。

4、距离的计算。在现实中两点之间的距离不是欧几里得直线距离,车辆不可能穿过建筑直行。两点之间的距离是很多距离片段的叠加,且两点之间每一段距离的线路有N多种组合,怎样找到最短的一条?可以使用动态规则方法找到最短路径。

找到所有加油站距离结果的列表之后,按照距离排序所有的加油站。另外需要考虑的几个问题:

1、排序复杂度。北京1000(n)个加油站,普通排序的算法复杂度n*log(n)。

2、计算量级。考虑汽车是移动的每分钟更新3到5次数据。北京有百万辆车在路上,可能有几千辆车在寻找加油站。

3、缩小问题范围。从问题出发了解到只要找到最近的几个加油站,距离比较远的加油站用户并不关心。所以没必要对那么多加油站距离结果进行排序。谈到二叉权一个特殊细类,即“堆”,这个数据结构可以做到只排出前几名,而不用管后面的,这个算法也叫做小规模的堆排序。

注:使用这种算法,计算第一名的复杂度是N,后面第二、第三名等的计算复杂度都是Log(n)。如果只要找到最近的10个加油站,计算的量级大约是1000左右(1000+x*10),这种算法也叫TopN算法。

结合真实场景,持续优化:

预先计算+全局优化:把北京所有路口之间点到点的距离事先计算好,当一个人要找加油站时,距离计算就变成汽车从当前的位置出发到附近的几个路口的距离,再算一下某个加油站到它所在地附近路口的距离,由于各个路口点到点的距离 都是事先计算好的,因此做几次加法就可以计算出结果。

作者总结了这道题可能带来的几点思维启发:

1、不要做无用功。

2、很多事情都遵循同一个规律。

学习理论(算法)很重要,同时要了解这个理论为什么会提出,解决的应用问题是什么,然后一通百通。

3、解决问题时,尽量避免主观假设。

加油站这道题,我们很长时间都是假设找加油站这件事,是为我个人服务的,并没有考虑,这个假设不在题目中。无法跳出我们的局限性,也就无法进一步优化了。

如何设计一个地图功能,找到当前最近的加油站?相关推荐

  1. 假设你有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次购买之前

      假设你有一个数组,其中第i 个元素是第i天给定股票的价格.设计算法以找到最大利润.你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票).注意:您不能同时进行多笔交易(即,您必须在再次购买 ...

  2. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符

    题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...

  3. 设n个不同的整数排好序后存于T[1..n]中,若存在一个下标i(1≤ i ≤ n),使得T[i]=i。试设计一个有效算法找到这个下标,要求算法在最坏情形下的计算时间为O(log n)

    转自http://zmp1123.blog.163.com/blog/static/1193291592013314581911/ 设n 个不同整数排好序后存于T[0:n-1]中,若存在一个下标i,0 ...

  4. 字体设计合集欣赏|为你的下一个设计项目找到完美的字体

    字体集合 这是集设网的一系列美丽的,优秀的字体集合. 可用于大胆的海报字体,装饰脚本,和一切之间! 为你的下一个设计项目找到完美的字体吧. 无论你是在寻找一种特殊类型的字体或字体风格,以配合一个事件或 ...

  5. 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

    作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...

  6. 怎么设计一个合适的延时队列?

    [文章来源]https://sourl.cn/pcgvTp 延时队列技术调研 项目背景 延迟队列,它是一种带有延迟功能的消息队列,目前工作中有几处需延时处理的应用场景. 可选技术参考 kafka 考虑 ...

  7. butter滤波器是iir吗_如何快速设计一个IIR滤波器

    在文章如何快速设计一个FIR滤波器(一)以及如何快速设计一个FIR滤波器(二)等文章中,我们讨论了如何设计FIR(Finite Impulse Response Filter),FIR有很多优点,比如 ...

  8. 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的

    2020-01-22 05:41:34 作者 | 丛末 编辑 | Camel 本科毕业于清华姚班.博士毕业于普林斯顿大学,师从 Sanjeev Arora 教授,马腾宇作为 AI 学界一颗冉冉升起的新 ...

  9. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    本系列所有文章 如何一步一步用DDD设计一个电商网站(一)-- 先理解核心概念 如何一步一步用DDD设计一个电商网站(二)-- 项目架构 如何一步一步用DDD设计一个电商网站(三)-- 初涉核心域 如 ...

最新文章

  1. php根据键值去除数组中的某个元素_php删除数组中指定值的元素的几种方法
  2. Android Service与Runnable整合并用
  3. 【今日CS 视觉论文速览】3 Jan 2019
  4. Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)
  5. ubuntu 安装360浏览器
  6. 分享2020年第三方支付产品服务流程
  7. BDB 入门篇 第6章 A DPL Example一个DPL 例子
  8. OceanBase-概述
  9. Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)
  10. java 将网页表格导出_Java导出网页表格Excel过程详解
  11. 10个常用的数据分析商业模型之漏斗模型(六)
  12. layui之图片上传
  13. The server time zone value is unrecognized or represents more than one time zone. 这个问题的解决方法
  14. 一些开源书籍下载地址汇总
  15. RePr Improved Training of Convolutional Filters阅读翻译
  16. gitlab修改时区
  17. python正负数排序_带有负值的Python sort()问题
  18. 汇编语言(四)-8086的指令系统
  19. 统计模型方法-验证性分析总纲
  20. Android 腾讯tbs适配Android Q啦~~

热门文章

  1. 智慧物流之RFID智能仓库管理应用案例解析,RFID仓库管理解决方案-新导智能
  2. 解决Ubuntu输入正确密码后无法进入桌面,一直停留在登陆界面的问题
  3. android 播放器 音乐,音乐我最行 七款Android播放器大比拼
  4. 流量来源分析 0801 0810 0820 流量数据重跑
  5. WPF 从最底层源代码了解 AllowsTransparency 性能差的原因
  6. yolov5m.pt下载
  7. 9 WebMagic 入门案例
  8. ubuntu18.04 terminal 无法打开
  9. HT-IDE3000显示This application has requested the Runtime to terminate it in an unusual way
  10. 花开不败——复旦中文系女生的高三笔记