【问题标题】:Algorithm for map<int,vector<int> >map<int,vector<int>> 的算法
【发布时间】:2012-10-09 15:00:48
【问题描述】:

我无法为我遇到的地图矢量问题想出一个有效的算法。

假设我有一个 map > 我想知道一个整数在地图的所有向量中出现了多少次,如果它出现在预定义的数量上,则从其余的向量(希望这是有道理的),这是一个简单的例子:


关键值

1 -

2 -

3-

在这种情况下,如果 4 出现超过 3 次,我想从所有向量中删除它。生成的地图如下所示:

1 -

2 -

3-


我正在为这个问题寻找一种有效的算法,只是想知道是否有人有任何想法。 (我在 C++ 中工作,但我知道 java 或伪代码很酷)。

感谢您的帮助

请注意,仅在此示例中,向量在现实生活中并未排序。

【问题讨论】:

  • 假设您没有反向映射(整数到键),我认为您唯一的选择是从头到尾一个接一个...
  • @lc 我自己也是这么想的,但是如果他需要删除多个数字(例如 4 和 6 和 8),那么首先构建一个单独的数据结构不是更有效吗?然后全部删除?
  • 为什么不使用std::multimap&lt;int, int&gt;
  • 在您的示例中,向量已排序。这是规定吗?
  • @vlad 是的,我想这是给 Nark 的一个问题:计数和删除操作是否只会执行一次,还是必须删除多个数字?

标签: c++ algorithm big-o


【解决方案1】:

由于未对向量进行排序,唯一的方法是遍历所有向量的所有项,跟踪已找到的项,并酌情清理向量。我认为使用外部有状态谓词和 remove-erase 习语来做到这一点很简单。

但是,鉴于您的确切需求和容器使用情况,可能会有其他方法可用。例如,如果 vector 实际上不需要可索引,您可以使用 multiset 来保持项目排序并提供轻松计数和删除。

【讨论】:

  • MultiSet 是一个很好的建议,老实说我已经忘记了它们,而且我的结构要求实际上并不需要我有一个索引(此时)。感谢大家的帮助。
猜你喜欢
  • 2013-01-24
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多