如何在O(1)中的数组中查找字符串

时间:2011-11-14 22:26:47

标签: c arrays string

我正在为将来的面试而学习,我想知道一些事情。 我有一个由六个字符串组成的数组,我想知道是否有某种方法 在O(1)中找到其中一个像Hash表一样。 例如,假设我们提前有以下字符串。

char* massageOp[6] = {"SIL","TAG","SILA","TAGS","AVS", "AVST"};

现在用户给了我一个字符串,任何字符串,我想知道如果我能在我的数组中找到字符串,或者在O(1)中找不到。有没有办法做到这一点,或者我需要通过所有数组来找到它? 感谢。

2 个答案:

答案 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)时间内查找它们(如果您的哈希算法很差,则会减慢)。