您有一个已知大小为 n 的键的数组或列表。不知道这个列表中有多少个唯一键,可能小到 0,大到包括 n。键没有特定的顺序,它们实际上不可能,因为这些键没有大于或小于的概念,只有相等或不等。现在在你说哈希映射之前,我认为还有一个条件会影响这个想法:每个键的值都是私有的。您可以获得的有关密钥的唯一信息是它是否等于另一个密钥。所以基本上:
class key{
private:
T data;
...
public:
...
bool operator==(const key &k){return data==k.data}
bool operator!=(const key &k){return data!=k.data}
};
key array[n];
现在,有没有一种算法可以确定数组中超过一半的键是否在线性时间内是相同的键?如果不是,那么 O(n*log(n)) 呢?因此,例如说数组只有 3 个唯一键。数组的 60% 填充有 key.data==foo、30% key.data==bar 和 10% key.data==derp 的键。该算法只需要确定超过 50% 的键是同一类型的(具有 data==foo 的键)并返回其中一个键。
根据我的教授的说法,它可以在 O(n) 时间内完成,但他说我们只需要找到一个可以在 O(n*log(n)) 时间内完成的任务。