我正在研究數據結構的擦除方法,該數據結構具有硬編碼的最大元素數N,它依賴於std::array
來避免堆內存。雖然std::array
包含N個元素只有一些數目M,都是「相關的」元素,其中M小於或等於N.作爲一個例子,如果N是10和陣列看起來像這樣:漸進複雜度std :: remove_if
std::array<int, N> elements = { 0, 1, 2, -1, 4, -1, 6, -1, -1, 9 };
...如果M是7,則只有前7個元素是「相關」,而其他元素被認爲是垃圾(結尾{ -1, -1, -9 }
是垃圾)。我在這裏使用int
來舉例,但真正的程序存儲實現operator==
的對象。下面是一個工作的例子,刪除所有-1
和更新瑪:
#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位移是想知道被每次謂詞是真
反正'的std ::開始(元素),&元素[M]'是實現自C++標準說,'的std ::開始(元素)'將返回'elements.begin特定行爲()' ,它又返回一個'std :: array :: iterator',它是實現特定類型的,'&elements [M]'是一個指針類型 – Danh
@Danh,它怎麼可能是O(1)?如果我有一個大小爲100的數組,90個元素是「相關的」,我認爲90是M,那麼'std :: remove'至少是O(M) – asimes
@Danh複雜性肯定不是'O 1)',因爲它依賴於'N'和'M',使它們保持不變不會改變程序的複雜性取決於這兩個值的事實。 – Holt