# Hash Table# Data Structure# Set

a175 - 撒旦玩不玩骰子?

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一個簡單的 Hash Table,並實現插入、刪除和輸出功能。Hash Table 使用 mod m 的方式將數字分到 m 個區間,每個區間使用 set 儲存數字,以確保區間內的數字有序且不重複。

解題思路

使用一個 tb 結構,其中包含一個 set<int>,用於儲存每個區間的數字。程式首先讀取操作次數 k 和模數 m。然後,迴圈執行 k 次操作。

  • 如果操作是 1,則讀取一個數字 n,計算 n % m 作為區間索引,並將 n 插入到對應區間的 set 中。如果 n 已經存在,則不進行插入。
  • 如果操作是 2,則讀取一個數字 n,計算 n % m 作為區間索引,並從對應區間的 set 中刪除 n。如果 n 不存在,則不進行刪除。
  • 如果操作是 3,則輸出整個 Hash Table。對於每個區間,輸出區間索引和該區間 set 中的所有數字,數字之間用 " -> " 分隔,最後用 "NULL" 結尾。

複雜度分析

  • 時間複雜度: O(k * log m),其中 k 是操作次數,m 是模數。插入和刪除操作在 set 中的時間複雜度為 O(log m),輸出操作的時間複雜度為 O(m)。
  • 空間複雜度: O(m),因為 Hash Table 儲存了 m 個區間,每個區間使用 set 儲存數字。

程式碼

#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