面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭精确查找类似Bug,利用 标记数据排除潜在误报 通过修复率等参数对分析 器进行综合评价 降低感知误报率 方法5:防止误标和作弊 标记量,间隔时间,标记内容 用基线数据训练模型 用聚类和离群检测找到违反者 红黑榜鼓励参与者 降低感知误报率 用数据风控的方式管理 总结:代码评审中的静态分析 无需额外操作,不改变程序员习惯的流程 只分析变化的代码引起的问题 0 码力 | 39 页 | 6.88 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版叫自身來解決問題。它主要包含兩個階段。 1. 遞:程式不斷深入地呼叫自身,通常傳入更小或更簡化的參數,直到達到“終止條件”。 2. 迴:觸發“終止條件”後,程式從最深層的遞迴函式開始逐層返回,匯聚每一層的結果。 而從實現的角度看,遞迴程式碼主要包含三個要素。 1. 終止條件:用於決定什麼時候由“遞”轉“迴”。 2. 遞迴呼叫:對應“遞”,函式呼叫自身,通常輸入更小或更簡化的參數。 3. 。 圖 6‑6 開放定址(線性探查)雜湊表的鍵值對分佈 然而,線性探查容易產生“聚集現象”。具體來說,陣列中連續被佔用的位置越長,這些連續位置發生雜湊衝 突的可能性越大,從而進一步促使該位置的聚堆積生長,形成惡性迴圈,最終導致增刪查改操作效率劣化。 值得注意的是,我們不能在開放定址雜湊表中直接刪除元素。這是因為刪除元素會在陣列內產生一個空桶 None ,而當查詢元素時,線性探查到該空桶就 27, 30, 33, … } hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, … } 如果輸入 key 恰好滿足這種等差數列的資料分佈,那麼雜湊值就會出現聚堆積,從而加重雜湊衝突。現在, 假設將 modulus 替換為質數 13 ,由於 key 和 modulus 之間不存在公約數,因此輸出的雜湊值的均勻性會明 顯提升。 modulus = 130 码力 | 379 页 | 18.79 MB | 10 月前3
Hello 算法 1.0.0b4 C++版时,该空位可能导致 程序误判元素不存在。为此,通常需要借助一个标志位来标记已删除元素。 ‧ 容易产生聚集。数组内连续被占用位置越长,这些连续位置发生哈希冲突的可能性越大,进一步促使这 一位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 以下代码实现了一个简单的开放寻址(线性探测)哈希表。值得注意两点: 6. 散列表 hello‑algo.com 103 ‧ 我们使用一个固定的键值对实例 27, 30, 33, ⋯} hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, ⋯} 如果输入 key 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假设 将 modulus 替换为质数 13 ,由于 key 和 modulus 之间不存在公约数,输出的哈希值的均匀性会明显提升。 6. 散列表 hello‑algo.com 冲突元素存储在同一个链表中。然而,链表过长会降低查 询效率,可以进一步将链表转换为红黑树来提高效率。 ‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚 集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算 量。 ‧ 不同编程语言采取了不同的哈希表实现。例如,Java 的 HashMap 使用链式地址,而 Python0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版。 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻址哈希表中直接删除元素。这是因为删除元素会在数组内产生一个空桶 None ,而当查询元素时,线性探测到该空桶就会 27, 30, 33, … } hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, … } 如果输入 key 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假 设将 modulus 替换为质数 13 ,由于 key 和 modulus 之间不存在公约数,因此输出的哈希值的均匀性会明显 提升。 modulus = 13 key 元素存储在同一个链表中。然而,链表过长会降低查 询效率,可以通过进一步将链表转换为红黑树来提高效率。 ‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚 集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算 量。 ‧ 不同编程语言采取了不同的哈希表实现。例如,Java 的 HashMap 使用链式地址,而 Python0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版时,该空位可能导致 程序误判元素不存在。为此,通常需要借助一个标志位来标记已删除元素。 ‧ 容易产生聚集。数组内连续被占用位置越长,这些连续位置发生哈希冲突的可能性越大,进一步促使这 一位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 以下代码实现了一个简单的开放寻址(线性探测)哈希表。 ‧ 我们使用一个固定的键值对实例 removed 来标记已删除元素。也就是说,当一个桶内的元素为 27, 30, 33, … } hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, … } 如果输入 key 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假设 将 modulus 替换为质数 13 ,由于 key 和 modulus 之间不存在公约数,输出的哈希值的均匀性会明显提升。 modulus = 13 key = 冲突元素存储在同一个链表中。然而,链表过长会降低查 询效率,可以进一步将链表转换为红黑树来提高效率。 ‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚 集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算 量。 ‧ 不同编程语言采取了不同的哈希表实现。例如,Java 的 HashMap 使用链式地址,而 Python0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0 C++版。 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻址哈希表中直接删除元素。这是因为删除元素会在数组内产生一个空桶 None ,而当查询元素时,线性探测到该空桶就会 27, 30, 33, … } hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, … } 如果输入 key 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假 设将 modulus 替换为质数 13 ,由于 key 和 modulus 之间不存在公约数,因此输出的哈希值的均匀性会明显 提升。 modulus = 13 key 元素存储在同一个链表中。然而,链表过长会降低查 询效率,可以通过进一步将链表转换为红黑树来提高效率。 ‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚 集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算 量。 ‧ 不同编程语言采取了不同的哈希表实现。例如,Java 的 HashMap 使用链式地址,而 Python0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版。 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻址哈希表中直接删除元素。这是因为删除元素会在数组内产生一个空桶 None ,而当查询元素时,线性探测到该空桶就会 27, 30, 33, … } hash = {0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, … } 如果输入 key 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假 设将 modulus 替换为质数 13 ,由于 key 和 modulus 之间不存在公约数,因此输出的哈希值的均匀性会明显 提升。 modulus = 13 key 元素存储在同一个链表中。然而,链表过长会降低查 询效率,可以通过进一步将链表转换为红黑树来提高效率。 ‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚 集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算 量。 ‧ 不同编程语言采取了不同的哈希表实现。例如,Java 的 HashMap 使用链式地址,而 Python0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b1 C++版为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 ?1(?) , ?2(?) , ?3(?) , ⋯ 进行探测。 6. 散列表 hello‑algo0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版认为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。数组内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步 促进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 ?1(?) , ?2(?) , ?3(?) , ⋯ 进行探测。 插入元素:若哈希函数 ?1(0 码力 | 197 页 | 15.72 MB | 1 年前3
共 9 条
- 1













