1
27
您的第一个示例应该是O(n log n)as
第二个例子显然是O(n^2)。系数和内存使用率都很低,因此在某些情况下可能更快(甚至更快)。
这取决于什么
或者是STL风格,
当然,如果你能对原始向量重新排序,
|
2
9
如果要快速确定向量是否只有唯一元素,则必须对向量进行排序。否则,最好是O(n^2)运行时或O(n Log n)运行时带O(n)空间。我认为最好编写一个假设输入已排序的函数。
然后让客户机对向量进行排序,或者制作向量的排序副本。这将为动态编程打开一扇门。也就是说,如果客户机在过去对向量进行了排序,那么他们可以选择保留并引用排序后的向量,这样他们就可以为O(N)运行时重复此操作。 |
3
6
标准库有
这是否比使用
|
4
6
仅仅使用一个提供这种“保证”的容器是不可行的吗?在插入时而不是将来某个时候标记一个副本是否有用?当我想做这样的事情时,这就是我前进的方向;仅仅使用集合作为“主”容器,如果我需要保持原始顺序,可以构建一个并行向量,但是当然,这对内存和CPU可用性做了一些假设… |
5
6
一方面,您可以将两者的优点结合起来:如果已经发现了一个副本,请停止构建集合:
顺便说一句,
Potatoswatter
很好地指出,在一般情况下,您可能希望避免复制t,在这种情况下,您可能会使用
当然,如果它不是通用的,您可能会做得更好。例如,如果你有一个已知范围的整数向量,如果一个元素存在,你可以在一个数组(甚至是位集)中进行标记。 |
6
2
你可以使用
它以nlog(n)运行;与您的设置示例相同。虽然使用C++ 0x,但我认为理论上不能保证更快地完成它。
另外,如果您没有在示例中修改向量,那么您可以通过传递const reference来提高性能,这样就不会对它进行不必要的复制。 |
7
2
如果我可以自己加2美分。
首先,作为
第二,有两种策略可用。
我必须承认我会倾向于第一个。封装,明确职责分离等等。 不管怎样,根据需求有很多种方法。第一个问题是:
如果我们能搞砸他们,我建议
第三:正如你所说,一个简单的线性搜索加倍得到O(N 二 )平均来说,这是不好的。
如果
但归根结底,真正的问题是,我们的建议是必要的一般性的,因为我们缺乏数据。
|
8
1
嗯,你的第一个应该只吃
但是,如果在向集合中添加内容时进行检查,则应该能够获得更好的最佳情况:
这个应该有
|
9
1
如果存储在向量中的类型t很大,并且复制它的成本很高,那么可以考虑为向量元素创建指针或迭代器的向量。根据指向的元素对其进行排序,然后检查其唯一性。 您也可以使用std::set。模板如下
我认为您可以提供适当的traits参数并为speed插入原始指针,或者使用<运算符为指针实现一个简单的包装类。 不要使用构造函数插入到集合中。使用插入方法。方法(重载之一)具有签名
通过检查结果(第二个成员),通常可以比插入所有元素更快地检测重复的元素。 |
10
1
在(非常)特殊的情况下,用已知的、不太大的、最大值n对离散值进行排序。
这样做的复杂性是O(n)。 |
11
0
使用当前的C++标准容器,在第一个示例中有一个很好的解决方案。但是如果您可以使用散列容器,您可能会做得更好,因为散列集将是n O(1)而不是N o(对数n)表示标准集。当然,一切都将取决于n的大小和特定的库实现。 |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |