这可能是一个非常幼稚的问题,或者没有任何意义。但是我真的对优先级队列的实现感到困惑。为什么我们不能使用键为优先级,值作为优先级为数据的哈希映射。我在这里缺少一些基本知识吗?例如:如果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] 删除。
我来说两句