繁体   English   中英

如何找到排序数组中不同元素的数量?

[英]How to find number of different elements in sorted array?

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

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

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

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

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

假设您有一个魔术包,其中包含从1到N的几个不同颜色的块。该包是魔术的,因为每当您进入袋子时,您都可以确定袋子中有多少块(N的值)或查看一个保证每次进入该块时,您都可以按颜色顺序获得下一个块,所有红色,所有绿色等,直到没有剩余为止,或者您可以按其编号检查任何单个块。 您想要的是通过固定次数进入袋子来找出袋子中有多少种不同颜色的块。

现在,获得袋子中的总块数仅需一小步,但对您有好处,因为您想知道不同颜色的数。 获取任何固定数量的随机选择的块(小于N)需要固定的到达范围,但是这样做对您没有好处,因为它们没有告诉您袋中其余块的任何信息。 唯一可以做的是依次将所有块逐个拉出,并找到下一个块与上一个块不同颜色的次数。

现在,如果您允许我更改将积木放入袋中或从袋中取出的方式,那么我可以随时跟踪袋中有多少种颜色,然后再告诉您就变得不那么容易了。 我只是给您我一直在追踪的价值。 本质上,我要花少量的空间(我跟踪值的地方),并在添加/删除过程中花费更多的时间,这需要大量的时间来尝试以后查找不同颜色的数量。 您只需要决定权衡是否值得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM