如何使用O(1)查找已排序数组中的不同元素的数量? 在C ++中使用多地图容器(STL)。 我的意思是O(1)。
答案 0 :(得分:6)
除非您在任何给定时间仅允许集合中的项目的一个实例,否则即使集合已排序,也不可能在恒定时间内知道集合中有多少唯一项目。如果你确实将集合限制为只有唯一的项目,那么答案是微不足道的;它是集合中的项目数量,因为它们都必须是不同的。
如果您有一个非独特项目的有序集合,您可以通过迭代集合并查找状态更改来找到不同项目的数量(当前值不是与前一个)。不同项目的数量比状态更改的数量多一个(或者如果以&#34开始状态更改的数量;空的"状态并将第一个项目作为更改计数)。
您还可以扩充数据结构并添加/删除算法,以跟踪集合中不同项目的数量,以便您可以找到"通过简单查询在添加/删除期间更新的值,可以在恒定时间内使用此数字。这不应该影响效率,因为您只需要通过检查prev / next项是否具有相同的键来确定新项目是否是第一个类型,并且删除,删除的项目是否是其类型的最后一项,通过相同的检查。
让我们考虑一个简单的例子。
让我们说你有一个神奇的包包含几个不同颜色的块,编号从1到N.这个包很神奇,因为每当你进入包中,你可以确定包中有多少块(值N)或者查看一个块,保证每次进入块时你会得到颜色顺序的下一个块,所有的红色,所有的绿色等等,直到不再剩下或者你可以检查任何一个块按其号码。你想要的是通过固定次数进入袋中找出袋中有多少种不同颜色的块。
现在,获取包中的总块数需要一个范围,但是你不好,因为你想知道不同颜色的数量。获得任意数量的随机选择的块(小于N)需要固定数量的到达但是你没有好处,因为他们不会告诉你任何关于包中其余块的信息。你唯一能做的就是按顺序逐个拉出所有的块,找到下一个块与上一个块颜色不同的次数。
现在,如果你允许我更改块子的方式或将它们从袋子中取出,我可以随时跟踪包里有多少块颜色,然后告诉你再次变得微不足道。我只是给你我追踪的价值。基本上我是在交换少量空间(我跟踪价值的地方)和在添加/删除期间花费更多时间来寻找更多时间来尝试查找不同颜色的数量。你只需要决定权衡是否值得。