PTAL1-005 考试座位号 测试点全过 暴力&哈希表算法,以及unordered_map的语法

目录

暴力算法

哈希表

unordered_map怎么用?

最后


暴力算法

时间复杂度为 O(NM)


#include<iostream>
#include<string>

using namespace std;
struct stu_date{
    string ad_tick_num;
    int tri_seat_num;
    int exam_seat_num;
};
int main(){
    int N,M;
    cin>>N;
    stu_date a[N];
    for(int i=0;i<N;i++){
        cin>>a[i].ad_tick_num>>a[i].tri_seat_num>>a[i].exam_seat_num;
    }
    cin>>M;
    int b[M];
     for (int i = 0; i < M; i++) {
        cin >> b[i];
    }
    for (int i = 0; i < M; i++) {
    for (int j = 0; j < N; j++) {
        if (b[i] == a[j].tri_seat_num) {
            cout << a[j].ad_tick_num << " " << a[j].exam_seat_num << endl;
            break;
        }
    }
}
    
    
    return 0;
}

 

哈希表

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

struct Student {
    string admission_ticket_number;
    int trial_seat_number;
    int exam_seat_number;
};

int main() {
    int n;
    cin >> n;
    unordered_map<int, Student> seat_to_student;
    for (int i = 0; i < n; i++) {
        Student s;
        cin >> s.admission_ticket_number >> s.trial_seat_number >> s.exam_seat_number;
        seat_to_student[s.trial_seat_number] = s;
    }
    int m;
    cin >> m;
    for (int i = 0; i < m; i++) {
        int seat;
        cin >> seat;
        auto it = seat_to_student.find(seat);
        if (it != seat_to_student.end()) {
            cout << it->second.admission_ticket_number << " " << it->second.exam_seat_number << endl;
        }
    }
    return 0;
}

 需要注意的是,在使用 unordered_map 时,我们需要保证键值的唯一性。题目中已经给出了保证,即“任何时候都不会把两个人分配到同一个座位上”。

unordered_map怎么用?

当你需要将一个键值和一个值进行映射时,你可以使用 C++ STL 库中的 std::unordered_map,它提供了常数时间(O(1))的查找和插入操作。

下面是一个简单的 std::unordered_map 用法教程:

首先,需要包含 <unordered_map> 头文件:
#include <unordered_map>

然后,使用下面的语法定义一个 std::unordered_map:
std::unordered_map<key_type, value_type> map_name;

其中,key_type 表示键的数据类型,value_type 表示值的数据类型,map_name 是你定义的 std::unordered_map 的名称。

例如,如果你要将字符串映射到整数,可以使用以下语句:

std::unordered_map<std::string, int> my_map;

现在,可以使用以下语句将键值对插入到 std::unordered_map 中:

my_map[key] = value;
其中,key 是键,value 是值。

例如,下面的语句将字符串 "apple" 映射到整数 3:

my_map["apple"] = 3;
你可以使用以下语句从 std::unordered_map 中访问值:

value = my_map[key];
其中,key 是键,value 是值。

例如,下面的语句将打印出字符串 "apple" 对应的值:


std::cout << my_map["apple"] << std::endl;
如果你想检查 std::unordered_map 中是否存在某个键,可以使用以下语句:

if (my_map.find(key) != my_map.end()) {
    // 键存在
} else {
    // 键不存在
}
其中,key 是要查找的键。

如果你想遍历 std::unordered_map 中的所有键值对,可以使用以下语句:

for (auto it = my_map.begin(); it != my_map.end(); ++it) {
    key_type key = it->first;
    value_type value = it->second;
    // 处理键值对
}
其中,it 是一个迭代器,it->first 是键,it->second 是值。

最后,当你不再需要 std::unordered_map 时,可以使用以下语句将其销毁:

my_map.clear();
这些就是 std::unordered_map 的基本用法,希望对你有所帮助!

最后

unordered_map 的内部实现可以使用 hash table。Hash table 是一种基于哈希函数实现的数据结构,可以在常数时间复杂度 O(1) 内完成元素的插入、删除和查找等操作,因此被广泛用于实现关联数组和字典等数据结构。

unordered_map 的底层实现中,会将键(key)和值(value)存储在一个桶(bucket)中。当一个键被插入时,首先会通过哈希函数计算其哈希值(hash value),然后再将键值对存储在哈希值对应的桶中。

由于哈希函数并不是总是能够将键映射到唯一的哈希值,因此可能会出现多个键映射到同一个桶的情况,这就是哈希冲突(hash collision)。当发生哈希冲突时,unordered_map 会使用链表(linked list)或者其他的解决冲突的方法,将多个键值对链接在同一个桶中。

因为哈希表中桶的数量是有限的,当桶中的元素达到一定数量时,就需要重新调整桶的数量,这就是所谓的 rehashing。在进行 rehashing 的时候,unordered_map 会重新计算哈希值,并且将所有的键值对重新分配到新的桶中,以保证哈希表的效率和质量。

unordered_map 的内部实现相对比较复杂,涉及到多个关键技术和算法,包括哈希函数的设计、哈希冲突的解决、rehashing 的实现等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amojiacoco

请我杯饮料吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值