IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 19008 哈希表 -> 正文阅读

[数据结构与算法]19008 哈希表

?

本题目有set和并查集两种做法。

其实这个题目和18770非常相似,当计算出a[i]的哈希值y=H(a[i])时,如果y是空的,那么将a[i]存放在y位置,不然就向后进行线性探测。换句话说找到大于等于y的还没使用过的最小值。因为凡是使用过的位置都无法再次使用,可以理解为将其删除掉。

解题思路:先将存储位置0,1,......n-1放入一个set集合,每次对哈希结果y进行查找,如果没有大于等于y的值,那么选择最小值。题目另一个要求输出不冲突的元素数量,如果在set中找到的位置等于y就是不冲突。

通过本题可以看出,哈希表线性探测过程也可以进行优化。

#include <iostream>
#include <set>
typedef long long ll;
using namespace std;
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,n,x,y,hs[100005],cnt=0;
    set<int>s;
    cin>>n;
    for(i=0;i<n;i++) /**< 先把n个位置下表送入set */
        s.insert(i);
    for(i=1;i<=n;i++)
    {
        cin>>x;
        y=x%n;
        set<int>::iterator it=s.lower_bound(y);
        if(it==s.end())/**< 如果没有大于等于y的位置,那么选择最小值 */
            it=s.begin();
        if(y==*it)/**< 不冲突 */
            cnt++;
        hs[*it]=x; /**< *it就是选中的存储位置 */
        s.erase(it);/**< 用过的位置要删除 */
    }
    cout<<cnt<<endl;
    for(i=0;i<n;i++)
        cout<<hs[i]<<' ';

    return 0;
}

赠送一个并查集的写法:并查集的思想是,当我们使用了y位置,那么通过将y和y+1进行并操作,使得后面再查询y位置时,得到的结果时y+1的位置。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,a[1000005],f[1000005],ans=0;
int findx(int x)
{
    return x==f[x]?x:f[x]=findx(f[x]);
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,x;
    cin>>n;
    for(i=0;i<n;i++)
      f[i]=i;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        int x1=findx(x%n),x2=findx((x1+1)%n);/**< 待插入的下一个位置x2 */
        if(x1==x%n)
            ans++;
        a[x1]=x;
        f[x1]=x2;
    }
    cout<<ans<<endl;
    for(i=0;i<n;i++)
        cout<<a[i]<<' ';
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:55:25  更:2022-04-30 08:56:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:34:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码