如何在排序数组中查找不同元素的数量

How to find number of different elements in sorted array?

本文关键字:元素 查找 排序 数组      更新时间:2023-10-16

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

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

如果您有一个非不同项的有序集合,则可以通过迭代该集合并查找状态更改(当当前值与上一个值不同时)来查找不同项的数量。不同项目的数量比状态更改的数量多一个(或者,如果从"空"状态开始并将第一个项目视为状态更改,则为状态更改的次数)。

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

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

假设你有一个神奇的袋子,里面有几个不同颜色的方块,编号从1到N。这个袋子很神奇,因为无论何时你把手伸进袋子,你都可以确定袋子里有多少方块(N的值),或者看着一个方块,保证每次你把手伸进方块,你都会得到按颜色顺序排列的下一个方块,等等,直到没有剩余的块,或者你可以通过它的编号来检查任何单个块。你想要的是通过一定次数的把手伸进袋子,找出袋子里有多少不同颜色的方块。

现在,获取袋子中的总块数需要一次尝试,但这对你没有好处,因为你想知道不同颜色的数量。获得任何固定数量的随机选择的区块(小于N)都需要固定数量的到达次数,但这对你没有好处,因为它们不会告诉你袋子里其他区块的任何信息。你唯一能做的就是按顺序一个接一个地取出所有的方块,并找出下一个方块与上一个不同颜色的次数。

现在,如果你允许我改变我把积木放进袋子或从袋子里拿出来的方式,我可以在我走的时候记录袋子里有多少颜色的积木,那么告诉你就变得微不足道了。我只是给你我一直在跟踪的价值。从本质上讲,我用少量的空间(我跟踪价值的地方)和添加/删除过程中的一点额外时间来换取更多的时间,以便稍后找到不同颜色的数量。你只需要决定这种权衡是否值得。