# Hash Table# Data Structure# Simulation

a174 - 上帝玩不玩骰子?

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一個簡單的雜湊表。雜湊表使用模運算將數字分配到不同的區間,並支持插入、刪除和輸出整個雜湊表的功能。插入時,如果數字已經存在,則忽略插入操作。刪除時,如果數字不存在,則忽略刪除操作。

解題思路

使用一個 set 的陣列來模擬雜湊表。陣列的索引代表雜湊表的區間,每個區間使用 set 儲存該區間內的數字。set 確保了區間內的數字是有序的,並且可以方便地進行插入和刪除操作。 對於每個操作:

  1. 如果操作是 1,則計算數字模 m 的值,將數字插入對應區間的 set 中。
  2. 如果操作是 2,則計算數字模 m 的值,從對應區間的 set 中刪除數字。
  3. 如果操作是 3,則遍歷整個雜湊表,輸出每個區間的數字(由小到大)。

複雜度分析

  • 時間複雜度: O(k * (1 + log m)),其中 k 是操作的數量,m 是雜湊表的區間數量。插入和刪除操作在 set 中的時間複雜度是 O(log m),輸出操作的時間複雜度是 O(m)。
  • 空間複雜度: O(m * n),其中 m 是雜湊表的區間數量,n 是每個區間中儲存的數字的最大數量。

程式碼

#include <iostream>
#include <set>
using namespace std;
struct tb{
	set <int> index;
};
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int k,m,is,n;
	while(cin >> k >> m){
		tb a[m];
		while(k--){
			cin >> is;
			if(is == 1){
				cin >> n;
				a[n%m].index.insert(n);
			}
			else if(is == 2){
				cin >> n;
				a[n%m].index.erase(n);
			}
			else{
				cout << "===== s =====\n";
				for(int i=0;i<m;++i){
					cout << "[" << i/100 << (i%100)/10 << i%10 << "]:";
					for(auto j=a[i].index.begin();j!=a[i].index.end();++j){
						cout << *j << " -> ";
					}
					cout << "NULL\n";
				}
				cout << "===== e =====\n";
			}
		}
	}
}

Discussion