【问题标题】:How to get median value in unordered map?如何在 unordered_map 中获得中值?
【发布时间】:2014-09-08 10:39:46
【问题描述】:

我正在尝试为以下无序映射编写排序算法。我已经看到this 的问题,我正在尝试为无序地图实现它,但它不起作用!

注意-我不能使用任何 STL 排序函数。

void quickSort(unordered_map<string, int> map, unordered_map<string, int>::iterator left,unordered_map<string, int>::iterator right) {

    unordered_map<string, int>::iterator i=left;
    unordered_map<string, int>::iterator j=right;
    unordered_map<string, int>::iterator pivot = std::advance(map.begin(), map.size() / 2);

    unordered_map<string, int> tmp;
}

int main(){
    unordered_map<string, int> map;
    map["blah"] = 2;
    map["the"] = 5;
    quickSort(map,map.begin(),map.end());
}

【问题讨论】:

  • 您不能就地对unordered_map 进行排序。您需要将值转移到不同的容器(例如 vector)。
  • @KonradRudolph 有什么理由吗?
  • 只是出于好奇:为什么你根本不允许使用std::sort()?这是某种家庭作业吗?
  • @TobiMcNamobi 我想创建自己的排序算法,然后对其进行优化
  • @Bernard 原因是unordered_map 是无序的。如果您需要详细信息,请查看一些参考/实现。基本上,它使用散列,这使得修改内部存储变得不可能。

标签: c++ algorithm sorting stl unordered-map


【解决方案1】:

如 cmets 中所述,您无法对 unordered_map 进行适当排序,因为它的 value_type 是 std::pair&lt;const Key, T&gt;(注意 const!)对于 unordered_map&lt;Key,T&gt;。这意味着您无法交换地图中的元素,因此您无法对其进行排序。您需要将数据复制到另一个数据结构中,例如向量,然后您可以在其上使用std::nth_element 的一些“本土”版本:

std::vector<std::pair<Key,T>> med {map.begin(), map.end()};
my_nth_element(med.begin(), med.end(), med.begin() + med.size() / 2);
auto median = med[med.size()/2];

您应该以平均线性复杂度来实现您的nth_element。 (如果输入值的数量恰好是偶数,则需要使用两个中间值的平均值。)

【讨论】:

    【解决方案2】:

    无序地图没有顺序(顾名思义),因此在无序地图中找到中位数没有意义。如果您需要找到中位数 - 使用辅助数组并在其中执行 nth_element 算法的一些实现。这一步将具有线性复杂性。

    【讨论】:

    • @Bernard 您不能为无序地图编写排序函数,因为这将使其不再是无序。
    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多