# Hash Table# Greedy# Data Structure

b512 - 高維度稀疏向量

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩個高維度稀疏向量的內積。向量以 "dim:value" 的形式表示,其中 dim 是維度,value 是該維度的值。輸入以 "0:0" 結束。

解題思路

這題的核心在於處理稀疏向量,避免不必要的計算。程式使用 map 資料結構來儲存非零元素的維度和值。首先,讀取第一個向量,將非零元素儲存在 map 中。然後,讀取第二個向量,對於每個非零元素,檢查它是否存在於第一個向量的 map 中。如果存在,則將兩個向量對應維度的值相乘,加到總和 sum 中。最後輸出 sum

複雜度分析

  • 時間複雜度: O(n + m),其中 n 和 m 分別是兩個向量中非零元素的數量。map 的查找、插入操作平均時間複雜度為 O(1)。
  • 空間複雜度: O(n + m),用於儲存兩個向量的非零元素。

程式碼

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
	long long int sum=0;
	string a;
	map <string,long long int> va;
	while(cin >> a){
		if(a=="0:0")break;
		string b;
		long long int i,c=0;
		for(i=0;a[i]!=':';i++)
			b+=a[i];
		for(i++;i<a.length();i++){
			c*=10;
			c+=(a[i]-48);
		}
		va[b]=c;
	}
	while(cin >> a){
		if(a=="0:0")break;
		string b;
		long long int i,c=0;
		for(i=0;a[i]!=':';i++)
			b+=a[i];
		if(va.find(b)!=va.end()){
			for(i++;i<a.length();i++){
				c*=10;
				c+=(a[i]-48);
			}
			sum+=va[b]*c;
		} 
	}
	cout << sum << "\n";
}

Discussion