@@ -1821,7 +1821,7 @@
< span class = "md-ellipsis" >
8.3 Top-K 问题
8.3 Top-k 问题
< / span >
@@ -3600,7 +3600,7 @@
<!-- Page content -->
< h1 id = "62" > 6.2 哈希冲突< a class = "headerlink" href = "#62" title = "Permanent link" > ¶ < / a > < / h1 >
< p > 上一节提到,< strong > 通常情况下哈希函数的输入空间远大于输出空间< / strong > ,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一桶索引。< / p >
< p > 哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为解决该问题,我们可以 每当遇到哈希冲突就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。为了提升效率,我们可以采用以下策略。< / p >
< p > 哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为了 解决该问题,每当遇到哈希冲突时,我们 就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。为了提升效率,我们可以采用以下策略。< / p >
< ol >
< li > 改良哈希表数据结构,< strong > 使得哈希表可以在出现哈希冲突时正常工作< / strong > 。< / li >
< li > 仅在必要时,即当哈希冲突比较严重时,才执行扩容操作。< / li >
@@ -3619,8 +3619,8 @@
< / ul >
< p > 链式地址存在以下局限性。< / p >
< ul >
< li > < strong > 占用空间增大< / strong > , 链表包含节点指针,它相比数组更加耗费内存空间。< / li >
< li > < strong > 查询效率降低< / strong > , 因为需要线性遍历链表来查找对应元素。< / li >
< li > < strong > 占用空间增大< / strong > : 链表包含节点指针,它相比数组更加耗费内存空间。< / li >
< li > < strong > 查询效率降低< / strong > : 因为需要线性遍历链表来查找对应元素。< / li >
< / ul >
< p > 以下代码给出了链式地址哈希表的简单实现,需要注意两点。< / p >
< ul >
@@ -3653,11 +3653,11 @@
< a id = "__codelineno-0-21" name = "__codelineno-0-21" href = "#__codelineno-0-21" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " 查询操作" " " < / span >
< a id = "__codelineno-0-22" name = "__codelineno-0-22" href = "#__codelineno-0-22" > < / a > < span class = "n" > index< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > hash_func< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > )< / span >
< a id = "__codelineno-0-23" name = "__codelineno-0-23" href = "#__codelineno-0-23" > < / a > < span class = "n" > bucket< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-0-24" name = "__codelineno-0-24" href = "#__codelineno-0-24" > < / a > < span class = "c1" > # 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-0-24" name = "__codelineno-0-24" href = "#__codelineno-0-24" > < / a > < span class = "c1" > # 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-0-25" name = "__codelineno-0-25" href = "#__codelineno-0-25" > < / a > < span class = "k" > for< / span > < span class = "n" > pair< / span > < span class = "ow" > in< / span > < span class = "n" > bucket< / span > < span class = "p" > :< / span >
< a id = "__codelineno-0-26" name = "__codelineno-0-26" href = "#__codelineno-0-26" > < / a > < span class = "k" > if< / span > < span class = "n" > pair< / span > < span class = "o" > .< / span > < span class = "n" > key< / span > < span class = "o" > ==< / span > < span class = "n" > key< / span > < span class = "p" > :< / span >
< a id = "__codelineno-0-27" name = "__codelineno-0-27" href = "#__codelineno-0-27" > < / a > < span class = "k" > return< / span > < span class = "n" > pair< / span > < span class = "o" > .< / span > < span class = "n" > val< / span >
< a id = "__codelineno-0-28" name = "__codelineno-0-28" href = "#__codelineno-0-28" > < / a > < span class = "c1" > # 若未找到 key 则返回 None< / span >
< a id = "__codelineno-0-28" name = "__codelineno-0-28" href = "#__codelineno-0-28" > < / a > < span class = "c1" > # 若未找到 key , 则返回 None< / span >
< a id = "__codelineno-0-29" name = "__codelineno-0-29" href = "#__codelineno-0-29" > < / a > < span class = "k" > return< / span > < span class = "kc" > None< / span >
< a id = "__codelineno-0-30" name = "__codelineno-0-30" href = "#__codelineno-0-30" > < / a >
< a id = "__codelineno-0-31" name = "__codelineno-0-31" href = "#__codelineno-0-31" > < / a > < span class = "k" > def< / span > < span class = "nf" > put< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "n" > val< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < span class = "p" > ):< / span >
@@ -3749,13 +3749,13 @@
< a id = "__codelineno-1-36" name = "__codelineno-1-36" href = "#__codelineno-1-36" > < / a > < span class = "w" > < / span > < span class = "cm" > /* 查询操作 */< / span >
< a id = "__codelineno-1-37" name = "__codelineno-1-37" href = "#__codelineno-1-37" > < / a > < span class = "w" > < / span > < span class = "n" > string< / span > < span class = "w" > < / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-1-38" name = "__codelineno-1-38" href = "#__codelineno-1-38" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashFunc< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-1-39" name = "__codelineno-1-39" href = "#__codelineno-1-39" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-1-39" name = "__codelineno-1-39" href = "#__codelineno-1-39" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-1-40" name = "__codelineno-1-40" href = "#__codelineno-1-40" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > Pair< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > pair< / span > < span class = "w" > < / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ])< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-1-41" name = "__codelineno-1-41" href = "#__codelineno-1-41" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > pair< / span > < span class = "o" > -> < / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-1-42" name = "__codelineno-1-42" href = "#__codelineno-1-42" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "o" > -> < / span > < span class = "n" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-1-43" name = "__codelineno-1-43" href = "#__codelineno-1-43" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-1-44" name = "__codelineno-1-44" href = "#__codelineno-1-44" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-1-45" name = "__codelineno-1-45" href = "#__codelineno-1-45" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回空字符串< / span >
< a id = "__codelineno-1-45" name = "__codelineno-1-45" href = "#__codelineno-1-45" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回空字符串< / span >
< a id = "__codelineno-1-46" name = "__codelineno-1-46" href = "#__codelineno-1-46" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "s" > " " < / span > < span class = "p" > ;< / span >
< a id = "__codelineno-1-47" name = "__codelineno-1-47" href = "#__codelineno-1-47" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-1-48" name = "__codelineno-1-48" href = "#__codelineno-1-48" > < / a >
@@ -3861,13 +3861,13 @@
< a id = "__codelineno-2-32" name = "__codelineno-2-32" href = "#__codelineno-2-32" > < / a > < span class = "w" > < / span > < span class = "n" > String< / span > < span class = "w" > < / span > < span class = "nf" > get< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-33" name = "__codelineno-2-33" href = "#__codelineno-2-33" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashFunc< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-2-34" name = "__codelineno-2-34" href = "#__codelineno-2-34" > < / a > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Pair< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > .< / span > < span class = "na" > get< / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "p" > );< / span >
< a id = "__codelineno-2-35" name = "__codelineno-2-35" href = "#__codelineno-2-35" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-2-35" name = "__codelineno-2-35" href = "#__codelineno-2-35" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-2-36" name = "__codelineno-2-36" href = "#__codelineno-2-36" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > Pair< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "w" > < / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-37" name = "__codelineno-2-37" href = "#__codelineno-2-37" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "na" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-38" name = "__codelineno-2-38" href = "#__codelineno-2-38" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "na" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-39" name = "__codelineno-2-39" href = "#__codelineno-2-39" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-2-40" name = "__codelineno-2-40" href = "#__codelineno-2-40" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-2-41" name = "__codelineno-2-41" href = "#__codelineno-2-41" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 null< / span >
< a id = "__codelineno-2-41" name = "__codelineno-2-41" href = "#__codelineno-2-41" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 null< / span >
< a id = "__codelineno-2-42" name = "__codelineno-2-42" href = "#__codelineno-2-42" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-43" name = "__codelineno-2-43" href = "#__codelineno-2-43" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-2-44" name = "__codelineno-2-44" href = "#__codelineno-2-44" > < / a >
@@ -3972,13 +3972,13 @@
< a id = "__codelineno-3-31" name = "__codelineno-3-31" href = "#__codelineno-3-31" > < / a > < span class = "w" > < / span > < span class = "cm" > /* 查询操作 */< / span >
< a id = "__codelineno-3-32" name = "__codelineno-3-32" href = "#__codelineno-3-32" > < / a > < span class = "w" > < / span > < span class = "k" > public< / span > < span class = "w" > < / span > < span class = "kt" > string?< / span > < span class = "w" > < / span > < span class = "n" > Get< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-3-33" name = "__codelineno-3-33" href = "#__codelineno-3-33" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > HashFunc< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-3-34" name = "__codelineno-3-34" href = "#__codelineno-3-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-3-34" name = "__codelineno-3-34" href = "#__codelineno-3-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-3-35" name = "__codelineno-3-35" href = "#__codelineno-3-35" > < / a > < span class = "w" > < / span > < span class = "k" > foreach< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > Pair< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "w" > < / span > < span class = "k" > in< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ])< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-3-36" name = "__codelineno-3-36" href = "#__codelineno-3-36" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-3-37" name = "__codelineno-3-37" href = "#__codelineno-3-37" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-3-38" name = "__codelineno-3-38" href = "#__codelineno-3-38" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-3-39" name = "__codelineno-3-39" href = "#__codelineno-3-39" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-3-40" name = "__codelineno-3-40" href = "#__codelineno-3-40" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 null< / span >
< a id = "__codelineno-3-40" name = "__codelineno-3-40" href = "#__codelineno-3-40" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 null< / span >
< a id = "__codelineno-3-41" name = "__codelineno-3-41" href = "#__codelineno-3-41" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "k" > null< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-3-42" name = "__codelineno-3-42" href = "#__codelineno-3-42" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-3-43" name = "__codelineno-3-43" href = "#__codelineno-3-43" > < / a >
@@ -4087,13 +4087,13 @@
< a id = "__codelineno-4-36" name = "__codelineno-4-36" href = "#__codelineno-4-36" > < / a > < span class = "kd" > func< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > m< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "nx" > hashMapChaining< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "nx" > get< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "kt" > string< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-4-37" name = "__codelineno-4-37" href = "#__codelineno-4-37" > < / a > < span class = "w" > < / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > hashFunc< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > )< / span >
< a id = "__codelineno-4-38" name = "__codelineno-4-38" href = "#__codelineno-4-38" > < / a > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > idx< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-4-39" name = "__codelineno-4-39" href = "#__codelineno-4-39" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-4-39" name = "__codelineno-4-39" href = "#__codelineno-4-39" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-4-40" name = "__codelineno-4-40" href = "#__codelineno-4-40" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "nx" > _< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > p< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "k" > range< / span > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-4-41" name = "__codelineno-4-41" href = "#__codelineno-4-41" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "nx" > p< / span > < span class = "p" > .< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-4-42" name = "__codelineno-4-42" href = "#__codelineno-4-42" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "nx" > p< / span > < span class = "p" > .< / span > < span class = "nx" > val< / span >
< a id = "__codelineno-4-43" name = "__codelineno-4-43" href = "#__codelineno-4-43" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-4-44" name = "__codelineno-4-44" href = "#__codelineno-4-44" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-4-45" name = "__codelineno-4-45" href = "#__codelineno-4-45" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回空字符串< / span >
< a id = "__codelineno-4-45" name = "__codelineno-4-45" href = "#__codelineno-4-45" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回空字符串< / span >
< a id = "__codelineno-4-46" name = "__codelineno-4-46" href = "#__codelineno-4-46" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "s" > " " < / span >
< a id = "__codelineno-4-47" name = "__codelineno-4-47" href = "#__codelineno-4-47" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-4-48" name = "__codelineno-4-48" href = "#__codelineno-4-48" > < / a >
@@ -4205,13 +4205,13 @@
< a id = "__codelineno-5-29" name = "__codelineno-5-29" href = "#__codelineno-5-29" > < / a > < span class = "kd" > func< / span > < span class = "nf" > get< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > )< / span > < span class = "p" > -> < / span > < span class = "nb" > String< / span > < span class = "p" > ?< / span > < span class = "p" > {< / span >
< a id = "__codelineno-5-30" name = "__codelineno-5-30" href = "#__codelineno-5-30" > < / a > < span class = "kd" > let< / span > < span class = "nv" > index< / span > < span class = "p" > =< / span > < span class = "n" > hashFunc< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "n" > key< / span > < span class = "p" > )< / span >
< a id = "__codelineno-5-31" name = "__codelineno-5-31" href = "#__codelineno-5-31" > < / a > < span class = "kd" > let< / span > < span class = "nv" > bucket< / span > < span class = "p" > =< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-5-32" name = "__codelineno-5-32" href = "#__codelineno-5-32" > < / a > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-5-32" name = "__codelineno-5-32" href = "#__codelineno-5-32" > < / a > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-5-33" name = "__codelineno-5-33" href = "#__codelineno-5-33" > < / a > < span class = "k" > for< / span > < span class = "n" > pair< / span > < span class = "k" > in< / span > < span class = "n" > bucket< / span > < span class = "p" > {< / span >
< a id = "__codelineno-5-34" name = "__codelineno-5-34" href = "#__codelineno-5-34" > < / a > < span class = "k" > if< / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "p" > ==< / span > < span class = "n" > key< / span > < span class = "p" > {< / span >
< a id = "__codelineno-5-35" name = "__codelineno-5-35" href = "#__codelineno-5-35" > < / a > < span class = "k" > return< / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > val< / span >
< a id = "__codelineno-5-36" name = "__codelineno-5-36" href = "#__codelineno-5-36" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-5-37" name = "__codelineno-5-37" href = "#__codelineno-5-37" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-5-38" name = "__codelineno-5-38" href = "#__codelineno-5-38" > < / a > < span class = "c1" > // 若未找到 key 则返回 nil< / span >
< a id = "__codelineno-5-38" name = "__codelineno-5-38" href = "#__codelineno-5-38" > < / a > < span class = "c1" > // 若未找到 key , 则返回 nil< / span >
< a id = "__codelineno-5-39" name = "__codelineno-5-39" href = "#__codelineno-5-39" > < / a > < span class = "k" > return< / span > < span class = "kc" > nil< / span >
< a id = "__codelineno-5-40" name = "__codelineno-5-40" href = "#__codelineno-5-40" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-5-41" name = "__codelineno-5-41" href = "#__codelineno-5-41" > < / a >
@@ -4307,13 +4307,13 @@
< a id = "__codelineno-6-29" name = "__codelineno-6-29" href = "#__codelineno-6-29" > < / a > < span class = "w" > < / span > < span class = "nx" > get< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-6-30" name = "__codelineno-6-30" href = "#__codelineno-6-30" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > hashFunc< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-6-31" name = "__codelineno-6-31" href = "#__codelineno-6-31" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-6-32" name = "__codelineno-6-32" href = "#__codelineno-6-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-6-32" name = "__codelineno-6-32" href = "#__codelineno-6-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-6-33" name = "__codelineno-6-33" href = "#__codelineno-6-33" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > pair< / span > < span class = "w" > < / span > < span class = "k" > of< / span > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-6-34" name = "__codelineno-6-34" href = "#__codelineno-6-34" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > pair< / span > < span class = "p" > .< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "nx" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-6-35" name = "__codelineno-6-35" href = "#__codelineno-6-35" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "nx" > pair< / span > < span class = "p" > .< / span > < span class = "nx" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-6-36" name = "__codelineno-6-36" href = "#__codelineno-6-36" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-6-37" name = "__codelineno-6-37" href = "#__codelineno-6-37" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-6-38" name = "__codelineno-6-38" href = "#__codelineno-6-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 null< / span >
< a id = "__codelineno-6-38" name = "__codelineno-6-38" href = "#__codelineno-6-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 null< / span >
< a id = "__codelineno-6-39" name = "__codelineno-6-39" href = "#__codelineno-6-39" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-6-40" name = "__codelineno-6-40" href = "#__codelineno-6-40" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-6-41" name = "__codelineno-6-41" href = "#__codelineno-6-41" > < / a >
@@ -4413,13 +4413,13 @@
< a id = "__codelineno-7-29" name = "__codelineno-7-29" href = "#__codelineno-7-29" > < / a > < span class = "w" > < / span > < span class = "nx" > get< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > )< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > string< / span > < span class = "w" > < / span > < span class = "o" > |< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-7-30" name = "__codelineno-7-30" href = "#__codelineno-7-30" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > hashFunc< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-7-31" name = "__codelineno-7-31" href = "#__codelineno-7-31" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-7-32" name = "__codelineno-7-32" href = "#__codelineno-7-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-7-32" name = "__codelineno-7-32" href = "#__codelineno-7-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-7-33" name = "__codelineno-7-33" href = "#__codelineno-7-33" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > pair< / span > < span class = "w" > < / span > < span class = "k" > of< / span > < span class = "w" > < / span > < span class = "nx" > bucket< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-7-34" name = "__codelineno-7-34" href = "#__codelineno-7-34" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > pair< / span > < span class = "p" > .< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "nx" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-7-35" name = "__codelineno-7-35" href = "#__codelineno-7-35" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "nx" > pair< / span > < span class = "p" > .< / span > < span class = "nx" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-7-36" name = "__codelineno-7-36" href = "#__codelineno-7-36" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-7-37" name = "__codelineno-7-37" href = "#__codelineno-7-37" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-7-38" name = "__codelineno-7-38" href = "#__codelineno-7-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 null< / span >
< a id = "__codelineno-7-38" name = "__codelineno-7-38" href = "#__codelineno-7-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 null< / span >
< a id = "__codelineno-7-39" name = "__codelineno-7-39" href = "#__codelineno-7-39" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-7-40" name = "__codelineno-7-40" href = "#__codelineno-7-40" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-7-41" name = "__codelineno-7-41" href = "#__codelineno-7-41" > < / a >
@@ -4519,13 +4519,13 @@
< a id = "__codelineno-8-29" name = "__codelineno-8-29" href = "#__codelineno-8-29" > < / a > < span class = "w" > < / span > < span class = "kt" > String< / span > < span class = "o" > ?< / span > < span class = "w" > < / span > < span class = "kd" > get< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-30" name = "__codelineno-8-30" href = "#__codelineno-8-30" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashFunc< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-8-31" name = "__codelineno-8-31" href = "#__codelineno-8-31" > < / a > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Pair< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-8-32" name = "__codelineno-8-32" href = "#__codelineno-8-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-8-32" name = "__codelineno-8-32" href = "#__codelineno-8-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-8-33" name = "__codelineno-8-33" href = "#__codelineno-8-33" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > Pair< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "w" > < / span > < span class = "k" > in< / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-34" name = "__codelineno-8-34" href = "#__codelineno-8-34" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-35" name = "__codelineno-8-35" href = "#__codelineno-8-35" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > val< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-8-36" name = "__codelineno-8-36" href = "#__codelineno-8-36" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-8-37" name = "__codelineno-8-37" href = "#__codelineno-8-37" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-8-38" name = "__codelineno-8-38" href = "#__codelineno-8-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 null< / span >
< a id = "__codelineno-8-38" name = "__codelineno-8-38" href = "#__codelineno-8-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 null< / span >
< a id = "__codelineno-8-39" name = "__codelineno-8-39" href = "#__codelineno-8-39" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-8-40" name = "__codelineno-8-40" href = "#__codelineno-8-40" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-8-41" name = "__codelineno-8-41" href = "#__codelineno-8-41" > < / a >
@@ -4639,7 +4639,7 @@
< a id = "__codelineno-9-43" name = "__codelineno-9-43" href = "#__codelineno-9-43" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-44" name = "__codelineno-9-44" href = "#__codelineno-9-44" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-45" name = "__codelineno-9-45" href = "#__codelineno-9-45" > < / a >
< a id = "__codelineno-9-46" name = "__codelineno-9-46" href = "#__codelineno-9-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 None< / span >
< a id = "__codelineno-9-46" name = "__codelineno-9-46" href = "#__codelineno-9-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 None< / span >
< a id = "__codelineno-9-47" name = "__codelineno-9-47" href = "#__codelineno-9-47" > < / a > < span class = "w" > < / span > < span class = "nb" > None< / span >
< a id = "__codelineno-9-48" name = "__codelineno-9-48" href = "#__codelineno-9-48" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-49" name = "__codelineno-9-49" href = "#__codelineno-9-49" > < / a >
@@ -4705,14 +4705,14 @@
< a id = "__codelineno-9-109" name = "__codelineno-9-109" href = "#__codelineno-9-109" > < / a > < span class = "w" > < / span > < span class = "kd" > let< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "bp" > self< / span > < span class = "p" > .< / span > < span class = "n" > hash_func< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-9-110" name = "__codelineno-9-110" href = "#__codelineno-9-110" > < / a > < span class = "w" > < / span > < span class = "kd" > let< / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "bp" > self< / span > < span class = "p" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-9-111" name = "__codelineno-9-111" href = "#__codelineno-9-111" > < / a >
< a id = "__codelineno-9-112" name = "__codelineno-9-112" href = "#__codelineno-9-112" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-9-112" name = "__codelineno-9-112" href = "#__codelineno-9-112" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-9-113" name = "__codelineno-9-113" href = "#__codelineno-9-113" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "w" > < / span > < span class = "k" > in< / span > < span class = "w" > < / span > < span class = "n" > bucket< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-9-114" name = "__codelineno-9-114" href = "#__codelineno-9-114" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-9-115" name = "__codelineno-9-115" href = "#__codelineno-9-115" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "nb" > Some< / span > < span class = "p" > (< / span > < span class = "o" > & < / span > < span class = "n" > pair< / span > < span class = "p" > .< / span > < span class = "n" > val< / span > < span class = "p" > );< / span >
< a id = "__codelineno-9-116" name = "__codelineno-9-116" href = "#__codelineno-9-116" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-117" name = "__codelineno-9-117" href = "#__codelineno-9-117" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-118" name = "__codelineno-9-118" href = "#__codelineno-9-118" > < / a >
< a id = "__codelineno-9-119" name = "__codelineno-9-119" href = "#__codelineno-9-119" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回 None< / span >
< a id = "__codelineno-9-119" name = "__codelineno-9-119" href = "#__codelineno-9-119" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回 None< / span >
< a id = "__codelineno-9-120" name = "__codelineno-9-120" href = "#__codelineno-9-120" > < / a > < span class = "w" > < / span > < span class = "nb" > None< / span >
< a id = "__codelineno-9-121" name = "__codelineno-9-121" href = "#__codelineno-9-121" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-9-122" name = "__codelineno-9-122" href = "#__codelineno-9-122" > < / a > < span class = "p" > }< / span >
@@ -4776,7 +4776,7 @@
< a id = "__codelineno-10-55" name = "__codelineno-10-55" href = "#__codelineno-10-55" > < / a > < span class = "cm" > /* 查询操作 */< / span >
< a id = "__codelineno-10-56" name = "__codelineno-10-56" href = "#__codelineno-10-56" > < / a > < span class = "kt" > char< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "nf" > get< / span > < span class = "p" > (< / span > < span class = "n" > HashMapChaining< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > hashMap< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-10-57" name = "__codelineno-10-57" href = "#__codelineno-10-57" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashFunc< / span > < span class = "p" > (< / span > < span class = "n" > hashMap< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > );< / span >
< a id = "__codelineno-10-58" name = "__codelineno-10-58" href = "#__codelineno-10-58" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key 则返回对应 val< / span >
< a id = "__codelineno-10-58" name = "__codelineno-10-58" href = "#__codelineno-10-58" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,若找到 key , 则返回对应 val< / span >
< a id = "__codelineno-10-59" name = "__codelineno-10-59" href = "#__codelineno-10-59" > < / a > < span class = "w" > < / span > < span class = "n" > Node< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > cur< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-10-60" name = "__codelineno-10-60" href = "#__codelineno-10-60" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > cur< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-10-61" name = "__codelineno-10-61" href = "#__codelineno-10-61" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > cur< / span > < span class = "o" > -> < / span > < span class = "n" > pair< / span > < span class = "o" > -> < / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -4784,7 +4784,7 @@
< a id = "__codelineno-10-63" name = "__codelineno-10-63" href = "#__codelineno-10-63" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-10-64" name = "__codelineno-10-64" href = "#__codelineno-10-64" > < / a > < span class = "w" > < / span > < span class = "n" > cur< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > cur< / span > < span class = "o" > -> < / span > < span class = "n" > next< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-10-65" name = "__codelineno-10-65" href = "#__codelineno-10-65" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-10-66" name = "__codelineno-10-66" href = "#__codelineno-10-66" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "s" > " " < / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回空字符串< / span >
< a id = "__codelineno-10-66" name = "__codelineno-10-66" href = "#__codelineno-10-66" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "s" > " " < / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回空字符串< / span >
< a id = "__codelineno-10-67" name = "__codelineno-10-67" href = "#__codelineno-10-67" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-10-68" name = "__codelineno-10-68" href = "#__codelineno-10-68" > < / a >
< a id = "__codelineno-10-69" name = "__codelineno-10-69" href = "#__codelineno-10-69" > < / a > < span class = "cm" > /* 添加操作 */< / span >
@@ -4888,24 +4888,24 @@
< / div >
< p > 值得注意的是,当链表很长时,查询效率 < span class = "arithmatex" > \(O(n)\)< / span > 很差。< strong > 此时可以将链表转换为“AVL 树”或“红黑树”< / strong > ,从而将查询操作的时间复杂度优化至 < span class = "arithmatex" > \(O(\log n)\)< / span > 。< / p >
< h2 id = "622" > 6.2.2 开放寻址< a class = "headerlink" href = "#622" title = "Permanent link" > ¶ < / a > < / h2 >
< p > 「开放寻址 open addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主要包括线性探测、平方探测、 多次哈希等。< / p >
< p > 「开放寻址 open addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主要包括线性探测、平方探测和 多次哈希等。< / p >
< p > 下面以线性探测为例,介绍开放寻址哈希表的工作机制。< / p >
< h3 id = "1" > 1. 线性探测< a class = "headerlink" href = "#1" title = "Permanent link" > ¶ < / a > < / h3 >
< p > 线性探测采用固定步长的线性搜索来进行探测,其操作方法与普通哈希表有所不同。< / p >
< ul >
< li > < strong > 插入元素< / strong > :通过哈希函数计算桶索引,若发现桶内已有元素,则从冲突位置向后线性遍历(步长通常为 < span class = "arithmatex" > \(1\)< / span > ),直至找到空桶,将元素插入其中。< / li >
< li > < strong > 查找元素< / strong > :若发现哈希冲突,则使用相同步长向后线性遍历,直到找到对应元素,返回 < code > value< / code > 即可;如果遇到空桶,说明目标元素不在哈希表中,返回 < span class = "arithmatex" > \(\text{ None}\) < / span > 。< / li >
< li > < strong > 查找元素< / strong > :若发现哈希冲突,则使用相同步长向后进行 线性遍历,直到找到对应元素,返回 < code > value< / code > 即可;如果遇到空桶,说明目标元素不在哈希表中,返回 < code > None< / code > 。< / li >
< / ul >
< p > 图 6-6 展示了开放寻址(线性探测)哈希表的键值对分布。根据此哈希函数,最后两位相同的 < code > key< / code > 都会被映射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。< / p >
< p > < a class = "glightbox" href = "../hash_collision.assets/hash_table_linear_probing.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "开放寻址和 线性探测" class = "animation-figure" src = "../hash_collision.assets/hash_table_linear_probing.png" / > < / a > < / p >
< p align = "center" > 图 6-6 开放寻址和 线性探测 < / p >
< p > < a class = "glightbox" href = "../hash_collision.assets/hash_table_linear_probing.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "开放寻址( 线性探测)哈希表的键值对分布 " class = "animation-figure" src = "../hash_collision.assets/hash_table_linear_probing.png" / > < / a > < / p >
< p align = "center" > 图 6-6 开放寻址( 线性探测)哈希表的键值对分布 < / p >
< p > 然而,< strong > 线性探测容易产生“聚集现象”< / strong > 。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。< / p >
< p > 值得注意的是,< strong > 我们不能在开放寻址哈希表中直接删除元素< / strong > 。这是因为删除元素会在数组内产生一个空桶 < span class = "arithmatex" > \(\text{ None}\) < / span > ,而当查询元素时,线性探测到该空桶就会返回,因此在该空桶之下的元素都无法再被访问到,程序可能误判这些元素不存在。< / p >
< p > 值得注意的是,< strong > 我们不能在开放寻址哈希表中直接删除元素< / strong > 。这是因为删除元素会在数组内产生一个空桶 < code > None< / code > ,而当查询元素时,线性探测到该空桶就会返回,因此在该空桶之下的元素都无法再被访问到,程序可能误判这些元素不存在。< / p >
< p > < a class = "glightbox" href = "../hash_collision.assets/hash_table_open_addressing_deletion.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "在开放寻址中删除元素导致的查询问题" class = "animation-figure" src = "../hash_collision.assets/hash_table_open_addressing_deletion.png" / > < / a > < / p >
< p align = "center" > 图 6-7 在开放寻址中删除元素导致的查询问题 < / p >
< p > 为了解决该问题,我们可以采用「懒删除 lazy deletion」机制:它不直接从哈希表中移除元素,< strong > 而是利用一个常量 < code > TOMBSTONE< / code > 来标记这个桶< / strong > 。在该机制下,< span class = "arithmatex" > \(\text{ None}\) < / span > 和 < code > TOMBSTONE< / code > 都代表空桶,都可以放置键值对。但不同的是,线性探测到 < code > TOMBSTONE< / code > 时应该继续遍历,因为其之下可能还存在键值对。< / p >
< p > 为了解决该问题,我们可以采用「懒删除 lazy deletion」机制:它不直接从哈希表中移除元素,< strong > 而是利用一个常量 < code > TOMBSTONE< / code > 来标记这个桶< / strong > 。在该机制下,< code > None< / code > 和 < code > TOMBSTONE< / code > 都代表空桶,都可以放置键值对。但不同的是,线性探测到 < code > TOMBSTONE< / code > 时应该继续遍历,因为其之下可能还存在键值对。< / p >
< p > 然而,< strong > 懒删除可能会加速哈希表的性能退化< / strong > 。这是因为每次删除操作都会产生一个删除标记,随着 < code > TOMBSTONE< / code > 的增加,搜索时间也会增加,因为线性探测可能需要跳过多个 < code > TOMBSTONE< / code > 才能找到目标元素。< / p >
< p > 为此,考虑在线性探测中记录遇到的首个 < code > TOMBSTONE< / code > 的索引,并将搜索到的目标元素与该 < code > TOMBSTONE< / code > 交换位置。这样做的好处是当每次查询或添加元素时,元素会被移动至距离理想位置(探测起始点)更近的桶,从而优化查询效率。< / p >
< p > 以下代码实现了一个包含懒删除的开放寻址(线性探测)哈希表。为了更加充分地使用哈希表的空间,我们将哈希表看作一个“环形数组”,当越过数组尾部时,回到头部继续遍历。< / p >
@@ -4938,9 +4938,9 @@
< a id = "__codelineno-12-24" name = "__codelineno-12-24" href = "#__codelineno-12-24" > < / a > < span class = "n" > first_tombstone< / span > < span class = "o" > =< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< a id = "__codelineno-12-25" name = "__codelineno-12-25" href = "#__codelineno-12-25" > < / a > < span class = "c1" > # 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-12-26" name = "__codelineno-12-26" href = "#__codelineno-12-26" > < / a > < span class = "k" > while< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< a id = "__codelineno-12-27" name = "__codelineno-12-27" href = "#__codelineno-12-27" > < / a > < span class = "c1" > # 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-12-27" name = "__codelineno-12-27" href = "#__codelineno-12-27" > < / a > < span class = "c1" > # 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-12-28" name = "__codelineno-12-28" href = "#__codelineno-12-28" > < / a > < span class = "k" > if< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > key< / span > < span class = "o" > ==< / span > < span class = "n" > key< / span > < span class = "p" > :< / span >
< a id = "__codelineno-12-29" name = "__codelineno-12-29" href = "#__codelineno-12-29" > < / a > < span class = "c1" > # 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-12-29" name = "__codelineno-12-29" href = "#__codelineno-12-29" > < / a > < span class = "c1" > # 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-12-30" name = "__codelineno-12-30" href = "#__codelineno-12-30" > < / a > < span class = "k" > if< / span > < span class = "n" > first_tombstone< / span > < span class = "o" > !=< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< a id = "__codelineno-12-31" name = "__codelineno-12-31" href = "#__codelineno-12-31" > < / a > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > first_tombstone< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-12-32" name = "__codelineno-12-32" href = "#__codelineno-12-32" > < / a > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > TOMBSTONE< / span >
@@ -4949,7 +4949,7 @@
< a id = "__codelineno-12-35" name = "__codelineno-12-35" href = "#__codelineno-12-35" > < / a > < span class = "c1" > # 记录遇到的首个删除标记< / span >
< a id = "__codelineno-12-36" name = "__codelineno-12-36" href = "#__codelineno-12-36" > < / a > < span class = "k" > if< / span > < span class = "n" > first_tombstone< / span > < span class = "o" > ==< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "ow" > and< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "ow" > is< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > :< / span >
< a id = "__codelineno-12-37" name = "__codelineno-12-37" href = "#__codelineno-12-37" > < / a > < span class = "n" > first_tombstone< / span > < span class = "o" > =< / span > < span class = "n" > index< / span >
< a id = "__codelineno-12-38" name = "__codelineno-12-38" href = "#__codelineno-12-38" > < / a > < span class = "c1" > # 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-12-38" name = "__codelineno-12-38" href = "#__codelineno-12-38" > < / a > < span class = "c1" > # 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-12-39" name = "__codelineno-12-39" href = "#__codelineno-12-39" > < / a > < span class = "n" > index< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "o" > %< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > capacity< / span >
< a id = "__codelineno-12-40" name = "__codelineno-12-40" href = "#__codelineno-12-40" > < / a > < span class = "c1" > # 若 key 不存在,则返回添加点的索引< / span >
< a id = "__codelineno-12-41" name = "__codelineno-12-41" href = "#__codelineno-12-41" > < / a > < span class = "k" > return< / span > < span class = "n" > index< / span > < span class = "k" > if< / span > < span class = "n" > first_tombstone< / span > < span class = "o" > ==< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "k" > else< / span > < span class = "n" > first_tombstone< / span >
@@ -5054,9 +5054,9 @@
< a id = "__codelineno-13-39" name = "__codelineno-13-39" href = "#__codelineno-13-39" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-13-40" name = "__codelineno-13-40" href = "#__codelineno-13-40" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-13-41" name = "__codelineno-13-41" href = "#__codelineno-13-41" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "k" > nullptr< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-13-42" name = "__codelineno-13-42" href = "#__codelineno-13-42" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-13-42" name = "__codelineno-13-42" href = "#__codelineno-13-42" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-13-43" name = "__codelineno-13-43" href = "#__codelineno-13-43" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > -> < / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-13-44" name = "__codelineno-13-44" href = "#__codelineno-13-44" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-13-44" name = "__codelineno-13-44" href = "#__codelineno-13-44" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-13-45" name = "__codelineno-13-45" href = "#__codelineno-13-45" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-13-46" name = "__codelineno-13-46" href = "#__codelineno-13-46" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-13-47" name = "__codelineno-13-47" href = "#__codelineno-13-47" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5068,7 +5068,7 @@
< a id = "__codelineno-13-53" name = "__codelineno-13-53" href = "#__codelineno-13-53" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-13-54" name = "__codelineno-13-54" href = "#__codelineno-13-54" > < / a > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-13-55" name = "__codelineno-13-55" href = "#__codelineno-13-55" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-13-56" name = "__codelineno-13-56" href = "#__codelineno-13-56" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-13-56" name = "__codelineno-13-56" href = "#__codelineno-13-56" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-13-57" name = "__codelineno-13-57" href = "#__codelineno-13-57" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "n" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-13-58" name = "__codelineno-13-58" href = "#__codelineno-13-58" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-13-59" name = "__codelineno-13-59" href = "#__codelineno-13-59" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5181,9 +5181,9 @@
< a id = "__codelineno-14-29" name = "__codelineno-14-29" href = "#__codelineno-14-29" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-14-30" name = "__codelineno-14-30" href = "#__codelineno-14-30" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-14-31" name = "__codelineno-14-31" href = "#__codelineno-14-31" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > index< / span > < span class = "o" > ]< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-14-32" name = "__codelineno-14-32" href = "#__codelineno-14-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-14-32" name = "__codelineno-14-32" href = "#__codelineno-14-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-14-33" name = "__codelineno-14-33" href = "#__codelineno-14-33" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > index< / span > < span class = "o" > ]< / span > < span class = "p" > .< / span > < span class = "na" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-14-34" name = "__codelineno-14-34" href = "#__codelineno-14-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-14-34" name = "__codelineno-14-34" href = "#__codelineno-14-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-14-35" name = "__codelineno-14-35" href = "#__codelineno-14-35" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-14-36" name = "__codelineno-14-36" href = "#__codelineno-14-36" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "o" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > index< / span > < span class = "o" > ]< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-14-37" name = "__codelineno-14-37" href = "#__codelineno-14-37" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > index< / span > < span class = "o" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5195,7 +5195,7 @@
< a id = "__codelineno-14-43" name = "__codelineno-14-43" href = "#__codelineno-14-43" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "o" > [< / span > < span class = "n" > index< / span > < span class = "o" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-14-44" name = "__codelineno-14-44" href = "#__codelineno-14-44" > < / a > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-14-45" name = "__codelineno-14-45" href = "#__codelineno-14-45" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-14-46" name = "__codelineno-14-46" href = "#__codelineno-14-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-14-46" name = "__codelineno-14-46" href = "#__codelineno-14-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-14-47" name = "__codelineno-14-47" href = "#__codelineno-14-47" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "n" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-14-48" name = "__codelineno-14-48" href = "#__codelineno-14-48" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-14-49" name = "__codelineno-14-49" href = "#__codelineno-14-49" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5306,9 +5306,9 @@
< a id = "__codelineno-15-29" name = "__codelineno-15-29" href = "#__codelineno-15-29" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-15-30" name = "__codelineno-15-30" href = "#__codelineno-15-30" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-15-31" name = "__codelineno-15-31" href = "#__codelineno-15-31" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "k" > null< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-15-32" name = "__codelineno-15-32" href = "#__codelineno-15-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-15-32" name = "__codelineno-15-32" href = "#__codelineno-15-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-15-33" name = "__codelineno-15-33" href = "#__codelineno-15-33" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ].< / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-15-34" name = "__codelineno-15-34" href = "#__codelineno-15-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-15-34" name = "__codelineno-15-34" href = "#__codelineno-15-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-15-35" name = "__codelineno-15-35" href = "#__codelineno-15-35" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-15-36" name = "__codelineno-15-36" href = "#__codelineno-15-36" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-15-37" name = "__codelineno-15-37" href = "#__codelineno-15-37" > < / a > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5320,7 +5320,7 @@
< a id = "__codelineno-15-43" name = "__codelineno-15-43" href = "#__codelineno-15-43" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-15-44" name = "__codelineno-15-44" href = "#__codelineno-15-44" > < / a > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-15-45" name = "__codelineno-15-45" href = "#__codelineno-15-45" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-15-46" name = "__codelineno-15-46" href = "#__codelineno-15-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-15-46" name = "__codelineno-15-46" href = "#__codelineno-15-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-15-47" name = "__codelineno-15-47" href = "#__codelineno-15-47" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "n" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-15-48" name = "__codelineno-15-48" href = "#__codelineno-15-48" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-15-49" name = "__codelineno-15-49" href = "#__codelineno-15-49" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5441,7 +5441,7 @@
< a id = "__codelineno-16-39" name = "__codelineno-16-39" href = "#__codelineno-16-39" > < / a > < span class = "w" > < / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > hashFunc< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > )< / span >
< a id = "__codelineno-16-40" name = "__codelineno-16-40" href = "#__codelineno-16-40" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,从 index 开始向后遍历< / span >
< a id = "__codelineno-16-41" name = "__codelineno-16-41" href = "#__codelineno-16-41" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "p" > < < / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "o" > ++< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-16-42" name = "__codelineno-16-42" href = "#__codelineno-16-42" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-16-42" name = "__codelineno-16-42" href = "#__codelineno-16-42" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-16-43" name = "__codelineno-16-43" href = "#__codelineno-16-43" > < / a > < span class = "w" > < / span > < span class = "nx" > j< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span >
< a id = "__codelineno-16-44" name = "__codelineno-16-44" href = "#__codelineno-16-44" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到空桶,说明无此 key ,则返回 null< / span >
< a id = "__codelineno-16-45" name = "__codelineno-16-45" href = "#__codelineno-16-45" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > j< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > pair< / span > < span class = "p" > {})< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -5452,7 +5452,7 @@
< a id = "__codelineno-16-50" name = "__codelineno-16-50" href = "#__codelineno-16-50" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > j< / span > < span class = "p" > ].< / span > < span class = "nx" > val< / span >
< a id = "__codelineno-16-51" name = "__codelineno-16-51" href = "#__codelineno-16-51" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-16-52" name = "__codelineno-16-52" href = "#__codelineno-16-52" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-16-53" name = "__codelineno-16-53" href = "#__codelineno-16-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key 则返回空字符串< / span >
< a id = "__codelineno-16-53" name = "__codelineno-16-53" href = "#__codelineno-16-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若未找到 key , 则返回空字符串< / span >
< a id = "__codelineno-16-54" name = "__codelineno-16-54" href = "#__codelineno-16-54" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "s" > " " < / span >
< a id = "__codelineno-16-55" name = "__codelineno-16-55" href = "#__codelineno-16-55" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-16-56" name = "__codelineno-16-56" href = "#__codelineno-16-56" > < / a >
@@ -5465,7 +5465,7 @@
< a id = "__codelineno-16-63" name = "__codelineno-16-63" href = "#__codelineno-16-63" > < / a > < span class = "w" > < / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > hashFunc< / span > < span class = "p" > (< / span > < span class = "nx" > key< / span > < span class = "p" > )< / span >
< a id = "__codelineno-16-64" name = "__codelineno-16-64" href = "#__codelineno-16-64" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,从 index 开始向后遍历< / span >
< a id = "__codelineno-16-65" name = "__codelineno-16-65" href = "#__codelineno-16-65" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "p" > < < / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "o" > ++< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-16-66" name = "__codelineno-16-66" href = "#__codelineno-16-66" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-16-66" name = "__codelineno-16-66" href = "#__codelineno-16-66" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-16-67" name = "__codelineno-16-67" href = "#__codelineno-16-67" > < / a > < span class = "w" > < / span > < span class = "nx" > j< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span >
< a id = "__codelineno-16-68" name = "__codelineno-16-68" href = "#__codelineno-16-68" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到空桶、或带有删除标记的桶,则将键值对放入该桶< / span >
< a id = "__codelineno-16-69" name = "__codelineno-16-69" href = "#__codelineno-16-69" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > j< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > pair< / span > < span class = "p" > {})< / span > < span class = "w" > < / span > < span class = "o" > ||< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > j< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > removed< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -5490,7 +5490,7 @@
< a id = "__codelineno-16-88" name = "__codelineno-16-88" href = "#__codelineno-16-88" > < / a > < span class = "w" > < / span > < span class = "c1" > // 遍历桶,从中删除键值对< / span >
< a id = "__codelineno-16-89" name = "__codelineno-16-89" href = "#__codelineno-16-89" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,从 index 开始向后遍历< / span >
< a id = "__codelineno-16-90" name = "__codelineno-16-90" href = "#__codelineno-16-90" > < / a > < span class = "w" > < / span > < span class = "k" > for< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "p" > < < / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span > < span class = "p" > ;< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "o" > ++< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-16-91" name = "__codelineno-16-91" href = "#__codelineno-16-91" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-16-91" name = "__codelineno-16-91" href = "#__codelineno-16-91" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-16-92" name = "__codelineno-16-92" href = "#__codelineno-16-92" > < / a > < span class = "w" > < / span > < span class = "nx" > j< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > idx< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span >
< a id = "__codelineno-16-93" name = "__codelineno-16-93" href = "#__codelineno-16-93" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到空桶,说明无此 key ,则直接返回< / span >
< a id = "__codelineno-16-94" name = "__codelineno-16-94" href = "#__codelineno-16-94" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "nx" > m< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > j< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > pair< / span > < span class = "p" > {})< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -5570,9 +5570,9 @@
< a id = "__codelineno-17-33" name = "__codelineno-17-33" href = "#__codelineno-17-33" > < / a > < span class = "kd" > var< / span > < span class = "nv" > firstTombstone< / span > < span class = "p" > =< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< a id = "__codelineno-17-34" name = "__codelineno-17-34" href = "#__codelineno-17-34" > < / a > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-17-35" name = "__codelineno-17-35" href = "#__codelineno-17-35" > < / a > < span class = "k" > while< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > !=< / span > < span class = "kc" > nil< / span > < span class = "p" > {< / span >
< a id = "__codelineno-17-36" name = "__codelineno-17-36" href = "#__codelineno-17-36" > < / a > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-17-36" name = "__codelineno-17-36" href = "#__codelineno-17-36" > < / a > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-17-37" name = "__codelineno-17-37" href = "#__codelineno-17-37" > < / a > < span class = "k" > if< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > !< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "p" > ==< / span > < span class = "n" > key< / span > < span class = "p" > {< / span >
< a id = "__codelineno-17-38" name = "__codelineno-17-38" href = "#__codelineno-17-38" > < / a > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-17-38" name = "__codelineno-17-38" href = "#__codelineno-17-38" > < / a > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-17-39" name = "__codelineno-17-39" href = "#__codelineno-17-39" > < / a > < span class = "k" > if< / span > < span class = "n" > firstTombstone< / span > < span class = "o" > !=< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > {< / span >
< a id = "__codelineno-17-40" name = "__codelineno-17-40" href = "#__codelineno-17-40" > < / a > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "p" > =< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-17-41" name = "__codelineno-17-41" href = "#__codelineno-17-41" > < / a > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "p" > =< / span > < span class = "n" > TOMBSTONE< / span >
@@ -5584,7 +5584,7 @@
< a id = "__codelineno-17-47" name = "__codelineno-17-47" href = "#__codelineno-17-47" > < / a > < span class = "k" > if< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ==< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "o" > & & < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "p" > ==< / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > {< / span >
< a id = "__codelineno-17-48" name = "__codelineno-17-48" href = "#__codelineno-17-48" > < / a > < span class = "n" > firstTombstone< / span > < span class = "p" > =< / span > < span class = "n" > index< / span >
< a id = "__codelineno-17-49" name = "__codelineno-17-49" href = "#__codelineno-17-49" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-17-50" name = "__codelineno-17-50" href = "#__codelineno-17-50" > < / a > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-17-50" name = "__codelineno-17-50" href = "#__codelineno-17-50" > < / a > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-17-51" name = "__codelineno-17-51" href = "#__codelineno-17-51" > < / a > < span class = "n" > index< / span > < span class = "p" > =< / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "o" > %< / span > < span class = "n" > capacity< / span >
< a id = "__codelineno-17-52" name = "__codelineno-17-52" href = "#__codelineno-17-52" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-17-53" name = "__codelineno-17-53" href = "#__codelineno-17-53" > < / a > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5699,9 +5699,9 @@
< a id = "__codelineno-18-33" name = "__codelineno-18-33" href = "#__codelineno-18-33" > < / a > < span class = "w" > < / span > < span class = "kd" > let< / span > < span class = "w" > < / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mf" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-18-34" name = "__codelineno-18-34" href = "#__codelineno-18-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-18-35" name = "__codelineno-18-35" href = "#__codelineno-18-35" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !==< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-18-36" name = "__codelineno-18-36" href = "#__codelineno-18-36" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-18-36" name = "__codelineno-18-36" href = "#__codelineno-18-36" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-18-37" name = "__codelineno-18-37" href = "#__codelineno-18-37" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ].< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "nx" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-18-38" name = "__codelineno-18-38" href = "#__codelineno-18-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-18-38" name = "__codelineno-18-38" href = "#__codelineno-18-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-18-39" name = "__codelineno-18-39" href = "#__codelineno-18-39" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-18-40" name = "__codelineno-18-40" href = "#__codelineno-18-40" > < / a > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-18-41" name = "__codelineno-18-41" href = "#__codelineno-18-41" > < / a > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5716,7 +5716,7 @@
< a id = "__codelineno-18-50" name = "__codelineno-18-50" href = "#__codelineno-18-50" > < / a > < span class = "w" > < / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-18-51" name = "__codelineno-18-51" href = "#__codelineno-18-51" > < / a > < span class = "w" > < / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-18-52" name = "__codelineno-18-52" href = "#__codelineno-18-52" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-18-53" name = "__codelineno-18-53" href = "#__codelineno-18-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-18-53" name = "__codelineno-18-53" href = "#__codelineno-18-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-18-54" name = "__codelineno-18-54" href = "#__codelineno-18-54" > < / a > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "err" > #< / span > < span class = "nx" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-18-55" name = "__codelineno-18-55" href = "#__codelineno-18-55" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-18-56" name = "__codelineno-18-56" href = "#__codelineno-18-56" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5840,9 +5840,9 @@
< a id = "__codelineno-19-33" name = "__codelineno-19-33" href = "#__codelineno-19-33" > < / a > < span class = "w" > < / span > < span class = "kd" > let< / span > < span class = "w" > < / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mf" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-19-34" name = "__codelineno-19-34" href = "#__codelineno-19-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-19-35" name = "__codelineno-19-35" href = "#__codelineno-19-35" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !==< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-36" name = "__codelineno-19-36" href = "#__codelineno-19-36" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-19-36" name = "__codelineno-19-36" href = "#__codelineno-19-36" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-19-37" name = "__codelineno-19-37" href = "#__codelineno-19-37" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ]< / span > < span class = "o" > !< / span > < span class = "p" > .< / span > < span class = "nx" > key< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "nx" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-38" name = "__codelineno-19-38" href = "#__codelineno-19-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-19-38" name = "__codelineno-19-38" href = "#__codelineno-19-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-19-39" name = "__codelineno-19-39" href = "#__codelineno-19-39" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-40" name = "__codelineno-19-40" href = "#__codelineno-19-40" > < / a > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-19-41" name = "__codelineno-19-41" href = "#__codelineno-19-41" > < / a > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > buckets< / span > < span class = "p" > [< / span > < span class = "nx" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5857,7 +5857,7 @@
< a id = "__codelineno-19-50" name = "__codelineno-19-50" href = "#__codelineno-19-50" > < / a > < span class = "w" > < / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-51" name = "__codelineno-19-51" href = "#__codelineno-19-51" > < / a > < span class = "w" > < / span > < span class = "nx" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-19-52" name = "__codelineno-19-52" href = "#__codelineno-19-52" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-19-53" name = "__codelineno-19-53" href = "#__codelineno-19-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-19-53" name = "__codelineno-19-53" href = "#__codelineno-19-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-19-54" name = "__codelineno-19-54" href = "#__codelineno-19-54" > < / a > < span class = "w" > < / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > .< / span > < span class = "nx" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-19-55" name = "__codelineno-19-55" href = "#__codelineno-19-55" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-19-56" name = "__codelineno-19-56" href = "#__codelineno-19-56" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -5977,9 +5977,9 @@
< a id = "__codelineno-20-29" name = "__codelineno-20-29" href = "#__codelineno-20-29" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-20-30" name = "__codelineno-20-30" href = "#__codelineno-20-30" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-20-31" name = "__codelineno-20-31" href = "#__codelineno-20-31" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "kc" > null< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-20-32" name = "__codelineno-20-32" href = "#__codelineno-20-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-20-32" name = "__codelineno-20-32" href = "#__codelineno-20-32" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-20-33" name = "__codelineno-20-33" href = "#__codelineno-20-33" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > !< / span > < span class = "p" > .< / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-20-34" name = "__codelineno-20-34" href = "#__codelineno-20-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-20-34" name = "__codelineno-20-34" href = "#__codelineno-20-34" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-20-35" name = "__codelineno-20-35" href = "#__codelineno-20-35" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-20-36" name = "__codelineno-20-36" href = "#__codelineno-20-36" > < / a > < span class = "w" > < / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-20-37" name = "__codelineno-20-37" href = "#__codelineno-20-37" > < / a > < span class = "w" > < / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > _TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -5991,7 +5991,7 @@
< a id = "__codelineno-20-43" name = "__codelineno-20-43" href = "#__codelineno-20-43" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "m" > 1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > _buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > _TOMBSTONE< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-20-44" name = "__codelineno-20-44" href = "#__codelineno-20-44" > < / a > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-20-45" name = "__codelineno-20-45" href = "#__codelineno-20-45" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-20-46" name = "__codelineno-20-46" href = "#__codelineno-20-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-20-46" name = "__codelineno-20-46" href = "#__codelineno-20-46" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-20-47" name = "__codelineno-20-47" href = "#__codelineno-20-47" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "n" > _capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-20-48" name = "__codelineno-20-48" href = "#__codelineno-20-48" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-20-49" name = "__codelineno-20-49" href = "#__codelineno-20-49" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -6125,7 +6125,7 @@
< a id = "__codelineno-21-52" name = "__codelineno-21-52" href = "#__codelineno-21-52" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "n" > first_tombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "bp" > self< / span > < span class = "p" > .< / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "bp" > self< / span > < span class = "p" > .< / span > < span class = "n" > TOMBSTONE< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-21-53" name = "__codelineno-21-53" href = "#__codelineno-21-53" > < / a > < span class = "w" > < / span > < span class = "n" > first_tombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "kt" > i32< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-21-54" name = "__codelineno-21-54" href = "#__codelineno-21-54" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-21-55" name = "__codelineno-21-55" href = "#__codelineno-21-55" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-21-55" name = "__codelineno-21-55" href = "#__codelineno-21-55" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-21-56" name = "__codelineno-21-56" href = "#__codelineno-21-56" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "bp" > self< / span > < span class = "p" > .< / span > < span class = "n" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-21-57" name = "__codelineno-21-57" href = "#__codelineno-21-57" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-21-58" name = "__codelineno-21-58" href = "#__codelineno-21-58" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -6261,9 +6261,9 @@
< a id = "__codelineno-22-50" name = "__codelineno-22-50" href = "#__codelineno-22-50" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-22-51" name = "__codelineno-22-51" href = "#__codelineno-22-51" > < / a > < span class = "w" > < / span > < span class = "c1" > // 线性探测,当遇到空桶时跳出< / span >
< a id = "__codelineno-22-52" name = "__codelineno-22-52" href = "#__codelineno-22-52" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "nb" > NULL< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-22-53" name = "__codelineno-22-53" href = "#__codelineno-22-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应桶索引< / span >
< a id = "__codelineno-22-53" name = "__codelineno-22-53" href = "#__codelineno-22-53" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若遇到 key ,返回对应的 桶索引< / span >
< a id = "__codelineno-22-54" name = "__codelineno-22-54" href = "#__codelineno-22-54" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > -> < / span > < span class = "n" > key< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > key< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-22-55" name = "__codelineno-22-55" href = "#__codelineno-22-55" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引< / span >
< a id = "__codelineno-22-55" name = "__codelineno-22-55" href = "#__codelineno-22-55" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若之前遇到了删除标记,则将键值对移动至该索引处 < / span >
< a id = "__codelineno-22-56" name = "__codelineno-22-56" href = "#__codelineno-22-56" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > !=< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-22-57" name = "__codelineno-22-57" href = "#__codelineno-22-57" > < / a > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > firstTombstone< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ];< / span >
< a id = "__codelineno-22-58" name = "__codelineno-22-58" href = "#__codelineno-22-58" > < / a > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > ;< / span >
@@ -6275,7 +6275,7 @@
< a id = "__codelineno-22-64" name = "__codelineno-22-64" href = "#__codelineno-22-64" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > -1< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > buckets< / span > < span class = "p" > [< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > TOMBSTONE< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-22-65" name = "__codelineno-22-65" href = "#__codelineno-22-65" > < / a > < span class = "w" > < / span > < span class = "n" > firstTombstone< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-22-66" name = "__codelineno-22-66" href = "#__codelineno-22-66" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-22-67" name = "__codelineno-22-67" href = "#__codelineno-22-67" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部返回头部< / span >
< a id = "__codelineno-22-67" name = "__codelineno-22-67" href = "#__codelineno-22-67" > < / a > < span class = "w" > < / span > < span class = "c1" > // 计算桶索引,越过尾部则 返回头部< / span >
< a id = "__codelineno-22-68" name = "__codelineno-22-68" href = "#__codelineno-22-68" > < / a > < span class = "w" > < / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "w" > < / span > < span class = "o" > +< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "o" > %< / span > < span class = "w" > < / span > < span class = "n" > hashMap< / span > < span class = "o" > -> < / span > < span class = "n" > capacity< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-22-69" name = "__codelineno-22-69" href = "#__codelineno-22-69" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< a id = "__codelineno-22-70" name = "__codelineno-22-70" href = "#__codelineno-22-70" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 key 不存在,则返回添加点的索引< / span >
@@ -6392,8 +6392,8 @@
< h3 id = "3" > 3. 多次哈希< a class = "headerlink" href = "#3" title = "Permanent link" > ¶ < / a > < / h3 >
< p > 顾名思义,多次哈希方法使用多个哈希函数 < span class = "arithmatex" > \(f_1(x)\)< / span > 、< span class = "arithmatex" > \(f_2(x)\)< / span > 、< span class = "arithmatex" > \(f_3(x)\)< / span > 、< span class = "arithmatex" > \(\dots\)< / span > 进行探测。< / p >
< ul >
< li > < strong > 插入元素< / strong > :若哈希函数 < span class = "arithmatex" > \(f_1(x)\)< / span > 出现冲突,则尝试 < span class = "arithmatex" > \(f_2(x)\)< / span > ,以此类推,直到找到空桶 后插入元素。< / li >
< li > < strong > 查找元素< / strong > :在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空桶 或已尝试所有哈希函数,说明哈希表中不存在该元素,则返回 < span class = "arithmatex" > \(\text{ None}\) < / span > 。< / li >
< li > < strong > 插入元素< / strong > :若哈希函数 < span class = "arithmatex" > \(f_1(x)\)< / span > 出现冲突,则尝试 < span class = "arithmatex" > \(f_2(x)\)< / span > ,以此类推,直到找到空位 后插入元素。< / li >
< li > < strong > 查找元素< / strong > :在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位 或已尝试所有哈希函数,说明哈希表中不存在该元素,则返回 < code > None< / code > 。< / li >
< / ul >
< p > 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。< / p >
< div class = "admonition tip" >
@@ -6403,9 +6403,9 @@
< h2 id = "623" > 6.2.3 编程语言的选择< a class = "headerlink" href = "#623" title = "Permanent link" > ¶ < / a > < / h2 >
< p > 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。< / p >
< ul >
< li > Python 采用开放寻址。字典 dict 使用伪随机数进行探测。< / li >
< li > Java 采用链式地址。自 JDK 1.8 以来,当 HashMap 内数组长度达到 64 且链表长度达到 8 时,链表会转换为红黑树以提升查找性能。< / li >
< li > Go 采用链式地址。Go 规定每个桶最多存储 8 个键值对,超出容量则连接一个溢出桶。 当溢出桶过多时,会执行一次特殊的等量扩容操作,以确保性能。< / li >
< li > Python 采用开放寻址。字典 < code > dict < / code > 使用伪随机数进行探测。< / li >
< li > Java 采用链式地址。自 JDK 1.8 以来,当 < code > HashMap < / code > 内数组长度达到 64 且链表长度达到 8 时,链表会转换为红黑树以提升查找性能。< / li >
< li > Go 采用链式地址。Go 规定每个桶最多存储 8 个键值对,超出容量则连接一个溢出桶; 当溢出桶过多时,会执行一次特殊的等量扩容操作,以确保性能。< / li >
< / ul >
<!-- Source file information -->