C ++マップセット
内部データ構造とマップを設定するには、赤、黒の木です
PS:バイナリツリーストレージ
二分木を使用することができるチェーン店を使用することも可能で順次配列格納されています。完全2分木に適して順次でストレージアレイは、ストレージの他のタイプの配列を持つバイナリツリーは、ストレージスペースのより多くの無駄になります。ヒープは、実際には完全なバイナリツリーで最も一般的なストレージアレイです。
PSS:バイナリ検索(ソート)ツリーVSハッシュ
データハッシュテーブルがある無秩序メモリあなたは秩序ある出力データが必要な場合は、あなたがソートされる必要があり、。二分探索木のために、我々は唯一のトラバーサル順序どおり必要、O(n)との時間複雑内とすることができる、出力データシーケンスは、注文しました。
ハッシュテーブルの拡張多くを消費するが、バイナリ検索ツリー不安定なパフォーマンスにもかかわらず、ハッシュ衝突、不安定なパフォーマンス、に直面したが、プロジェクトでは、私たちの最も人気のあるバランスのバイナリ検索ツリーのパフォーマンスは非常に安定している、時間安定した複雑性O(LOGN)。
バイナリツリー、考慮すべき多くのことよりも、ハッシュテーブルの検索複合体を構築します。例えば、ハッシュ関数の設計、競合解決、容量拡張、容量減少など。平衡二分探索木は、この問題のバランスを考慮する必要があり、この問題を解決するには、固定され、比較的成熟しています。
時間ともかかわらず、したがって、ハッシュテーブルルックアップ動作は、複雑さの一定レベルであるが、ハッシュの衝突があるため、これはLOGNより小さい必ずしも一定ではないので、実際の速度が必ずしもO.より(LOGN)より速いために見えないかもしれ プラス時間のかかるハッシュ関数、バランスの取れたバイナリ効率よりも必ずしも高い探索木。
赤、黒の木
私たちは、その学ぶために、データ構造とアルゴリズムを学ぶシーンの特性とそれが解決する問題の起源を。赤黒木のために、例外ではありません。あなたはこれらの質問を知ってもらうことができれば、実際には、それが十分なされていると思います。
赤黒木は平衡二分探索木です。それは、データを更新する過程で生成劣化の複雑さを二分探索木を解決するために共通の問題です。黒赤約log2n樹高、それはほぼバランスしているので、挿入、削除、検索動作時間複雑度はO(LOGN)です。
マップを使用して設定
- 地図
// ref: https://blog.csdn.net/bingtang_blog/article/details/52730530
#include<iostream>
#include<map>
using namespace std;
int main(){
//map声明,加入有文件map
map<int, int> m;
//插入元素要用makr_pair的方式
m.insert(make_pair(1, 5));
//通过iterator来查找map里面的元素
map<int, int>::iterator ite;
ite = m.find(1);
//如果找到了,那么我们就删除掉原有的元素,加入新元素
//因为后来加入的元素如果键重复,不能覆盖,会被忽略
if(ite != m.end()){
m.erase(1);
m.insert(make_pair(1, 6));
}else{
//没找到直接加入
m.insert(make_pair(1, 6));
}
//用这种方式,来输出键值对的值
cout << ite->second << endl;
//历遍map元素,并输出键值对
for(ite = m.begin(); ite != m.end(); ite++){
cout << ite->first << "\t" << ite->second << endl;
}
}
- セット
// ref: https://blog.csdn.net/bingtang_blog/article/details/52730530
#include<iostream>
#include<map>
#include<set>
using namespace std;
int main(){
//声明集合,加入头文件<set>
set<int> s;
//向集合中插入元素
s.insert(1);
s.insert(2);
s.insert(3);
//在集合中查找元素
set<int>::iterator ite;
ite = s.find(1);
if(ite == s.end()){
cout << "Not found" << endl;
}else{
cout << "Found" << endl;
}
//集合删除元素
s.erase(2);
//在集合中查找元素的第二种方式
if(s.count(3) != 0){
cout << "Found" << endl;
}else{
cout << "Not found" << endl;
}
//历遍集合元素
for(ite = s.begin(); ite != s.end(); ite++){
cout << *ite << endl;
}
}