如何在排序数组中查找不同元素的数量
How to find number of different elements in sorted array?
如何在O(1)排序的数组中找到不同元素的数量?在C++中使用多映射容器(STL)。我的意思是O(1)。
即使对集合进行了排序,也不可能在恒定时间内知道集合中有多少唯一项,除非在任何给定时间只允许该项在集合中的一个实例。如果您确实将集合限制为只有唯一的项,那么答案是微不足道的;这是集合中的项目数,因为它们都必须是不同的。
如果您有一个非不同项的有序集合,则可以通过迭代该集合并查找状态更改(当当前值与上一个值不同时)来查找不同项的数量。不同项目的数量比状态更改的数量多一个(或者,如果从"空"状态开始并将第一个项目视为状态更改,则为状态更改的次数)。
您还可以增强数据结构和添加/删除算法,以跟踪集合中不同项目的数量,这样您只需查询添加/删除过程中更新的值,就可以在恒定时间内"找到"这个数字。这不应该影响两者的效率,因为在添加时,您只需要通过检查上一个/下一个项目是否具有相同的键来确定新项目是否是其类型的第一个项目,在删除时,通过相同的检查来确定删除的项目是否是该类型的最后一个项目。
让我们考虑一个简单的例子。
假设你有一个神奇的袋子,里面有几个不同颜色的方块,编号从1到N。这个袋子很神奇,因为无论何时你把手伸进袋子,你都可以确定袋子里有多少方块(N的值),或者看着一个方块,保证每次你把手伸进方块,你都会得到按颜色顺序排列的下一个方块,等等,直到没有剩余的块,或者你可以通过它的编号来检查任何单个块。你想要的是通过一定次数的把手伸进袋子,找出袋子里有多少不同颜色的方块。
现在,获取袋子中的总块数需要一次尝试,但这对你没有好处,因为你想知道不同颜色的数量。获得任何固定数量的随机选择的区块(小于N)都需要固定数量的到达次数,但这对你没有好处,因为它们不会告诉你袋子里其他区块的任何信息。你唯一能做的就是按顺序一个接一个地取出所有的方块,并找出下一个方块与上一个不同颜色的次数。
现在,如果你允许我改变我把积木放进袋子或从袋子里拿出来的方式,我可以在我走的时候记录袋子里有多少颜色的积木,那么告诉你就变得微不足道了。我只是给你我一直在跟踪的价值。从本质上讲,我用少量的空间(我跟踪价值的地方)和添加/删除过程中的一点额外时间来换取更多的时间,以便稍后找到不同颜色的数量。你只需要决定这种权衡是否值得。
- 使用堆查找第K个最大元素的时间复杂性
- 查找矩阵C++中每一列和每一行的最小和最大元素
- C++如何在向量中查找最常见的元素
- 查找两个排序向量中共有的元素
- 在对向量中查找元素的索引
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 查找矩阵中单元格的相邻元素
- 为什么使用数组元素查找最大数字的程序不起作用?
- 查找第一个数组中不存在的元素
- 查找最小的下一个更大的元素
- 在最小堆中查找最大元素
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- set::find 查找不存在的元素
- 在集合中查找使用结构C++的元素
- 从斐波那契序列 c++ 中的数组中查找正确的元素时出错
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 查找数组中指示性较大但数组中值较小的元素
- C++结构集无法按元素查找/擦除
- 如何在OpenCV中使用Matlab的512元素查找表数组?
- 使用数组的元素查找总和'k'