晚三天才想起来。。。
目录
问题 A: Hash表-线性探测法解决冲突
问题 B: 求3阶B-树的深度
问题 C: 输出3阶B-树的构造过程
问题 D: Hash表-链表法解决冲突
感觉AD其实还好,BC纯纯大模拟
可能老师真的想让咱们手搓一颗B树吧(期末应该不会考这个吧)
#include
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et cout<<'\n'
#define xx first
#define yy second
using namespace std;
template void input(_Tp &x){char ch(getchar());bool f(false);while(!isdigit(ch))f|=ch==45,ch=getchar();x=ch&15,ch=getchar();while(isdigit(ch))x=x*10+(ch&15),ch=getchar();if(f)x=-x;
}
template void input(_Tp &t,Args &...args){input(t);input(args...);}
using namespace std;
const int mod=1e9+7,N=1e5+7;
vector a(10,"#");
int nxt[100];
signed main(){int n,sum;cin>>n;fer(i,0,9){nxt[2*i]=i+1;nxt[2*i+1]=-(i+1);}fer(i,0,n-1){string x;cin>>x;int idx=0;for(int j=x.size()-1;j>x.size()-5;j--){idx=idx+x[j]-'0';}idx=idx%10;if(a[idx]=="#"){a[idx]=x;}else{int j=0;while(a[idx+nxt[j]]!="#") j++;a[idx+nxt[j]]=x;}sum=0;} for(auto t:a){cout<
BC差不多是一道题
B树这个东西写法很多,其实正常是不太建议每个节点开两个数组存的,这样空间浪费太大了
但这么写更易于理解一点,
(而且符合老师审美)最**的就是那个裂点函数了吧,还好他没有让写删除,那个合并的函数更**
主要思路就是弄两个新的点,前一半塞一个里后一半塞一个里,中间那个塞到父节点上,然后递归裂父节点
然后特判根节点,如果根节点要裂开要造一个新的根进去
难写确实难写,,但没办法。。。
#include
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et cout<<'\n'
#define xx first
#define yy second
using namespace std;
class btnode{
public:int keys[4];btnode* child[4];btnode* parent;int n;int level;int leaf;btnode(){child[0]=nullptr;n=0;level=0;parent=nullptr;for(int i=0;i<4;++i){child[i]=nullptr,keys[i]=0;}leaf=1;}
};
int maxlevel;
class bttree{
public:btnode* __root;bttree(){__root=nullptr;}int __order=3;void pf();btnode* findnode(btnode* root,int key);int insertto(btnode* node,int key);void insert(int key);void split(btnode* node);
};
void bttree::pf(){queue q;if(__root!=nullptr){__root->level=0;q.push(__root);}while(q.size()){auto node=q.front();q.pop();for(int i=0;i<=node->n;++i){if(node->child[i]!=nullptr){node->child[i]->level=node->level+1;maxlevel=max(maxlevel,node->child[i]->level);q.push(node->child[i]);}}}
}
btnode* bttree::findnode(btnode* root,int key){if(root==nullptr) return nullptr;if(root->leaf) return root;int ind=0;while(indn&&root->keys[ind]child[ind],key);
}
int bttree::insertto(btnode* node,int key){int ind=node->n;while(ind>=1&&node->keys[ind-1]>key){node->keys[ind]=node->keys[ind-1];node->child[ind+1]=node->child[ind];ind--;}node->keys[ind]=key;node->n+=1;return ind;
}
void bttree::split(btnode* node){auto tmp=node;auto node1=new btnode();auto node2=new btnode();node1->n=1;node2->n=1;node1->leaf=node->leaf;node2->leaf=node->leaf;node1->keys[0]=node->keys[0];node1->child[0]=node->child[0];node1->child[1]=node->child[1];if(node1->child[0] != nullptr) node1->child[0]->parent = node1;if(node1->child[1] != nullptr) node1->child[1]->parent = node1;node2->keys[0] = (node->keys[2]);node2->child[0] = node->child[2];node2->child[1] = node->child[3];if(node2->child[0] != nullptr) node2->child[0]->parent = node2;if(node2->child[1] != nullptr) node2->child[1]->parent = node2;btnode* parent=node->parent;if(parent == nullptr){parent = new btnode();parent->leaf = false;parent->n = 1;parent->keys[0] = node->keys[1];parent->child[0] = node1;parent->child[1] = node2;node1->parent = node2->parent = parent;__root = parent;}else{int index = insertto(parent, node->keys[1]);parent->child[index] = node1;parent->child[index+1] = node2;node1->parent = node2->parent = parent;if(parent->n==__order){split(parent);}}delete tmp;
}
void bttree::insert(int key){if(__root==nullptr){__root=new btnode();__root->keys[0]=key;__root->n=1;}else{btnode* node=findnode(__root,key);insertto(node,key);if(node->n>=__order) split(node);}
}
signed main(){bttree B;int nn;cin>>nn;while(nn--){int t;cin>>t;B.insert(t);}B.pf();cout<
#include
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et cout<<'\n'
#define xx first
#define yy second
using namespace std;
class btnode{
public:int keys[4];btnode* child[4];btnode* parent;int n;int level;int leaf;btnode(){child[0]=nullptr;n=0;level=0;parent=nullptr;for(int i=0;i<4;++i){child[i]=nullptr,keys[i]=0;}leaf=1;}
};
int maxlevel;
class bttree{
public:btnode* __root;bttree(){__root=nullptr;}int __order=3;void pf();btnode* findnode(btnode* root,int key);int insertto(btnode* node,int key);void insert(int key);void split(btnode* node);void dfs(btnode* node);
};
void bttree::dfs(btnode* node){if(node==nullptr) return ;for(int i=0;ilevel;++i) cout<<" ";for(int i=0;in;++i){cout<keys[i]<<" ";}cout<<'\n';for(int i=0;in+1;++i){dfs(node->child[i]);}
}
void bttree::pf(){queue q;if(__root!=nullptr){__root->level=0;q.push(__root);}while(q.size()){auto node=q.front();q.pop();for(int i=0;i<=node->n;++i){if(node->child[i]!=nullptr){node->child[i]->level=node->level+1;maxlevel=max(maxlevel,node->child[i]->level);q.push(node->child[i]);}}}dfs(__root);
}
btnode* bttree::findnode(btnode* root,int key){if(root==nullptr) return nullptr;if(root->leaf) return root;int ind=0;while(indn&&root->keys[ind]child[ind],key);
}
int bttree::insertto(btnode* node,int key){int ind=node->n;while(ind>=1&&node->keys[ind-1]>key){node->keys[ind]=node->keys[ind-1];node->child[ind+1]=node->child[ind];ind--;}node->keys[ind]=key;node->n+=1;return ind;
}
void bttree::split(btnode* node){auto tmp=node;auto node1=new btnode();auto node2=new btnode();node1->n=1;node2->n=1;node1->leaf=node->leaf;node2->leaf=node->leaf;node1->keys[0]=node->keys[0];node1->child[0]=node->child[0];node1->child[1]=node->child[1];if(node1->child[0] != nullptr) node1->child[0]->parent = node1;if(node1->child[1] != nullptr) node1->child[1]->parent = node1;node2->keys[0] = (node->keys[2]);node2->child[0] = node->child[2];node2->child[1] = node->child[3];if(node2->child[0] != nullptr) node2->child[0]->parent = node2;if(node2->child[1] != nullptr) node2->child[1]->parent = node2;btnode* parent=node->parent;if(parent == nullptr){parent = new btnode();parent->leaf = false;parent->n = 1;parent->keys[0] = node->keys[1];parent->child[0] = node1;parent->child[1] = node2;node1->parent = node2->parent = parent;__root = parent;}else{int index = insertto(parent, node->keys[1]);parent->child[index] = node1;parent->child[index+1] = node2;node1->parent = node2->parent = parent;if(parent->n==__order){split(parent);}}delete tmp;
}
void bttree::insert(int key){if(__root==nullptr){__root=new btnode();__root->keys[0]=key;__root->n=1;}else{btnode* node=findnode(__root,key);insertto(node,key);if(node->n>=__order) split(node);}
}
signed main(){bttree B;int nn;cin>>nn;while(nn--){int t;cin>>t;cout << "====insert a key:" << t << endl;B.insert(t);B.pf();cout << "==================" << endl;}
}
#include
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et cout<<'\n'
#define xx first
#define yy second
using namespace std;
template void input(_Tp &x){char ch(getchar());bool f(false);while(!isdigit(ch))f|=ch==45,ch=getchar();x=ch&15,ch=getchar();while(isdigit(ch))x=x*10+(ch&15),ch=getchar();if(f)x=-x;
}
template void input(_Tp &t,Args &...args){input(t);input(args...);}
using namespace std;
const int mod=1e9+7,N=1e5+7;
list h[100];
signed main()
{for (int i=0;i<10;i++){h[i].pb("#");}int n;cin>>n;while(n--){string s;cin>>s;int m=s.size();int x=0;fer(i,m-4,m-1)x+=s[i]-'0';x%=10;if(*h[x].begin() == "#"){h[x].pop_back();h[x].pb(s);}else{h[x].push_front(s);}}fer(i,0,9){for(auto t:h[i]){cout<