【发布时间】:2016-05-17 00:48:58
【问题描述】:
我有一组正整数。如何找到集合中未包含的最小数字?我可以比 O(n) 更快吗?
例如,我有set s<unsigned int>,我在其中插入和删除了很多数字。现在我知道了它的大小,我想找到最小的数字,而不是在集合中
设置0 1 2 3 4 5 7 9 10 11 14 15
答案是6
【问题讨论】:
-
你能比检查集合中的每个元素更快吗?
-
这可能不是最小数字 - 1。对于
{1,2,4},答案是3。 -
你能比
O(n)更快吗?没有。 -
如果您知道第一个和最后一个条目和大小,那么您可以知道数字是否丢失或不快速(只要数字不重复)。但是,对于丢失的数字,最坏的情况是 O(n)
-
"通过 O(log n) 更改数据提交的任何方式" - 如果您可以将值存储在排序数组中,那么您可以使用修改后的二进制搜索(通过查看
v[i] == i来检查任意索引之前是否存在间隙)。另一种选择是 - 而不是在仍在搜索的元素范围中途进行二进制探测,您可能会猜到当v[last] - v[first] / (last - first)> 1.0 时,差距在统计上可能更接近范围的开始,但这是否有效取决于您的输入是如何生成的。