【问题标题】:Linear Hashing: Fast Method for finding 'min' and 'max'线性散列:查找“最小值”和“最大值”的快速方法
【发布时间】:2015-05-26 00:24:27
【问题描述】:

我为我的线性哈希表实现了一个 min() 和 max() 函数,但我几乎没有性能问题,因为我直接实现了它。 我只是假设找到的第一个元素是最小/混合,然后我将其余元素与它进行比较。有没有更快的方法 在哈希表中找到最小值/最大值?我在我的书中找不到任何东西。 我的第二种方法是将每个值写入一个数组,然后查看它,但我认为这不会更快。

【问题讨论】:

  • 或者,跟踪最小和最大元素,因为项目被插入到表中。
  • @AndyG:这会使删除变得相当昂贵。
  • @BillLynch:每次删除 O(n) 与每次查找 O(n)。无论哪种方式都需要权衡取舍,一切都取决于用例。

标签: c++11 max min


【解决方案1】:

通用哈希表不是元素的排序列表。所以这将是一个O(n) 操作来查找给定表的min()max()

【讨论】:

  • 好的,没有更快的方法了。
【解决方案2】:

与比尔·林奇达成一致,我们必须至少花一次O(n) 时间,但我们可以尽可能地偷懒:

  • minmax 存储在桌子旁边
  • 只要用户正在进行更新,请根据需要更新 minmax
  • 删除时,检查删除的项目是min还是max,如果是,设置一个标志为true,表示最小值或最大值已更改。如果标志已设置,则无需检查当前最小值/最大值
  • 在查找最小值/最大值时,检查您的标志。如果尚未设置,您可以使用缓存的最小值或最大值。如果已设置,请花O(n) 时间再次设置它们。

现在我们只会在需要时花费O(n) 时间,而不是每次有人请求最小或最大时间时花费O(n) 时间。如果插入多于删除,您通常会看到O(1) 查找时间。

【讨论】:

  • 听起来很有趣,我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2012-09-16
  • 1970-01-01
  • 2015-01-16
  • 2022-06-16
相关资源
最近更新 更多