【问题标题】:How to find number of different elements in sorted array?如何在排序数组中查找不同元素的数量?
【发布时间】:2012-03-24 15:44:36
【问题描述】:

如何在 O(1) 的有序数组中找到不同元素的数量? 在 C++ 中使用多映射容器 (STL)。 我的意思是 O(1) 完全正确。

【问题讨论】:

  • 我认为你的意思是 O(n),O(1) 需要先见之明,除非你在向数组中添加/删除元素时跟踪这一点,然后,你并不是真的“发现" 与其归还一样。
  • 你不能,因为你不知道有多少条目共享同一个键。如果您使用的是普通映射,则唯一条目的数量是键的数量,但是在多映射(这与数组不同,顺便说一句)中,您可以拥有任意数量的共享相同的条目钥匙。我假设“不同的元素”实际上是指“不同的键”,但是如果您谈论的是实际元素并且没有其他强制元素不存储两次的东西,那么问题是相同的。如果你这样做了,那么答案就是条目数。
  • @tvanfosson 这对我来说似乎是一个正确的答案。
  • @CaptainGiraffe - 我正在写一个更广泛的解释。

标签: c++ arrays algorithm stl


【解决方案1】:

实际上不可能在恒定时间内知道集合中有多少唯一项目,即使集合已排序,除非您在任何给定时间只允许集合中的项目的一个实例。如果您确实将集合限制为只有独特的项目,那么答案是微不足道的;它是集合中项目的数量,因为它们都必须是不同的。

如果您有一个有序的非独特项目集合,您可以通过遍历集合并查找状态更改来找到不同项目的数量(当当前值与前一个不同时)。不同项的数量比状态更改的数量多一个(或者,如果您从“空”状态开始并将第一个项目计为从该状态发生的更改,则状态更改的数量)。

您还可以扩充您的数据结构和添加/删除算法来跟踪集合中不同项目的数量,这样您就可以通过简单地查询在添加/删除期间更新的值来在恒定时间内“找到”这个数字.这不应该影响任何一个的效率,因为您只需要在添加时通过检查上一个/下一个项目是否具有相同的键来确定新项目是否是其类型中的第一个,以及在删除时是否已删除的项目是其类型的最后一项,通过相同的检查。

让我们考虑一个简单的例子。

假设你有一个魔法袋,里面有几个不同颜色的方块,编号从 1 到 N。这个袋子很神奇,因为无论何时你把手伸进袋子里,你都可以确定袋子里有多少个方块(N 的值)或查看一个块,保证每次进入该块时,您都会按颜色顺序获得下一个块,所有红色,所有绿色等,直到没有其他块,或者您可以通过其编号检查任何单个块。你想要的是通过将手伸进袋子里固定的次数来找出袋子里有多少种不同颜色的积木。

现在,获得袋子中的总块数需要一个范围,但你没有用,因为你想知道不同颜色的数量。获得任何固定数量的随机选择的块(小于 N)需要固定数量的范围,但对您没有好处,因为它们不会告诉您有关袋子中其余块的任何信息。你唯一能做的就是把所有的块按顺序一个接一个地拉出来,找出下一个块与上一个块颜色不同的次数。

现在,如果您允许我更改将积木放入袋子或从袋子中取出的方式,我可以随时跟踪袋子里有多少种颜色的积木,然后再告诉您就变得微不足道了。我只是给你我正在跟踪的价值。本质上,我在交易少量空间(我跟踪值的地方)和在添加/删除期间的一些额外时间,以便稍后尝试找到不同颜色的数量。您只需要决定权衡是否值得。

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2013-12-26
    相关资源
    最近更新 更多