- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为具有硬编码最大元素数 N 的数据结构开发一种删除方法,它依赖于 std::array
来避免堆内存。虽然 std::array
只包含 N 个元素,但只有 M 个元素,其中 M 是“相关”元素,其中 M 小于或等于 N。例如,如果 N 为 10 且数组看起来像这样:
std::array<int, N> elements = { 0, 1, 2, -1, 4, -1, 6, -1, -1, 9 };
...如果 M 是 7,则只有前 7 个元素是“相关的”,而其他元素被认为是垃圾(结尾 { -1, -1, -9 }
是垃圾) .我在此处使用 int
作为 SO 示例,但实际程序存储实现 operator==
的对象。下面是一个删除所有 -1
并更新 M 的工作示例:
#include <algorithm>
#include <array>
#include <iostream>
constexpr unsigned N = 10;
unsigned M = 7;
std::array<int, N> elements = { 0, 1, 2, -1, 4, -1, 6, -1, -1, 9 };
int main() {
for (unsigned i = 0; i < M; ++i)
std::cout << elements[i] << ' ';
std::cout << '\n';
auto newEnd = std::remove_if(
std::begin(elements), std::begin(elements) + M,
[](const auto& element) {
return -1 == element;
}
);
unsigned numDeleted = M - std::distance(std::begin(elements), newEnd);
M -= numDeleted;
std::cout << "Num deleted: " << numDeleted << '\n';
for (unsigned i = 0; i < M; ++i)
std::cout << elements[i] << ' ';
std::cout << '\n';
return 0;
}
我的问题是 std::remove_if
的渐近复杂度是多少?我想在 std::remove_if
和 std::distance
之间它是整体 O(2M) 或 O(M) 其中 std::remove_if
是一个更昂贵的操作。但是我不确定 std::remove_if
是否为 O(N * M),因为每次删除都会移动元素
编辑:为清楚起见,我知道这应该应用谓词 M 次,但我想知道每次谓词为真时是否应用 N 次转换
最佳答案
通过 cppreference :
Complexity: Exactly
std::distance(first, last)
applications of the predicate.
被移除的元素没有移位操作,因为它们在调用 std::remove_if
后可能具有未指定的值
关于c++ - std::remove_if 的渐近复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888171/
谁能证实这个算法的复杂度是 O(n^2)? a = 0 b = 0 c = n while (b <= c) { for (j = b; j<=c; j++) { a
问题(数据结构): 我们应该使用哪种表示来计算 O(|V|+|E|) 中图顶点的入度?这应该如何在 Khan 的算法中保持而不损害运行时间(渐近地)?证明您的主张。 我的尝试:我们应该使用矩阵表示来计
在某些情况下,对问题的蛮力方法具有复杂性,在性能方面不够好。 让我们举个例子西塔(n^2)。 使用递归方法可以将其改进为 Theta(nlogn)。 显然,渐近地人们会选择使用递归方法,因为对于越来越
我在 C++11 中使用 std::unordered_map。我在字符串键和复合数据类型之间做出决定(比如将两个 long 放在一个结构中以保存 UUID)。 当 hashmap 使用 std::s
它是 f(n)=theta(h(n)) 因为 theta 是可传递的。但是谁能解释为什么 h(n)=theta(f(n))。 最佳答案 通过定义扩展 Big-O 符号通常会使事情变得简单。 关于alg
我是一名优秀的程序员,十分优秀!