我正在寫一個樹容器(只是爲了理解和培訓),現在我得到了第一個和非常基本的方法來添加元素到樹中。可憐的樹增加性能
這是知道我的樹碼。現在沒有析構函數,沒有清理和元素訪問。
template <class T> class set
{
public:
struct Node
{
Node(const T& val)
: left(0), right(0), value(val)
{}
Node* left;
Node* right;
T value;
};
set()
{}
template <class T> void add(const T& value)
{
if (m_Root == nullptr)
{
m_Root = new Node(value);
}
Node* next = nullptr;
Node* current = m_Root;
do
{
if (next != nullptr)
{
current = next;
}
next = value >= current->value ? current->left : current->right;
} while (next != nullptr);
value >= current->value ? current->left = new Node(value) : current->right = new Node(value);
}
private:
Node* m_Root;
};
好了,現在我測試對一個std ::設置有獨特的平衡(高)值的插入性能的附加性能,得出的結論是,性能很簡單可怕。
是否有一個原因,爲什麼該集插入值快得多,以及什麼樣的方式來改善我的方法的插入性能? (我知道可能有更好的樹模型,但據我所知,插入性能應該在大多數樹模型之間靠近)。
在i5 4570股票時鐘下, std :: set需要0.013s才能添加1000000個int16值。 我的設置需要4.5s來添加相同的值。
這個差別從哪裏來?
更新:
還好吧,這裏是我的testcode:
int main()
{
int n = 1000000;
test::set<test::int16> mset; //my set
std::set<test::int16> sset; //std set
std::timer timer; //simple wrapper for clock()
test::random_engine engine(0, 500000); //simple wrapper for rand() and yes, it's seeded, and yes I am aware that an int16 will overflow
std::set<test::int16> values; //Set of values to ensure unique values
bool flip = false;
for (int i = 0; n > i; ++i)
{
values.insert(flip ? engine.generate() : 0 - engine.generate());
flip = !flip; //ensure that we get high and low values and no straight line, but at least 2 paths
}
timer.start();
for (std::set<test::int16>::iterator it = values.begin(); values.end() != it; ++it)
{
mset.add(*it);
}
timer.stop();
std::cout << timer.totalTime() << "s for mset\n";
timer.reset();
timer.start();
for (std::set<test::int16>::iterator it = values.begin(); values.end() != it; ++it)
{
sset.insert(*it);
}
timer.stop();
std::cout << timer.totalTime() << "s for std\n";
}
設定就不會在每次值存儲由於dubicates但兩個容器會得到相同的高數量和相同的價值觀爲了確保代表性的結果。我知道測試可能會更準確,但它應該給出一些可比數字。
你用過優化的建立? –
@Guillaume Racicot是,全面優化 – Mango
你應該提供測試代碼。如果你爲你的樹添加唯一值,它將退化爲一個單鏈表。所以插入成本O(n)而不是O(log(n)) – max