java - 我想要有效的数据结构来存储项目及其计数并搜索其中的最小值?
问题描述
我想要有效的数据结构来存储项目及其计数并搜索其中的最小值?
我有许多项目,以及每个项目的计数,我想要一个数据结构来存储项目及其计数。在我的脚本中,每次我都会搜索一个项目并更新它的计数,我也想找到具有最小计数的项目,有时我想要一些项目的计数。你能告诉我在低空间和低成本搜索操作中使用哪种数据结构?
解决方案
您有相互冲突的请求。
您希望通过键(名称、项目编号、ID 等)快速查找项目 您希望通过现有数量(计数)快速查找项目
由于可能的最快查找可能类似于具有 O(1) 查找的地图,因此问题是“您将使用哪个键?” 计数是冲突的,所以你会得到比理想的 O(1) 少一点;并且,名称或 ID 将意味着您必须查找大量物品才能获得少量物品。
这意味着您需要两个数据结构。
一个是名称/id 到项目的典型映射。一个是数量索引到具有该数量的项目列表。
这意味着您必须同时更新这两种数据结构,以使您的数据在应用程序中保持一致。
然后你想有效地提取项目列表。好吧,我们不知道您的列表是否稳定,或者可能是随机选择的,所以我会逐项检查列表。如果您知道您有稳定、长期(重用)的列表,那么另一种方法可能会更好。
我希望你能读懂这篇评论的字里行间。不考虑用例就没有“高效”的数据结构。虽然您已经表明您知道这一点;它还有另一个层次。当您组合多个相互冲突的用例时,有时您会牺牲一个的效率来换取另一个的效率。例如,为了快速查找,您现在需要通过重建另一个不同的数据结构来减少插入/更新时间。
当然,您也可能要求(将来)您的数据结构超出单台机器的容量。如果是这样,您可能会发现您的所有解决方案都不是那么好,因为它们都假设一个内存地址空间。然后你可能不得不转向分布式数据模型,比如 Apache Spark/Hadoop。在那个空间中,构建索引可能不太有意义,因为过滤结果是一项非常便宜的操作,而构建分布式索引可能变得更加昂贵。因此,您可能只是转向“阅读所有条目,丢弃我不想要的条目”,这可能会为您提供良好的服务,具体取决于数据、所需的延迟和实际操作中的使用。
这里的关键是进行基准测试,并知道什么是“足够好”。如果您陷入“最佳”或“最高效”的困境,您将花费更多的钱来快速做出快速的事情。而是设置一些基准,读作“必须在 X 毫秒内从一组(某个数字)返回”,然后构建您的解决方案以击败该规则。
推荐阅读
- c++11 - 模板类中的函数与模板函数
- c - OSX Eclipse CDT 在调试开始时停止:“配置 GDB”
- php - json_encode 将数字添加到结果中?
- node.js - 使用 npm install 时出现错误“ERR_OUT_OF_RANGE”
- graphql - 在 graphQL 查询中传递参数
- mongodb - 如何在连接到 mongodb 的 docker 容器上运行 girder
- wpf - 动态附加/分离 WPF 行为是解决我的问题的有效方法吗?
- google-classroom - 无法检查 Google OAuth 同意屏幕验证过程的状态
- flutter - 在 Future 返回结果后设置一个 offer
- sql - 计算名称是否出现在给定日期下