[系统设计总结] - Proximity Service算法介绍

问题描述

Proximity Service广泛应用于各种地图相关的服务中比如外卖,大众点评,Uber打车,Google地图中,其中比较关键的是我们根据用户的位置来快速找到附近的餐厅,司机,外卖员也就是就近查询算法。

主流的就近算法

基本的主流就近算法大致就是下图粉色高光的几种,根据实现方式分为两个部分Hash类以及Tree类,基本思路都是将地图按照分割成足够小范围的小格来进行就近查询。

1. Even Grid等距分割

顾名思义,就是将世界地图按照一个固定的密度分割成固定大小的格子,每一个格子代表一小块经纬度范围[lat, long],我们给每一个格子定义一个ID, 这样再查找目标附近满足条件的餐厅时(下面算法讲解都以餐厅为例),我们找到目标所在格子相邻格子内满足条件的餐厅(不断扩大搜索范围直到找到所有满足条件)

优缺点:

索引相对比较简单,等距分割即可;但是缺点就是数据库中范围搜索相对较慢,很不高效。而且等距分割,对于餐厅高度不平衡的位置 (市中心和农村),进行等距比较浪费资源。

2. Geohash

Geohash算法就可以解决上面even grid的局限性,Geohash是将二维地理坐标压缩成base32一维字符作为ID来保存一个区域信息,这个Geohash是通过01决策树编码生成,根据经纬度范围进行决策编码。geohash长度越长,精度越高,通常来说geohash长度达到6位格子的范围就差不多在1km直径范围内,基本满足精度要求。而且这种geohash编码的优点在于向邻近的区域前缀相同可以通过前缀查找的方式来进行

1001 10110 01001 10000 11011 11010 (base32 in binary) → 9q9hvu (base32)

算法流程

目标位置经纬度 -> 进入决策树进行编码 -> 根据一个搜索半径对满足条件的格子的相邻格子进行搜索 -> 根据前缀搜索相邻的格子 ->如果相邻各自餐厅数量不够则继续扩大范围查找直到数量达标为止

优缺点

优点:可以处理区域数据不平衡,密集的位置就细分更多的层数,查找的速度也更快,因为先定位到目标grid后,根据ID前缀可以快速找到附近的相邻grid. (可以通过ElasticSearch, 也可以直接使用Redis GeoHash API进行查询)

缺点:1. 边界问题,两个相邻较近的节点可能不在一个同一个前缀中,这时如果查询可能就需要对整个数据库进行遍历找到临近的位置。或者把这种corner case缓存起来,在下一次查询时可以直接查询。2. Geohash如果hash做更新成本较高,如果你的geohash grid需要根据区域内密度进行一定动态合并或者拆分,那么geohash存储的话你需要对grid对应的所有数据进行逐一更新。

3. QuadTree 四叉树

四叉树的存储思路类似于二维的线段树,每一个节点保存的就是二维区间范围,并且在每一个节点中保存对应的餐厅信息。如果某个节点范围内密度超过阈值,那么就继续细分,这种数据结构存储大大增加了范围设置的灵活性。而且QuadTree本身对于存储大小需求不大,根据下面估计这个QuadTree存储大小大约在5GB以内,完全可以实现在单机内存中维护这个数据结构而无需使用数据库。并且范围搜索也比较快 O(LogN) 

 

优缺点:

优点:1. 便于动态分割,很好的解决区域密度不平衡问题。2.查询,更新操作速度相对较快,资源存储相对较小 3. 可以快速合并,拆分Quad Tree结构,并且范围查询时区间合并不会有GeoHash边界问题。

缺点:1. 数据结构实现较为复杂。2. 如果建立在单机来实现快速响应,对于分布式系统来说,你需要去实现data backup, sharding/partition以及node crash之后数据恢复的问题。

图文引用

  • Bytebytego: https://bytebytego.com/courses/system-design-interview/proximity-service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序面板开发教程|开发照明 Matter 面板步骤(一)

一. 前置知识 前言 出于对 Matter 标准协议及第三方设备接入的可拓展性等方面考虑,照明 Matter 模型面板的功能点定义会与照明的 DP 模型有所不同,因此本文会着重介绍照明 Matter 面板的功能点定义及与 DP 模型的区别,以方便面板小程序开发…

Qt-QLabel 添加图片并设置 GIF 图动态效果

Qt-QLabel 添加图片并设置 GIF 图动态效果 一、添加图片资源并设置图片 选择标签,拖拉到界面上,然后选择器属性 picmap   选择设置,在这里添加图片资源   点击左边的加号符号按钮添加前缀,并设置前缀名,如果已经…

uniapp+renderJS+google map开发安卓版APP非小程序

背景需求 需要在uniapp中接入google地图,研究了一番,都没有找到合适的,现在说一下教程。 效果图 前期工作 这两点缺一不可,否则你啥也看不到。 1、电脑安装L-O-U梯 用于访问G-OO-G-LE的API或者创建google map key。 2、手机安装L-O-U梯 用于显示google地图。我就是手…

数据篇| 关于Selenium反爬杂谈

友情提示:本章节只做相关技术讨论, 爬虫触犯法律责任与作者无关。 LLM虽然如火如荼进行着, 但是没有数据支撑, 都是纸上谈兵, 人工智能的三辆马车:算法-数据-算力,缺一不可。之前写过关于LLM微调文章《微调入门篇:大模型微调的理论学习》、《微调实操一: 增量预训练(Pretrai…

USB 电缆中的信号线 DP、DM 的缩写由来

经常在一些芯片的规格书中看到 USB 的信号对是以 DP 和 DM 命名: 我在想,这些规格书是不是写错了,把 N 写成 M 了?DM 中的 M 到底是什么的缩写? 于是我找了一些资料,终于在《Universal Serial Bus Cables …

xilinx hbm ip运用

AXI-HBM是一个集成的IP核,该核提供高达16个AXI3从PORT的HBM接口,每个使用他自己的独立的时钟。HBM2 GEN存储器也支持,HBM相对传统DDR的方案,带宽得到极大的提高 特征 AXI3从端口存储器接口 -16个独立的256bit存储器接口 -可选的…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析,发现了一些规律: 1)固定的类名令牌为模型的优化提供了强正则化,减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

FreeRTOS学习——接口宏portmacro.h

FreeRTOS学习——接口宏portmacro.h,仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 portmacro版本:GCC/ARM_CM7 portmacro.h是什么 portmacro.h头文件,用于定义与特定硬件平台相关的数据类型和常量。 在移植过程中,…

stm32 keil有一些别人的工程在你这打开为什么会乱码?如何解决的

因为别人编辑代码使用的编辑器和你的不一样,要更正可以调一下自己的翻译器编码格式 也可以直接换掉文件的格式, 用记事本打开文件,然后点会另存为,下面有个编码格式选择,换成你自己的就行

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件(Component)角色2.2 具体构件(Concrete Component)角色2.3 装饰(Decorator)角色2.4 具体装饰(Concrete Decorator)角色2.5 测试 结…

【鸿蒙HarmonyOS NEXT】用户首选项Preference存储数据

【鸿蒙HarmonyOS NEXT】数据存储之用户首选项Preference 一、环境说明二、Preference运作机制三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、Preference运作机制 应用场景: 用户首选项为应用提…

在mac中如何使python3作为默认版本

在系统中同时安装了Python 2和Python 3,且二者的执行文件分别是python和python3。如果你执行python --version看到的是Python 2的版本,而执行python3 --version看到的是Python 3的版本,这表明系统能够正确区分两个版本。 如果你希望使用Pyth…

模型Alignment之RLHF与DPO

1. RLHF (Reinforcement Learning from Human Feedback) RLHF 是一种通过人类反馈来强化学习的训练方法,它能够让语言模型更好地理解和执行人类指令。 RLHF 的三个阶段 RLHF 的训练过程一般分为三个阶段: 监督微调(Supervised Fine-Tuning,…

TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南

引言 随着对大型语言模型 (LLM) 的需求不断增长,确保快速、高效和可扩展的推理变得比以往任何时候都更加重要。NVIDIA 的 TensorRT-LLM 通过提供一套专为 LLM 推理设计的强大工具和优化,TensorRT-LLM 可以应对这一挑战。TensorRT-LLM 提供了一系列令人印…

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。 该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。 说明:OverallAuth2.0 是一个简单、易懂、功能强…

基于物联网技术的智能运动检测仪设计(微信小程序)(230)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发工具的选择【1】设备端开发【2】微信小程序开发…

9.22学习记录

进程间通信方式 管道、有名管道、共享内存、消息队列、信号、信号量、套接字 JVM内存模型 私有:程序计数器、本地方法栈、虚拟机栈 公有部分:堆、方法区 equals和hashcode有什么区别和联系? equals默认比较两个对象的引用,但…

YOLOv8——测量高速公路上汽车的速度

引言 在人工神经网络和计算机视觉领域,目标识别和跟踪是非常重要的技术,它们可以应用于无数的项目中,其中许多可能不是很明显,比如使用这些算法来测量距离或对象的速度。 测量汽车速度基本步骤如下: 视频采集&#x…

记录一次ubuntu /mysql/redis/nginx等 系统安装

没想到还会做一次系统安装配置类的工作,没办法,碰到问题了,总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包,用UltraISO做安装盘,到服务器上修改了下启动顺序,ubuntu的安装非常简单&a…

算法打卡:第十一章 图论part05

今日收获:并查集理论基础,寻找存在的路径 1. 并查集理论基础(from代码随想录) (1)应用场景:判断两个元素是否在同一个集合中 (2)原理讲解:通过一个一维数组…