如何设计一个地图功能,找到当前最近的加油站?
吴军老师的《硅谷来信》中的第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、解决问题时,尽量避免主观假设。
加油站这道题,我们很长时间都是假设找加油站这件事,是为我个人服务的,并没有考虑,这个假设不在题目中。无法跳出我们的局限性,也就无法进一步优化了。
如何设计一个地图功能,找到当前最近的加油站?相关推荐
- 假设你有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次购买之前
假设你有一个数组,其中第i 个元素是第i天给定股票的价格.设计算法以找到最大利润.你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票).注意:您不能同时进行多笔交易(即,您必须在再次购买 ...
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符
题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...
- 设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 ...
- 字体设计合集欣赏|为你的下一个设计项目找到完美的字体
字体集合 这是集设网的一系列美丽的,优秀的字体集合. 可用于大胆的海报字体,装饰脚本,和一切之间! 为你的下一个设计项目找到完美的字体吧. 无论你是在寻找一种特殊类型的字体或字体风格,以配合一个事件或 ...
- 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!
作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...
- 怎么设计一个合适的延时队列?
[文章来源]https://sourl.cn/pcgvTp 延时队列技术调研 项目背景 延迟队列,它是一种带有延迟功能的消息队列,目前工作中有几处需延时处理的应用场景. 可选技术参考 kafka 考虑 ...
- butter滤波器是iir吗_如何快速设计一个IIR滤波器
在文章如何快速设计一个FIR滤波器(一)以及如何快速设计一个FIR滤波器(二)等文章中,我们讨论了如何设计FIR(Finite Impulse Response Filter),FIR有很多优点,比如 ...
- 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的
2020-01-22 05:41:34 作者 | 丛末 编辑 | Camel 本科毕业于清华姚班.博士毕业于普林斯顿大学,师从 Sanjeev Arora 教授,马腾宇作为 AI 学界一颗冉冉升起的新 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
本系列所有文章 如何一步一步用DDD设计一个电商网站(一)-- 先理解核心概念 如何一步一步用DDD设计一个电商网站(二)-- 项目架构 如何一步一步用DDD设计一个电商网站(三)-- 初涉核心域 如 ...
最新文章
- php根据键值去除数组中的某个元素_php删除数组中指定值的元素的几种方法
- Android Service与Runnable整合并用
- 【今日CS 视觉论文速览】3 Jan 2019
- Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)
- ubuntu 安装360浏览器
- 分享2020年第三方支付产品服务流程
- BDB 入门篇 第6章 A DPL Example一个DPL 例子
- OceanBase-概述
- Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)
- java 将网页表格导出_Java导出网页表格Excel过程详解
- 10个常用的数据分析商业模型之漏斗模型(六)
- layui之图片上传
- The server time zone value is unrecognized or represents more than one time zone. 这个问题的解决方法
- 一些开源书籍下载地址汇总
- RePr Improved Training of Convolutional Filters阅读翻译
- gitlab修改时区
- python正负数排序_带有负值的Python sort()问题
- 汇编语言(四)-8086的指令系统
- 统计模型方法-验证性分析总纲
- Android 腾讯tbs适配Android Q啦~~
热门文章
- 智慧物流之RFID智能仓库管理应用案例解析,RFID仓库管理解决方案-新导智能
- 解决Ubuntu输入正确密码后无法进入桌面,一直停留在登陆界面的问题
- android 播放器 音乐,音乐我最行 七款Android播放器大比拼
- 流量来源分析 0801 0810 0820 流量数据重跑
- WPF 从最底层源代码了解 AllowsTransparency 性能差的原因
- yolov5m.pt下载
- 9 WebMagic 入门案例
- ubuntu18.04 terminal 无法打开
- HT-IDE3000显示This application has requested the Runtime to terminate it in an unusual way
- 花开不败——复旦中文系女生的高三笔记