【问题标题】:Finding max key in an unordered_map in c++在 C++ 中的 unordered_map 中查找最大键
【发布时间】:2017-07-19 01:06:45
【问题描述】:

这个问题与this 问题相似,但我需要在 unordered_map (hashMap) 而不是地图中找到它。由于 unordered_map 中的元素显然是无序的,我不能使用类似问题中提到的逻辑。

那么,有没有办法(除了顺序迭代)来找出 unordered_map 中的最大键?也就是说,最好在O(1)O(logN) 而不是O(n)?

谢谢!

【问题讨论】:

  • 简答:不,没有。

标签: c++ hashmap unordered-map


【解决方案1】:

不,就其本质而言,无序地图无法轻易提供其最大值,因此,如果您只有无序地图,则必须按顺序搜索。

但是,没有什么能阻止您提供您的 自己的 类,该类派生自(或包含)无序映射并向其添加功能。在伪代码中,包含类可能类似于:

class my_int_map:
    unordered_int_map m_map;  # Actual underlying map.
    int m_maxVal = 0;         # Max value (if m_count > 0).
    bool m_count = 0;         # Count of items with max value.

    int getMaxVal():
        # No max value if map is empty (throws, but you
        # could return some sentinel value like MININT).

        if m_map.size() == 0:
            throw no_max_value

        # If max value unknown, work it out.

        if m_count == 0:
            m_maxVal = m_map[0]
            m_count = 0
            for each item in m_map:
                if item > m_maxVal:
                    m_maxVal = item
                    m_count = 1
                else if item == m_maxVal:
                    m_count++

        return m_maxVal

    addVal(int n):
        # Add it to real map first.

        m_map.add(n)

        # If it's only one in map, it's obviously the max.

        if m_map.size() == 1:
            m_maxVal = n
            m_count = 1
            return

        # If it's equal to current max, increment count.

        if m_count > 0 and n == m_maxVal:
            m_count++
            return

        # If it's greater than current max, fix that.

        if m_count > 0 and n > m_maxVal:
            m_maxVal = n
            m_count = 1

    delIndex(int index):
        # If we're deleting a largest value, we just decrement
        # the count, but only down to zero.

        if m_count > 0 and m_map[index] == m_maxVal:
            m_count--
        m_map.del(index)

这是对某些集合的标准优化,因为它提供了对某些属性的惰性求值,同时仍然缓存它以提高速度。

O(n) 搜索只有在您删除当前最高值的最后一项时才会发生。

所有其他操作(获取最大值、添加、删除当不是最终最大的项目)使用O(1) 成本更新最大值。

【讨论】:

  • 感谢您的回答。 :)
猜你喜欢
  • 1970-01-01
  • 2016-11-15
  • 2017-04-08
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
相关资源
最近更新 更多