【发布时间】:2021-08-11 00:00:56
【问题描述】:
干杯,我正在尝试找到一种算法/数据结构,我可以使用它来按频率对元素进行排名。
例如,假设我有 5 个名字,我想根据它们的频率对它们进行排名。我被连续命名,并且我执行的每个插入和查询都必须在 O(log(n)) 时间内完成,其中 n 是给定名称的数量。
例如,假设我得到了:
- “富”
- “酒吧”
- “酒吧”
- “流行”
- “富”
- “酒吧”
那么,排名第一的应该是“bar”(3次),第二=>“foo”和第三个“pop”。请记住,当两个或多个元素具有相同的频率(和相同的排名)时,我返回的都是正确的。
我尝试使用 Map (Hash) 来保持给出字符串的频率,例如,如果给定 "foo" 我可以返回 3(但不是排名),甚至考虑使用 Set (使用 AVL 树)以按频率排列它们,但我再次无法在对数时间内将其转换为 Ranking 数据结构。有什么想法吗?
【问题讨论】:
-
无论我使用哪种数据结构,我插入到数据结构中的任何内容都必须是 O(logn)。这会自动拒绝许多选项。链表选项不是我可以使用的,因为例如给定键 = 2(所以我应该返回频率 = 2 的字符串),我必须从频率为 1 的节点传递,所以查询变为O(n)。
-
假设您指的是我的(现已删除的评论),我最初阅读 O(n)
-
您可以维护两棵 avl 树,一棵按名称排序,一棵按频率排序。将新名称插入“名称”树时,也将新节点插入“频率树”。频率节点保存频率。如果要插入的名称已经存在,则增加其在频率树中的频率并更新频率树。名称和频率节点都必须存储对彼此节点的引用。
-
实际上,仔细想想,您只需维护一个带有名称的 avl 树。节点存储名称和频率。此外,您在某处存储对具有最大频率的节点的引用(或者可能只是名称)。对于每次插入,您检查名称是否已经存在,如果存在,您只需增加其频率。对于每次插入,检查频率是否大于“最大频率节点”的频率并相应更新。
-
是的,它没有,我的错。忘了你需要得到实际排名....已经晚了..
标签: c algorithm data-structures