我正在为将来的面试而学习,我想知道一些事情。 我有一个由六个字符串组成的数组,我想知道是否有某种方法 在O(1)中找到其中一个像Hash表一样。 例如,假设我们提前有以下字符串。
char* massageOp[6] = {"SIL","TAG","SILA","TAGS","AVS", "AVST"};
现在用户给了我一个字符串,任何字符串,我想知道如果我能在我的数组中找到字符串,或者在O(1)中找不到。有没有办法做到这一点,或者我需要通过所有数组来找到它? 感谢。
答案 0 :(得分:3)
这取决于你如何定义O(1),就像Oli提到的那样。如果你想要一个EXPECTED O(1)(回想一下,哈希表可能有冲突,并且很难估计最坏情况的复杂性),那么字符串数量的时间复杂度就会增加。使用一些好的字符串哈希算法来解决问题会很容易,例如,我们可能会使用ELFHash:
int ELFhash(char* key, long M) {
unsigned long h = 0;
while(*key) {
h = (h << 4) + *key++;
unsigned long g = h & 0xF0000000L;
if (g) h ^= g >> 24;
h &= ~g;
}
return h % M;
}
使用此ELFHash函数将字符串作为“键”并将大素数作为“M”,您可以获得一个整数值,该值是字符串的哈希值。您还可以使用其他一些字符串散列函数,您可以在此处找到一些讨论:Hashing Tutorial
答案 1 :(得分:1)
除非你将所有元素都放入哈希值,否则不能,并且平均大小写将始终为O(n)。如果将它们放入哈希中,您可以在O(1)时间内查找它们(如果您的哈希算法很差,则会减慢)。