单调递增栈,栈顶到栈底递增。
单调递减栈,栈顶到栈底递减。
#include<stack> stack<int> st; st.top(); st.pop(); st.push(val); st.size() st.empty();顺序队列存在假溢出,消除假溢出就是当rear和front到大QueueSize时,让队尾指针自动转化为存储空间的最小值0。常用方法有,加标志位,使用计数器记录队列长度,空闲单元法。
Caption
循环队列,队列空间中的一个单元闲置,使得队列非空时,Q.rear与Q.front之间至少间隔一个空闲单元。
队空时,front=rear
队满时,front=(rear+1)%m
队列长度,L=(m+rear-front)%m
#include<queue> queue<int> Q; Q.front(); Q.back(); Q.push(val); Q.pop(); Q.empty(); Q.size();
C++中有map与unordered_map。
map底层通过红黑树实现,内部是有序的,其查询、插入、删除的时间复杂度都为O(logN)。
unordered_map通过哈希表实现,内部是无序的,查询效率为O(1),但是哈希表建立耗费时间,且消耗内存。
multimap 关键字key可以重复出现的map。
unordered_multimap关键字key可以重复出现的unordered_map。
#include<iostream> #include<map> #include<unordered_map> #include<string> using namespace std; int main() { //定义 map<string, int> dict; unordered_map<string,int> unorder_dict; // 插入数据两种方法 dict.insert(pair<string,int>("apple",2)); uborder_dict["banana"] = 6; //遍历 unordered_map<string, int>::iterator iter; for(iter=unorder_dict.begin();iter!=unorder_dict.end();iter++) cout<<iter->first<<ends<<iter->second<<endl; map<string, int>::iterator iter; for(iter=dict.begin();iter!=dict.end();iter++) cout<<iter->first<<ends<<iter->second<<endl; //查找 if(iter=dict.find()!=dict.end()) cout<<"找到了"<<iter->second<<endl; else cout<<"没有"<<endl; if(dict.count("apple")==1); cout<<"找到了"<<endl; else cout<<"没有"<<endl; //是否为空 if(dict.empty()) cout<<"该字典无元素"<<endl; else cout<<"该字典共有"<<dict.size()<<"个元素"<<endl; }
C++中有set与unordered_set,可以理解为将value作为key的map。
set底层通过红黑树实现,内部是有序的,其查询、插入、删除的时间复杂度都为O(logN)。
unordered_set通过哈希表实现,内部是无序的,查询效率为O(1),但是哈希表建立耗费时间,且消耗内存。
multiset 关键字key可以重复出现的set。
unordered_multiset关键字key可以重复出现的unordered_set。
有序链表+多级索引,时间复杂度为O(logN),实现起来比红黑树简单,非关系型数据库Redis。
二叉搜索树
AVL,二叉自平衡搜索树,查询效率与树的深度有关,引入平衡因子,存储平衡因子浪费空间。
红黑树,近似二叉平衡搜索树,查询效率低于AVL,插入删除效率高于AVL。
B-Tree,多叉平衡二叉树。
B+Tree,多叉平衡二叉树,非叶子节点存放索引,叶子节点存放关键字。叶子节点带有顺序访问的指针。
Trie 树,字典树,每个节点26个分支,查询效率高,空间换时间。
介绍了常用的数据结构,后续会继续补充!