【发布时间】:2019-04-27 06:06:15
【问题描述】:
我有一个包含 100 个随机整数的列表。每个随机整数都有一个从 0 到 99 的值。允许重复,因此列表可能类似于
56, 1, 1, 1, 1, 0, 2, 6, 99...
我需要找到列表中不包含的最小整数(>= 0)。
我最初的解决方案是这样的:
vector<int> integerList(100); //list of random integers
...
vector<bool> listedIntegers(101, false);
for (int theInt : integerList)
{
listedIntegers[theInt] = true;
}
int smallestInt;
for (int j = 0; j < 101; j++)
{
if (!listedIntegers[j])
{
smallestInt = j;
break;
}
}
但这需要一个用于记账的辅助数组和第二个(可能是完整的)列表迭代。我需要执行这个任务数百万次(实际应用程序是在一个贪婪的图形着色算法中,我需要使用顶点邻接列表找到最小的未使用颜色值),所以我想知道是否有一个聪明的方法来获得没有那么多开销也能得到同样的结果?
【问题讨论】:
-
有错别字吗?
O(2 * n)与O(n)相同。 -
糟糕,你是对的。
-
您必须为您的特定任务修改和优化优先级来实现堆。
-
由于您希望此任务执行很多次,您可以利用以前的迭代(因此您可能需要指定它的工作方式)。但是在一个孤立的迭代中,恐怕你找不到比你的算法更好的东西了,尤其是对于这么小的列表(如果你总是只有 100 个整数)。好吧,除了不使用
vector<bool>。 -
如果只有 100 个整数,确定最快的方法将归结为基准测试和微优化。从理论上的渐近角度来看,你所拥有的代码是解决问题的最快方法。
标签: c++ arrays algorithm vector time-complexity