问题:用 C# 编写代码来散列一个键数组,并用它们的散列代码显示它们。
答:哈希表是一种广泛使用的数据结构,用于存储以其哈希码索引的值(即键)。哈希码是哈希函数的结果,用作存储键的索引值。如果两个不同的键散列到相同的值,这种情况称为冲突,一个好的散列函数最大限度地减少冲突。
问题:如何选择适合数据的哈希函数?
答:如果您的数据由整数组成,那么最简单的哈希函数是返回键除法的余数和表的大小。将表的大小保持为质数很重要。但是可以编写更复杂的函数来避免冲突。如果您的数据由字符串组成,那么您可以将字母表的所有 ASCII 值相加,并用表格的大小对总和进行模运算(下面的代码描述了相同的内容)。
示例 1:
// C# Program to create a Hash
// Function for String data
using System;
class Geeks {
// Main Method
public static void Main(String []args)
{
// Declaring the an string array
string[] values = new string[50];
string str;
// Values of the keys stored
string[] keys = new string[] {"Alphabets",
"Roman", "Numbers", "Alphanumeric",
"Tallypoints"};
int hashCode;
for (int k = 0; k < 5; k++) {
str = keys[k];
// calling HashFunction
hashCode = HashFunction(str, values);
// Storing keys at their hashcode's index
values[hashCode] = str;
}
// Displaying Hashcodes along with key values
for (int k = 0; k < (values.GetUpperBound(0)); k++) {
if (values[k] != null)
Console.WriteLine(k + " " + values[k]);
}
}
// Defining the hash function
static int HashFunction(string s, string[] array)
{
int total = 0;
char[] c;
c = s.ToCharArray();
// Summing up all the ASCII values
// of each alphabet in the string
for (int k = 0; k <= c.GetUpperBound(0); k++)
total += (int)c[k];
return total % array.GetUpperBound(0);
}
}
输出:
11 Tallypoints
16 Alphanumeric
19 Roman
34 Alphabets
46 Numbers
示例 2:
// C# Program to create a Hash
// Function for String data
using System;
class Geeks {
// Main Method
public static void Main(String []args)
{
// Declaring the an string array
string[] values = new string[50];
string str;
// Values of the keys stored
string[] keys = new string[] {"C", "C++",
"Java", "Python", "C#", "HTML"};
int hashCode;
for (int k = 0; k < 5; k++) {
str = keys[k];
hashCode = HashFunction2(str, values);
// Storing keys at their hashcode's index
values[hashCode] = str;
}
// Displaying Hashcodes along with key values
for (int k = 0; k < (values.GetUpperBound(0)); k++) {
if (values[k] != null)
Console.WriteLine(k + " " + values[k]);
}
}
// Defining the hash function
static int HashFunction2(string s, string[] array)
{
long total = 0;
char[] c;
c = s.ToCharArray();
// Horner's rule for generating a polynomial
// of 11 using ASCII values of the characters
for (int k = 0; k <= c.GetUpperBound(0); k++)
total += 11 * total + (int)c[k];
total = total % array.GetUpperBound(0);
if (total < 0)
total += array.GetUpperBound(0);
return (int)total;
}
}
输出:
6 C#
15 C++
18 C
19 Python
28 Java
解释:在散列函数,我们通过参数作为要被散列的字符串和字符串数据“价值”。该方法ToCharArray将字符串转换为字符数组,然后我们开始从开始到字符数组的末尾环。在 for 循环中,我们计算数组中每个字符的 ASCII 值的总和。 GetUpperBound 方法返回数组最高索引的值。然后哈希函数通过数组的上限返回总和的模(在本例中为 49,因为字符串[] values = new 字符串[50] )。而在HashFunction2 中,我们传递相同的参数,但此函数不太可能发生冲突。除了这里我们使用霍纳规则来计算 11 的多项式函数之外,一切都基本相同。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。