尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
地图APP网络优化全链路拆解:从HTTPDNS到弱网传输策略
地铁车厢里信号只剩一格你打开高德想查一趟换乘路线结果地图瓦片转圈转了二十多秒路线始终刷不出来。这种场景我猜每个人都遇到过——地图类APP对网络的敏感程度远远超过刷短视频和聊微信。短视频卡了还能等等地图卡了是真的会让人原地崩溃。但很多人没想过的是从你点下高德图标到路线出现在屏幕上中间隔着一整条网络链路DNS解析要找到服务器IPTCP连接要建立会话TLS握手要确认加密通道然后业务请求发出、数据回包、客户端渲染。任何一环在弱网环境下出问题最终都会变成用户看到的转圈和白屏。这篇就以高德APP为例把从DNS到弱网的全链路优化思路拆开聊聊覆盖的原理和实操方案对任何重网络业务的应用都适用。适合移动端开发、网络基建工程师以及对性能优化感兴趣的客户端从业者参考。1. 地图场景的网络难点为什么常规优化手段不够用1.1 地图业务对网络的“苛刻”要求地图类应用和其他类型的APP不一样它对网络的需求可以用“又碎又急”来形容。碎是因为每次操作产生的都是一堆高频短请求拉瓦片、查路线、搜地点、上报位置一个完整导航流程可能要产生几十次甚至上百次网络交互急是因为用户对延迟的容忍度极低路线规划多等两秒人可能就切到别的APP去了。更麻烦的是地图应用的主要使用场景恰好集中在弱网高发区地下车库、隧道、高架桥下、地铁车厢、偏远郊外。这些地方要么信号弱要么基站拥堵要么存在频繁的基站切换。还有一点容易忽略——苹果手机在弱网环境下定位精度会明显下降因为辅助定位需要从网络同步星历和基站信息网络差的时候连“你在哪”都可能很久算不出来。这也是地图场景网络优化的特殊之处它不是单纯优化“能不能联网”而是要同时保证“网络通、定位准、地图出得来”。1.2 全链路优化的整体思路全链路优化的核心是把一次网络请求从发起到渲染的完整路径拆解开每一段都做度量、做优化、做兜底。一条典型链路的环节是这样的DNS解析把域名解析成服务器IPTCP建连三次握手建立传输通道TLS握手协商加密参数确认身份请求排队与发出业务层构造请求等待可用连接服务端处理与回包网关转发、业务逻辑处理客户端收包与渲染数据到达后解析、展示每一环都有各自的坑。DNS环节可能被污染、解析慢TCP/TLS环节在弱网下握手开销被成倍放大请求环节可能出现超时、重试风暴收包渲染环节可能因为数据量大导致缓慢。全链路优化的优先级我个人的建议是先解决“能不能访问”再解决“访问得够不够快”最后解决“体验够不够顺”。换句话说DNS容灾和连接兜底永远排第一位性能调优排在后面因为做得再快一旦断网没有备用方案一切都是零。另外还需要注意现在很多用户的访问路径是从微信小程序、H5页面、广告落地页跳转到高德APP的。跳转本身通过Universal Link或URL Scheme实现但跳转完成后的冷启动阶段APP要重新初始化网络栈、重新解析域名、重新建立连接如果没做快速预热用户会明显感觉到“跳过来了还要卡几秒”。这条链路也值得纳入全链路优化的范畴。2. DNS解析层优化把“找到服务器”的时间先砍下来2.1 一次DNS解析到底发生了什么先捋一下DNS解析的基本过程因为很多优化手段都是围绕它的机制设计的。客户端拿着域名去问本地配置的DNS服务器也就是Local DNS通常由运营商下发Local DNS自己没缓存的话会替客户端去问根域名服务器根服务器告诉它“去问顶级域服务器”顶级域服务器告诉它“去问权威服务器”最后权威服务器返回真正的IP记录。这个递归查询过程在理想网络下通常只需要几十毫秒但移动网络下掺杂了丢包、超时、服务器过载之后耗时就不可控了。移动网络下的DNS问题尤其多。最常见的三类Local DNS被污染或劫持返回错误的IP或者直接不响应运营商Local DNS的缓存策略不透明域名刚换了IP用户侧还在用旧IP一些地区的Local DNS不支持某些新功能比如EDNS Client Subnet导致DNS调度不精准明明用户在北京解析到了一个南方机房。顺带一提做服务端开发或自建DNS调度的团队应该对Unbound这类开源递归解析器不陌生。自建递归DNS可以精确控制缓存策略、上游转发规则、性能指标但对移动端APP的用户而言他们用的是运营商下发的Local DNS服务端再折腾也管不到用户手机上的解析链路。所以客户端侧的DNS优化思路是尽量绕开Local DNS。2.2 为什么HTTPDNS几乎是大型APP的标配DNS优化领域公认的成熟方案是HTTPDNS。原理很简单客户端不再走系统默认的Local DNS解析域名而是通过HTTP请求直接访问服务商提供的DNS接口拿到目标域名的IP列表。这个方式从根本上绕开了Local DNS被劫持、被污染、缓存不准确的问题。HTTPDNS的核心优势有三个。第一是防劫持走HTTP接口拿到的是明文IP之后客户端直连这个IP中间没有Local DNS插手第二是精准调度HTTPDNS服务商可以根据客户端的出口IP、运营商、地理位置等信息返回最合适的机房IP第三是容灾可控客户端可以自由决定IP列表的缓存、更新和切换策略而不是被系统DNS缓存牵着走。但HTTPDNS不是拿来就能用的里面有不少坑证书校验问题。客户端用IP直连后HTTPS证书校验会失败因为证书是签给域名的。解决办法是在TLS握手时通过SNIServer Name Indication带上域名同时还必须在HTTP请求的Host头里带上真实域名。容灾问题。HTTPDNS服务本身挂掉怎么办一定要有回退机制自动降级到系统DNS解析否则就是全网事故。调度准确性问题。有些大众IP段会被误判地理位置导致解析到远距离机房。需要建立IP库的反馈纠错机制。缓存与时效性的平衡。HTTPDNS返回的IP列表通常在服务端设置TTL但客户端本地也要有缓存策略不能每次请求都去打HTTPDNS接口否则HTTPDNS本身就成了性能瓶颈。实操中的做法是冷启动或网络状态变化时触发一次批量解析把核心域名API域名、图片域名、上报域名的IP列表一次拿全缓存到本地业务请求时优先走HTTPDNS的结果缓存过期但请求失败时先切换IP列表里的其他IP再不行才走系统DNS解析。这个降级链路一定要测清楚线上出过的事故里很大比例都是HTTPDNS降级逻辑有BUG导致的。2.3 解析层的实操调优清单除了引入HTTPDNS还有一堆DNS相关的细节点值得打磨。预解析。冷启动时预先把核心域名的IP拿到手避免用户第一次点击时现场解析。预解析的时机很关键建议放在网络栈初始化和首屏基础数据加载之间。现在很多网络库也支持异步预解析配置好域名列表就行。TTL调优。服务端TTL是通用的客户端可以结合业务场景覆盖。地图类应用对IP变化敏感度低但对解析速度敏感所以核心域名的本地缓存时间可以比服务端TTL长一些比如服务端给60秒客户端可以缓存到5分钟只要做好IP容灾风险可控。IPv6准备。移动网络IPv6覆盖已经非常普遍了DNS解析要支持AAAA记录解析网络库要支持双栈选路。现在腾讯云、阿里云都有IPv6公共DNS像2400:3200::1、2402:4e00::这类地址。但从APP的角度看更应该关注的不是公共DNS地址而是自己HTTPDNS服务对IPv6的兼容性。关于公共DNS的选择。很多人纠结DNS用4.2.2.1还是114.114.114.114这其实是开发环境和测试环境的选择题。开发阶段用这些公共DNS确实能避开运营商DNS的坑但对线上用户没什么意义——你不能指望用户去改手机上的DNS设置。客户端线上解析问题主要靠HTTPDNS解决公共DNS通常只在服务端做兜底或开发联调时用。3. 连接层优化别让握手吃掉你省下来的时间3.1 TCP/TLS握手在弱网下的“放大器”效应DNS解析拿到IP之后紧接着是建立连接。这个环节的成本经常被低估。一次完整的HTTPS请求TCP三次握手需要2个RTTTLS 1.2握手需要额外的2个RTT加在一起差不多4个RTT也就是请求还没发出去光握手就走了4轮网络往返。在WiFi环境下一个RTT可能只要10毫秒4个RTT也就是40毫秒感知不到。但在移动弱网环境下RTT可能飙升到200毫秒甚至更高偶尔还会伴随丢包。4个RTT就是800毫秒以上如果中间某次握手包丢了触发重传直接奔着1.5秒去了。用户感受就是“点了路线规划转圈转了好久”。对于地图这种高频短请求场景握手开销的放大效应更加明显。导航过程中每隔几秒就要拉一次路况或瓦片数据如果每个请求都新建连接握手弱网下基本没法用。所以连接层的第一要务是最大化连接复用。3.2 连接复用与连接池的调优实操企业级应用基本都有成熟的网络库Android的OkHttp、iOS的NSURLSession都内置了连接池机制。关键是把连接池参数调对。OkHttp的默认配置里每个域名的最大并发请求数是5空闲连接保活时间是5分钟连接池最多保存5条空闲连接。这些值在不同的业务场景下需要调优比如地图场景下瓦片请求并发量高可以适当调高maxRequestsPerHost如果App会频繁后台上报可以把keepAlive时间适当延长避免每次都重建连接。Android OkHttp关键参数maxRequestsPerHost同域名最大并发、keepAliveDuration空闲连接保活时长、maxIdleConnections空闲连接池上限iOS NSURLSession关键配置同时系统管理连接池开发者更多控制的是HTTP/2的多路复用以及请求优先级连接失效的问题同样值得注意。移动网络环境频繁切换WiFi切4G、4G切5G旧连接在新网络下会失效继续用会导致请求卡住并超时。客户端需要监听网络状态变化在网络切换时主动清理连接池避免旧连接的“僵尸请求”占用资源。iOS可以用NWPathMonitorAndroid用ConnectivityManager一旦检测到网络路径变化立即标记现有连接不可用。TLS层面如果能支持TLS 1.3务必优先开启。TLS 1.3把握手压缩到1个RTT而且支持0-RTT会话恢复对重复连接场景的体验提升非常明显。地图APP里的路线查询这类幂等GET请求非常适合0-RTT。当然0-RTT有重放攻击风险服务端要做幂等校验和重放防护。4. 弱网传输优化把不可控的网络变得可预期4.1 到底什么才算“弱网”很多刚接触弱网优化的同学以为弱网就是网速慢其实弱网包含四个独立的维度维度表现对体验的影响高延迟RTT高请求往返慢页面加载慢操作响应延迟高丢包数据包丢失触发重传吞吐量暴跌连接不稳定低带宽传输速率低大资源加载极慢抖动大RTT忽高忽低缓冲与卡顿体验不稳定不同的应用场景对弱网的容忍度不同。地图场景比较特殊导航过程中大概率经历“信号满格但带宽很低”或者“带宽不错但延迟很高”的混合弱网。所以客户端的优化方案不能只针对单一维度而是要做一套动态应对机制感知当前网络质量然后决定走缓存还是走网络、是等还是重试、要不要降低图片质量。4.2 超时、重试与请求调度策略弱网优化的核心矛盾在于请求发出去后到底等多久才认为它失败了等太短容易误杀慢速但正常的请求等太长用户已经没耐心了。我个人在实践中的做法是把超时拆成三个层级连接超时、读超时、总超时。连接超时要短弱网环境3秒内连不上基本就是没戏了读超时可以放宽根据接口的重要性从5秒到15秒不等总超时用来兜底防止慢请求无限拖累用户体验。这里的关键是超时参数不要写死而是根据网络状态动态调整。WiFi下用一套值弱网下用另一套值弱网模式下超时时间甚至可以放宽一些因为此时网络本身就是慢的放宽超时反而能提高成功率。重试策略是另一个重灾区。我见过不少项目因为重试逻辑设计不完善弱网时同时发出几十个重试请求直接把服务端打挂——这就是重试风暴。规范的做法是只有幂等请求才能自动重试每轮重试采用指数退避比如1秒、2秒、4秒、8秒并且加上30%以内的随机抖动避免多个请求同时重试造成惊群效应设置最大重试次数通常2到3轮就够全局做请求并发限流弱网模式下只允许有限个请求同时飞出去其他请求排队等待。另外地图APP里有很多请求是可以“丢弃”的比如用户快速拖动地图时产生的瓦片请求后面的请求大概率会覆盖前面的结果。对这种请求要做优先级队列管理低优先级的请求在网络紧张时可以直接取消腾出资源给路线规划这类高优请求。4.3 数据面优化少传数据就是最好的弱网优化同样的带宽条件下传的数据越少用户等待时间越短。数据面优化的收益在弱网下尤其明显。第一层是协议层的优化。JSON虽然可读性好但冗余字段多一个简单的路线响应动辄几KB甚至几十KB。换成Protobuf或者MsgPack这类二进制序列化格式数据体积能缩小30%到50%解析性能也更快。代价是调试复杂度上升需要配套序列化工具和日志脱敏方案。第二层是HTTP传输细节。开启gzip / Brotli压缩精简响应头字段服务端配合做字段裁剪——只返回客户端真正要用的字段别把所有可能的数据都堆在响应里。第三层是地图业务特有的优化体现在地图瓦片技术上。高德地图这类应用很早就从传统位图瓦片转向了矢量瓦片。位图瓦片是图片一张几KB到几十KB放大缩小还要换一个层级重新下载矢量瓦片本质是数据体积更小而且支持任意缩放级别平滑渲染。同等网络条件下矢量瓦片加载速度明显优于位图瓦片。这就是为什么你打开高德觉得地图出图快背后是数据格式选型在起作用。图片优化同理。地图应用里的路况图、实景图、商户照片建议走CDN缩略图服务按需裁剪尺寸同时采用WebP这类高压缩率格式。弱网模式下直接把图片质量等级降下来用户虽然会看到稍微模糊的图但至少图能加载出来体验远好于一直转圈。4.4 缓存与离线弱网下最后的底牌无论怎么优化网络链路弱网环境总有请求发不出去的时候。这时候缓存和离线能力就是保命底牌。地图场景的缓存策略讲究分级内存缓存App运行期间生效适合高频访问的热瓦片和当前路径数据磁盘缓存持久化保存网络异常时优先读取数据库缓存适合结构化数据比如历史搜索记录、收藏地点离线包提前下载的城市基础地图数据、导航数据无网也能用缓存的命中策略要设计成“弱网优先走缓存”检测到网络质量差时先返回磁盘缓存的旧数据给用户看再异步刷新新数据。很多地图APP的路线规划就采用这种策略——先展示上一条可行的路线同时后台重新请求最新路况避免用户对着空白屏幕干等。离线地图功能高德也做了很久。用户提前下载某个城市的离线地图包后即使在地铁隧道里信号全无地图基础显示、路线规划和语音导航依然可以工作。离线包的设计要考虑增量更新机制不能每次版本更新都让用户重新下载几百MB的数据。5. 可观测性建设与弱网模拟工具链5.1 没有指标就没有优化全链路埋点怎么建网络优化最忌讳拍脑袋。我见过不少团队上来就说“我们的网络慢”但问慢在哪一环答不上来。没有全链路的耗时拆解数据优化就是无头苍蝇。正确的做法是在网络层做分阶段埋点。以一次HTTPS请求为例至少需要统计这几个指标DNS耗时从开始解析到拿到IP的时间连接耗时TCP建连时间TLS握手耗时SSL握手时间TTFB首字节时间请求发出后到收到第一个字节的时间内容下载耗时收到首字节到完整接收的时间这些指标要按网络类型WiFi、4G、5G、运营商移动、联通、电信、地域、App版本做聚合分析。对比不同网络类型下各阶段耗时占比能很快定位瓶颈如果4G下DNS耗时占比很高说明HTTPDNS或公共DNS调度有问题如果TTFB在弱网下特别高可能是服务端处理慢或者小包拥塞控制没有优化。线上弱网诊断信息也很重要。客户端在检测到网络异常时把当时的信号强度、当前网络类型、RTT估算值、丢包率、正在进行中的请求列表上报到服务端以半衰期分组聚合能为线上问题排查提供宝贵的现场证据。5.2 弱网模拟实操从Fiddler到专业工具弱网优化能不能验证效果取决于模拟得够不够真实。这里分享一套从易到难的模拟工具配置。先说最常用的Fiddler。Fiddler本身自带弱网模拟能力菜单栏Rules → Performance → Simulate Modem Speeds打开后相当于模拟56K拨号上网的延迟和带宽效果非常夸张适合快速验证功能在极端弱网下是否会崩。但这个开关太粗暴了更精细的做法是修改Fiddler自定义脚本在OnBeforeRequest中给请求加延迟模拟不同的上下行带宽和丢包。比如加这么一段static function OnBeforeRequest(oSession: Session) { // 模拟 300ms 额外延迟实际值可根据场景调整 oSession[request-trickle-delay] 300; if (oSession.HostnameIs(ditu.amap.com)) { // 某个域名单独模拟弱网 oSession[request-trickle-delay] 800; } }Fiddler的弱点在于模拟的是“代理模式”和真实移动网络的信号波动、基站切换还是有差距。更接近真实环境的做法有iOS真机用Xcode自带的Network Link Conditioner可以配置延迟、带宽和丢包参数Android模拟器模拟器设置里自带网络限速选项或者用Emulator的冷启动参数限速专业一点的团队用弱网测试硬件设备或者开源工具比如网络损伤仪在WiFi环境里模拟真实的网络劣化弱网测试的参数建议覆盖这几个档位场景延迟丢包率带宽正常4G40ms0%30Mbps弱信号4G150ms3%2Mbps地铁隧道300ms10%500Kbps极端弱网800ms以上30%100Kbps以下每个档位都要跑核心链路用例启动、搜索、路线规划、导航、瓦片加载。弱网优化不是功能开发做完一遍就完了它是持续迭代的过程每次发版前都要回归。5.3 Linux下的DNS配置坑开发环境的隐形地雷顺带说一个开发环境常踩的坑。线上的DNS链路优化得再好开发环境DNS配不对联调效率照样受影响。Linux下修改DNS最经典的问题是直接改/etc/resolv.conf重启网络服务或重启机器后又被还原了。原因很简单NetworkManager或systemd-resolved会接管resolv.conf手动写的配置会被覆盖。正确的做法是找到DNS配置的真正来源。用NetworkManager管理的系统要在网络连接配置里改DNS用systemd-resolved的环境要用resolvectl命令或者编辑/etc/systemd/resolved.conf。如果只是临时生效nmcli命令比直接改文件靠谱得多nmcli connection modify 有线连接 ipv4.dns 114.114.114.114,223.5.5.5 ipv4.ignore-auto-dns yes nmcli connection up 有线连接这不仅仅是个开发效率问题。如果你在写DNS相关代码环境不对很容易出现“我配置了新的DNS却完全不生效”的假象浪费大量时间。6. 常见问题与排查技巧实录做了这么久的网络优化攒了不少问题排查的经验整理成一张速查表分享出来现象可能原因排查思路部分用户出现“DNS解析失败”HTTPDNS服务异常或覆盖不全看用户是否已降级到系统DNS检查HTTPDNS接口返回HTTP状态码和签名校验换了IP后部分请求仍然失败连接池保留了旧连接监听网络切换事件主动清理连接池检查HTTPDNS的IP列表刷新机制弱网下请求大量超时且触发重试风暴超时参数过短重试策略无退避调大读超时重试改用指数退避抖动限制全局并发数地图瓦片加载慢图片一卡一卡图片未走CDN缩略图或格式仍为JPEG/PNG检查CDN URL是否带尺寸参数图片改用WebP弱网降级清晰度IP直连后HTTPS证书校验失败证书绑定域名客户端用IP直连导致校验不匹配必须配置SNI字段携带域名同时保证Host头正确苹果手机定位慢且漂移辅助定位依赖网络同步星历弱网下定位数据拉取失败网络层预取定位辅助数据弱网下尽快降级纯GPS定位Linux环境改了resolv.conf重启被还原NetworkManager覆盖了配置文件用nmcli或在NetworkManager配置中修改DNS切勿手改resolv.conf再补充一个证书相关的案例。做服务端开发的同学可能遇到过Lets Encrypt证书申请时提示DNS验证失败比如日志里出现“during secondary validation: dns problem”之类的报错。这个问题的本质是证书颁发机构在验证你的域名所有权时去查权威DNS拿不到对应的TXT记录。大概率是你的DNS服务商界面里还没生效或者TTL缓存还没过期。排查步骤就三步确认TXT记录已经正确添加、确认权威DNS的数据和运营商Local DNS一致、确认验证请求是从海外网络发起的节点。这类验证问题和APP客户端的DNS优化是一个道理——DNS链路每一环都会出幺蛾子。最后说说我的一点体会做了这么多年客户端网络优化最深的一个感受是网络问题永远不会被“某一次重构”彻底解决。链路太长参与的角色太多网络环境又千变万化本质上是在做一场持续博弈。DNS被污染了就用HTTPDNSHTTPDNS挂了就回退系统DNS弱网超时了就不重试重试了就要退避数据传不完了就压缩、就缓存、就降级。每一步都在验证一个朴素的原则能少传就少传能复用就复用实在不行也要有保底方案。如果你所在的团队刚开始做网络优化我建议先把监控埋点建好搞清楚自己的请求每一环到底耗了多少时间再动手优化。没有数据的优化等于闭着眼开车。等指标跑起来了你会发现优化的优先级自己就浮出水面了——很多时候瓶颈根本不在你以为的地方。
RELATED

相关推荐

Transformer完全拆解:从注意力机制到大模型基石

Transformer完全拆解:从注意力机制到大模型基石

2017年,谷歌机器翻译团队发表了一篇标题相当“霸气”的论文——《Attention Is All You Need》。当时NLP圈的主流还是LSTM、GRU这类循环神经网络,结果这篇论文直接放话:RNN和CNN都不用了,只用注意力机制就足够了。七年多过去&…

📅 2026/9/16 23:40:27
OpenCV帧间差法实现运动检测

OpenCV帧间差法实现运动检测

1. 帧间差法原理与OpenCV实现帧间差法(Frame Difference)是运动检测中最基础也最直观的方法之一。它的核心思想非常简单:通过比较连续两帧或三帧图像中像素值的变化,来检测场景中的运动区域。这种方法计算量小、实时性好&#xff…

📅 2026/9/16 23:40:27
PHM健康评估建模指南:从数据特征到HI分数与阈值标定

PHM健康评估建模指南:从数据特征到HI分数与阈值标定

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/16 23:40:27
MORE NEWS

更多资讯

📰

Linux信号机制:原理、实战与性能优化

1. Linux信号机制深度解析:从原理到实战信号(Signal)作为Linux系统中进程间通信的重要机制,已经伴随Unix/Linux系统走过了半个世纪。这种软件层次的中断模拟机制,在系统编程中扮演着关键角色——当我在处理一个耗时计算…

📰

牛顿-拉夫逊法三相潮流计算程序开发与实践

1. 三相潮流计算程序概述在电力系统分析领域,三相潮流计算是最基础也是最重要的计算工具之一。我开发的这个基于牛顿-拉夫逊法的三相潮流计算程序,主要用于解决电力系统稳态运行分析中的各类计算问题。不同于教科书上的简化示例,这个程序针对…

📰

光模块TEC温控设计:从选型到验证的工程实践指南

1. 为什么光模块必须配TEC——不是“要不要”,而是“怎么配才不翻车”光模块里的TEC(Thermoelectric Cooler,热电制冷器),常被当成一个可有可无的“高级配件”:有些厂商宣传“全温范围工作”,就…

📰

Invalid default_text_model ‘auto‘ 报错?TaoToken 下这样指定 provider

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Mac终端Git账号密码设置与清除完全指南

Mac 终端里 Git 突然要账号密码,多半不是什么好兆头:可能是你换了电脑,可能是公司要求换 token,也可能只是你密码输错太多次被缓存了。我在 Mac 上处理这类问题次数不少,从 git push 弹出钥匙串窗口,到明明…

📰

树和堆:从完全二叉树到优先队列的算法进阶

把树和堆放在同一个标题里,其实不是偷懒,它们本来就是一对需要放在一起理解的搭档。我在准备数据结构期末考试、考研专业课和大厂算法面试的时候,都会把树和堆归成一类来复习。树给出了递归结构的骨架,堆则在这套骨架上实现了最简…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬