为什么使用哈希表
判断现有数据集合中是否有这个元素,或者是否有满足条件的元素。
其中的 Hash 算法则可以帮助我们判断是否有这个元素,虽然功能简单,但是其 O(1)
时间复杂度是具有高性能的。通过在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。相比普通的查找算法来说,仅仅在比较的环节,就会大大减少查找或映射所需要的时间。
散列
c++
const int MOD=P;
int Hx(int n)
{
return n%MOD;
}
Java
final Integer MOD=P;
Integer Hx(int n)
{
return n%MOD;
}
python
MOD=P #由于Python不含常量,我们这里就不做修饰
Hx(n):
global MOD
return n%MOD
代码实现
#include <iostream>
#include <stack>
using namespace std;
const int h = 12582917;
string Value[h];
string UpValue[h];
int UpValueCount = 0;
int Hx(string s)
{
int n = s.size();
int sum1 = 0;
for (int i = 0; i < n; i++)
{
sum1 = sum1 * 131 % h + (s[i] - 'a' + 1) % h;
}
return (sum1 + h) % h;
}
bool isAt(string s)
{
int n = Hx(s);
if (Value[n] == "")
return false;
else if (Value[n] == s)
return true;
else
{
for (int i = 0; i < UpValueCount; i++)
if (UpValue[n] == s)
return true;
return false;
}
}
bool in(string s)
{
int n = Hx(s);
if (Value[n] == "")
{
Value[n] = s;
return true;
}
else if (Value[n] == s)
return false;
else
{
for (int i = 0; i < UpValueCount; i++)
if (UpValue[n] == s)
return false;
UpValue[UpValueCount++] = s;
return true;
}
}
int main()
{
int n;
string ans = "NO";
cin >> n;
for (int i = 0; i < n; i++)
{
string word;
cin >> word;
if (!in(word))
{
cout << word << endl;
return 0;
}
}
cout << ans << endl;
}