"一旦你明白一个Heap解决的行为, 你会开始注意到它到处。" 在上篇文章中,我们学会了如何识别希普问题.
我们学会了问: 如果答案是"是",那么一个Heap常常值得考虑.
现在让我们来看看这个想法在真正的软件系统中是如何出现的。
这篇文章不是关于学习另一个数据结构的.
这是关于学习识别一个工程模式。
许多系统背后的共同模式 虽然骑行共享应用,操作系统,游戏平台,以及医院似乎完全不同,但它们往往解决了相同的根本问题.
每当这种循环连续地重复,一头花常成为自然的选择.
让我们来探讨几个例子。
设计模式1: CPU 排程 一个操作系统可能有上百个程序等待执行.
排程器不断问:概念上:注意排程器并不需要完美订购的每一个过程.
它只需要下一个。
设计模式2:"骑行任务" 想象顾客要求搭乘.
附近有几个司机。
平台评估的因素包括: 距离可用性 估计到达时间 业务规则 然后它问: 每一次新的骑行请求都重复同样的决定.
设计模式3:背景任务排程现代应用程序在背景中执行许多任务.
例如:发送电子邮件处理图像 生成发票 创建报告 工人反复询问:平台持续选择下一个最重要的工作.
设计模式4:医院急诊室患者全天到来.
医生不会简单地按到来顺序治疗病人.
相反,他们问:同样的工程行为再次出现.
设计模式5:监测和事件管理生产系统产生上千个警报.
有些是宣传。
另一些国家则指出严重失败。
一个事件管理平台再三问:突发事件自然向上移动.
设计模式6:Live Leaderboards Gaming平台不断得到新分数.
玩家不断加入,离开,并不断改进.
该系统反复确认: 排名随着分数变化而不断演变.
注意图案 乍一看,这些系统看起来并不相关。
但是如果我们忽略了商业领域,它们都遵循同样的设计.
这是Heap用来支持的行为 像软件工程师一样思考 初学者常常会记住一些例子 例如:排程器中使用了堆积.
堆积被用在领导板上.
堆积被用在了乘分上.
经验丰富的工程师们的想法不同.
他们问道:"这是另一个反复选择下个最佳候选人的系统吗?" 如果答案是肯定的,他们自然地开始考虑一个Heap.
域无所取.
行为确实如此。
常见的"初学者错误"(Beginner Mistakes Mistakes Mistake 1)——回忆应用程序取而代之"模式"(Patterns),不要试图记住每一个使用"Heap"的系统.
学习基本的行为 错误2 — 假设每个优先系统需要一个堆积 A 堆积是一个可能的解决方案.
正确的选择总是取决于一整套要求。
在选择数据结构之前先了解问题.
错误3——忽略了"商业规则""Heap"并不决定"最佳"的含义.
你的商业逻辑是。
同样的Heap可以优先排序:最高得分,最早的最后期限,最短的休息时间,最接近的车手,或最严重.
错误 4 —— 认为"域"是"重要的"共享","银行","游戏"和"保健"看起来不同.
从工程学的角度来看,他们中许多人解决了完全相同的问题.
专注于行为,而不是行业。
设计模式摘要 每当看到一个系统反复询问:或者在考虑类或算法之前暂停.
先辨出行为.
如果系统连续从许多选项中挑选出最佳候选人,你就会看到典型的优先权选择问题.
这是你设计中最强烈的信号之一.