在回答数据结构算法问题时,如果我们使用Hashtable(比如Java的集合框架中的那个)来解决问题,我们应该考虑Hashtable的基本复杂性还是我们可以安全地将其假设为O(1)?
我见过很多帖子,它被视为O(1),但我想知道为什么我们忽略底层操作,比如运行以获取给定键的值的哈希算法,由Java执行?
答案 0 :(得分:2)
要回答您的问题,您必须考虑哈希表的实际工作方式。 HashTables本质上是将键映射到其值的数组。数组中每个键的位置取决于散列函数(散列函数将输入映射到单个输出值)。我们假设散列函数是O(1)。
插入值
如果我们想在哈希表中插入一些东西,我们使用键上的散列函数(f)来找到存储它的地方,然后我们将值存储在该位置。每次我们在数组中插入一些内容时,由于散列函数为O(1),因此需要O(1)时间。在哈希表中搜索值也是如此。
搜索值
如果我们想要搜索 x 值,我们必须求解 f(x),它会告诉我们 x 的位置在哈希表中。这意味着搜索哈希表也将是O(1)。
承认潜在的复杂性:
上面的答案都是正确的,但前提是散列函数永远不会为任何给定的输入产生相同的输出(这可能很难实现)。这意味着散列函数有时会使用替代方法来避免此类冲突。这些替代方法通常是O(1)到达第一个位置,但是会调用其他操作(例如线性搜索)以找到空位置。
本质上,哈希表操作(插入和搜索)是O(1),但是在表中存在冲突(多个键指向同一位置)的情况下,这些操作可能需要更长的时间。