封闭地址散列期间的比较次数?

Number of comparison during a a closed address hashing?

最初,散列 table 中的所有条目都是空列表。 所有哈希地址为i的元素都会被插入到链表h[i]中。如果发生冲突,在对键进行哈希处理时,键将被添加到链表的末尾。

一般搜索成功的情况,比较h[i]是否为null的时候算i吗?如果它为空,则表示链表为空,应该 return 未找到。应该是1比较还是0比较?在复杂性方面。

抱歉这个愚蠢的问题,我还在学习算法的复杂性。

0 次比较。如果在 h[i] 你看到一个条目的列表并且这是一个命中(因为你分析了成功的搜索),这将是 1 次比较,依此类推。

对于 "big-O" 复杂度,这并不重要,因为不存在 "O(2N+1)" 复杂度(来自计算元素和指针比较)——它简化为 O(N),其中N 是桶中元素的数量 h[i]。或者,您可能会说跨桶的平均大 O 复杂度为 O(N),其中 N 为 size / buckets,又名 负载系数.

如果您不进行大 O 复杂性分析,我们无法真正告诉您您想计算什么。我要指出的是,比较指向 nullptr 的指针比涉及额外级别间接或沿大对象扫描的对象比较便宜得多(例如 std::string 对象对于任何短字符串优化缓冲区来说太长了), 所以经常被忽略。

如果对想要的内容有疑问,我建议您按照 "searching for an element that's not present involves N object value comparisons and N+1 pointer comparisons, where N is the number of elements chained from h[i]".

中的比较报告

如果您必须只给出一个表达式(例如,一些计算机化的多项选择测试),我建议元素比较的计数可能是所需的答案 - 值比较的次数(即 0 表示空哈希桶),因为最常见的是对作为数据元素数量函数的复杂性感兴趣。