目录
暴力算法
时间复杂度为 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 的实现等等。