数据结构(三)

一、Hash表

Hahs表存储结构

字符串Hash

1.1拉链法

案例代码如下:

#include<iostream>
#include<cstring>
using namespace std;

const int N = 100003;
int h[N],e[N],ne[N],idx;

//插入操作
void insert(int x)
{
    int k = (x%N + N) % N;
    e[idx] = x;
    ne[idx] = h[k];
    h[k] = idx++;
    
}

//查询操作
bool find(int x)
{
    int k = (x%N+N) %N;
    for(int i = h[k];i != -1;i = ne[i])
    {
        if(e[i] == x)
        {
            return true;
        }
    }
    return false;
}

int main()
{
   int n;
   scanf("%d",&n);
   
   //清空槽
   memset(h,-1,sizeof h);
   
   while(n --)
   {
       char op[2];
       scanf("%s%d",op,&x);
       
       if(*op == 'I') insert(x);
       else
       {
           if(find(x)) puts("yes")
            else
           {
               puts("No");
           }
       }
   }
   return 0;
}

1.2开放寻址法

案例代码如下:

#include<iostream>
using namespace std;

const int N = 200003,null = 0x3f3f3f3f;

int h[N];

//插入
void find(int x)
{
    int k = (x % N + N) % N;
    
    while(h[k] != null && h[k] != x)
    {
        k ++;
        if(k == N) k=0;
    }
    return k;
}

1.3字符串哈希

案例代码如下:

#include<iostream>
#include<cstring>

typedef unsigned long long ULL;

const int N = 100010,P = 31;

int n,m;
char str[N];
ULL h[N],q[N];

ULL get(int l,int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}
int main()
{
    scanf("%d%d%s",&n,&m,str + 1);
    p[0] = 1;
    for(int i = 1;i<=n;i++)
    {
        p[i] = p[i - 1] * p;
        //预处理前缀哈希值
        h[i] = h[i - 1] * p + str[i];
    }
    while(m--)
    {
        int l1,r1,l2,r2;
        scanf("%d%d%d%,&d",&l1,&r1,&l2,&r2);
        
        if(get(l1,r1) == get(l2,r2)) puts("Yes");
        else
        {
            puts("No");
        }
    }
}

二、STL容器

2.1vector

变长数组(倍增思想)

案例代码如下:

int main()
{
    //vector初始化
    vector<int> a(10,1);
    //vector数组
    //vector<int> a[10];
    
    //常用函数
    a.size(); //返回元素个数
    a.empty(); //返回是否为空
    //清空
    a.clear(); //清空
    for(int i = 0;i < 10;i++)
    {
        a.push_back(i);
    }
    for(int i = 0;i < a.size();i++)
    {
        cout<<a[i]<<" ";
    }
    
    //支持比较运算
    vector<int> b<4,3>,c<3,4>;
    
    if(a < b) puts("a < b");
    
    return 0;
}

2.2string

字符串 substr(),c_str()

int main()
{
    string a = "abcdef";
    a += "cd";
    a += 'z';
    
    //截取字符串
    cout<<a.substr(1,3)<<endl;
    //获取存取字符串的起始地址
    printf("%s\n",a.c_str());
    
    return 0;
}

2.3queue(priority_queue)

队列:push(),front(),pop()

    push(); //向队尾插入一个元素
    front(); //返回队头元素
    back(); //返回队尾元素
    pop(); //弹出队头元素

优先队列(priority_queue)

    push(); //向堆中插入一个元素
    top(); //返回堆顶元素
    pop(); //弹出堆顶元素

2.4stack

栈:push(),top(),pop()

    push(); //向栈顶插入一个元素
    top(); //返回堆顶元素
    pop(); //弹出堆顶元素

2.5deque

双端队列,支持随机访问(用的很少)

    push_back()/pop_back();
    front(); 
    back(); 
    push_fornt()/pop_front();
    clear();
    begin()/end();

2.6set

set中不可以有重复元素

基于平衡二叉树(红黑树)实现,动态维护有序序列

insert(); //插入一个数
find(); //查找一个数
count(); //返回某一个树的个数
erase(); //输入是一个数x,则删除有所有x
         //输入一个迭代器,删除这个迭代器

2.7map

基于平衡二叉树(红黑树)实现,动态维护有序序列

insert(); //插入一个数
find(); //查找一个数
erase(); //输入参数为pair或迭代器

2.8bitset

压位

count(); //统计有多少个1
any(); //判断是否至少有一个1
none(); //判断是否全为0
set(); //把所有位置变为1
set(k,v); //将第k位变为v
reset(); //把所有位变为0
flip(); //等价于~
flip(k); //把第k位取反

猜你喜欢

转载自blog.csdn.net/weixin_64443786/article/details/131957444