使用哈希图实现优先级队列

用户名

这可能是一个非常幼稚的问题,或者没有任何意义。但是我真的对优先级队列的实现感到困惑。为什么我们不能使用键为优先级,值作为优先级为数据的哈希映射。我在这里缺少一些基本知识吗?例如:如果A的优先级是1,B是3,c是4,我们可以简单地分别将1,3,4作为键,将A,B,C分别作为哈希图的值来实现优先级队列。请说清楚我的逻辑

栾尼科

该实现的问题在于,它没有利用HashMap功能轻松访问给定密钥的任何元素。由于您要排队,因此以后将没有优先级1、3、4,只需找到地图的最高优先级,就必须对其进行完全迭代!

地图的工作方式如下:它创建了一个巨大的数组,在所有位置(非常大)都具有空值。然后,它使用公式来获取您的密钥(通常是字符串或字符串表示形式)并将其转换为数字。一种简单的方法是对每个字母的字符代码求和,尽管这对于地图来说是一个糟糕的选择,但是您可以稍后查找它。然后,它用数组的模数(余数)大小(例如Java中的n%大小)对这个数字加盖,以使其成为数组中的有效位置,然后将元素放在那里。这样,进行密集搜索非常容易,因为您无需搜索,您就知道每个元素的确切位置。

因此,使用Map实现队列将非常耗费内存,而没有HashMap搜索的明显优势。此外,对其进行迭代非常非常昂贵,因为您需要对一个巨大的数组进行迭代,而忽略空值。您不确定实际值在哪里。假设在您的示例中,优先级从0到100。即使您永远不会有100个任务,也要遍历100个位置数组,检查每个位置是否有优先级高的任务。

更好的方法是使用简单列表并将优先级存储在数据中。假设优先级不会随时间变化,那么您只需要在添加时进行一次迭代即可找到正确的位置,并始终访问第一个(或最后一个)元素,即已知优先级最高的元素。

最后一点是性能,即使您添加的搜索时间完全相同,也最好在添加时进行迭代。因为当您搜索最高优先级时,您每次都需要一直走到最后,因为最后一个元素可能是更大的元素。请注意,即使您的键是数字字符串或整数,HashMap也不会将您的项目存储为整齐的新月形顺序。它是专门设计这样做,以避免冲突(有两个类似的对象相同的密钥,因此要求需要一个列表添加到大排列的特定位置)。但是,在添加时,假设您的列表已经订购,则只需进行迭代,直到到达正确的目的地。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打印使用优先级队列排序的哈希图实例

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用链表实现优先级队列

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

如何使用优先级队列实现堆栈?

来自分类Dev

如何使用无序链表实现优先级队列

来自分类Dev

在C ++中实现优先级队列

来自分类Dev

在C ++中实现优先级队列

来自分类Dev

如何使用两个队列实现优先级队列

来自分类Dev

如何使用SQS(Amazon简单队列服务)实现优先级队列

来自分类Dev

如何使用两个队列实现优先级队列

来自分类Dev

使用ArrayList的优先级队列的性能

来自分类Dev

使用ArrayList的优先级队列的性能

来自分类Dev

Java Min Heap优先级队列实现

来自分类Dev

用最小堆实现优先级队列

来自分类Dev

Spring AMQP RabbitMQ实现优先级队列

来自分类Dev

在任务队列中实现消息优先级

来自分类Dev

您如何使用二进制堆来实现优先级队列?

来自分类Dev

仅使用一个堆栈实现优先级队列

来自分类Dev

如何使用Java中的类的字段实现优先级队列

来自分类Dev

您如何使用二进制堆来实现优先级队列?

来自分类Dev

使用用户定义的对象实现最小优先级队列(C ++ STL)

来自分类Dev

如何使用优先级队列实施常规队列?

来自分类Dev

Python:以时间为优先级的优先级队列

来自分类Dev

增加优先级队列中的优先级

来自分类Dev

使用优先级队列合并K排序列表

来自分类Dev

如何对对象使用优先级队列STL?

来自分类Dev

在Haskell中使用树作为优先级队列

来自分类Dev

Dijkstra的算法-如何使用优先级队列或最小堆?