最近私は1つの問題に直面しました。私はstd::set
要素の相対的なインデックスを取得したい。たとえば、std::set
が{1, 2, 4, 6, 9, 15}
を格納していて、要素{4}
を見つけて、相対インデックス{2}
を効率的に取得したいとします。もちろん、私はstd::distance(myset.begin(), myiterator)
と書くことができますが、この操作の複雑さはO(n*logn)
です。私がstd::set
の真の赤黒の木にアクセスできたら、O(logn)
というちょうどrb_tree_node_pos
(以下を参照)を実行します。これは正確に相対インデックスです。誰も私は本当の木を得ることができるか知っていますか?要素の相対的な指標を3.print、1インサート要素、2 delete要素:一般的にstd :: setの相対インデックスを取得するにはどうすればよいですか?
#include <iostream>
#include <set>
using namespace std ;
int rb_tree_node_pos(rb_tree_node *node) {
//function that finds relative index of tree node
if (node->parent==NULL) return rb_tree_size(node->left) ;
else return rb_tree_node_pos(node->parent)+rb_tree_size(node->left)+1 ;_
}
int main() {
set<int> myset ;
//... reading some data in myset
int find_int ;
cin >> find_int ;
set<int>::iterator myit=myset.find(find_int) ;
int find_index=distance(myset.begin(), myit) ; // O(n*log(n)), to slow!!!
find_index=rb_tree_node_pos(myit->get_rb_tree()) ; // that's O(logn)
cout << find_index << endl ;
return 0 ;
}
は、私は次の操作を維持するデータ構造をしたい: は、ここではコードの例です。私はSTLからそれを「掘り起こす」方法があると思う。
ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –
@πάνταῥεῖ - この質問に何か間違いがあることを暗示していますか? –
@Oliver私は[ツアー]を読むためにOPをお勧めします。そして疑問は、いくつかの簡潔なサンプルコードで確実に改善することができます。 –