【數據結構】樹哈希

目錄

  • 一、樹的同構
    • 1. 定義
    • 2. 具體理解
      • (1) 結點對應
      • (2) 孩子相同
      • (3) 遞歸性質
    • 3. 示例
  • 二、樹哈希
    • 1.定義
    • 2.哈希過程
      • (1)葉節點哈希
      • (2)非葉節點哈希
      • (3)組合哈希值
    • 3.性質
    • 4.應用
    • 5.示例
      • (1)*first step*
      • (2)*second step*
      • (3)*third step*


一、樹的同構

樹的同構是一個重要的概念,以下是關于樹的同構的詳細定義:

1. 定義

給定兩棵樹 T 1 T1 T1 T 2 T2 T2,如果 T 1 T1 T1可以通過若干次左右孩子互換就變成 T 2 T2 T2,則稱這兩棵樹是“同構”的。這意味著,兩棵樹中的每兩個對應結點的孩子必須相同,但左右位置可以不一樣。

2. 具體理解

(1) 結點對應

兩棵樹中的結點需要一一對應,即每一個結點都有一個與之對應的結點,且這些對應結點的需要相等。

(2) 孩子相同

對應結點的孩子(即子結點)必須相同,也就是說,對應結點左孩子和右孩子的數量和值都要相等,但它們的左右位置可以互換。

(3) 遞歸性質

由于樹是遞歸定義的,因此樹的同構也具有遞歸性質。即,如果兩棵樹的根結點對應,且它們的左子樹和右子樹(不考慮左右順序)分別同構,則這兩棵樹就是同構的。

3. 示例

例如,有以下兩棵樹:

  • A A A:根結點為 1 1 1,左子結點為 2 2 2,右子結點為 3 3 3
  • B B B:根結點為 1 1 1,左子結點為 3 3 3,右子結點為 2 2 2

雖然樹 A A A和樹 B B B的左右子結點位置不同,但它們的根結點值相同,且左子結點和右子結點的值也相同(只是位置互換),因此可以認為這兩棵樹是同構的。

綜上所述,樹的同構是一個基于結點對應和孩子相同(左右位置可互換)的遞歸概念。

二、樹哈希

樹哈希(Tree Hash)是對樹形數據結構進行哈希處理的一種方法。以下是對樹哈希的詳細解釋:

1.定義

樹哈希是一種哈希算法,它通過對樹形數據結構中的每個節點進行哈希計算,并將這些哈希值組合起來,以生成整個樹的唯一哈希值。這個哈希值可以作為樹的“數字指紋”,用于快速比較兩棵樹是否相同或檢測樹的修改。

2.哈希過程

(1)葉節點哈希

首先,對樹中的每個葉節點進行哈希計算,生成葉節點的哈希值。這些哈希值通常作為葉節點的標簽或標識符。

(2)非葉節點哈希

對于非葉節點(包括中間節點和根節點),它們的哈希值是通過對其子節點的哈希值進行進一步哈希計算得到的。具體來說,可以將子節點的哈希值作為輸入,應用哈希函數來生成非葉節點的哈希值。

(3)組合哈希值

在生成非葉節點的哈希值時,通常需要按照一定的順序或規則來組合其子節點的哈希值。這可以確保哈希值的唯一性和一致性。

3.性質

(1) 唯一性 \red{\texttt{唯一性}} 唯一性

對于不同的樹形數據結構,即使它們包含相同的節點和邊,但只要結構不同(例如節點的排列順序不同),它們的哈希值也將不同。

(2)快速比較

通過比較兩棵樹的哈希值,可以快速判斷它們是否相同。如果哈希值相同,則兩棵樹在結構上必然相同;如果哈希值不同,則兩棵樹在結構上必然不同。

(3)檢測修改

哈希值對樹的修改非常敏感。即使對樹中的某個節點進行微小的修改(例如更改節點的值或添加/刪除節點),也會導致整個樹的哈希值發生變化。

4.應用

例如算法優化,在算法設計中,樹哈希可以用于優化某些算法的性能。例如,在字符串匹配算法中,可以使用樹哈希來快速比較兩個字符串的子串是否相同。

5.示例

假設有以下樹形數據結構:

我們可以按照以下步驟計算整個樹的哈希值:

(1)first step

計算葉節點 D D D E E E C C C的哈希值,分別記為 H ( D ) H(D) H(D) H ( E ) H(E) H(E) H ( C ) H(C) H(C)

(2)second step

計算非葉節點 B B B的哈希值,可以使用 H ( B ) = H a s h ( H ( D ) + H ( E ) ) H(B)=Hash(H(D) + H(E)) H(B)=Hash(H(D)+H(E))(這里的“ + + +”表示哈希值的組合方式,可以是拼接、異或等操作)。

(3)third step

計算根節點 A A A的哈希值,可以使用 H ( A ) = H a s h ( H ( B ) + H ( C ) ) H(A)=Hash(H(B) + H(C)) H(A)=Hash(H(B)+H(C))

最終,整個樹的哈希值就是 H ( A ) H(A) H(A)

綜上所述,樹哈希是一種強大的工具,可以用于快速比較和檢測樹形數據結構的完整性和一致性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/68159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/68159.shtml
英文地址,請注明出處:http://en.pswp.cn/web/68159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用DeepSeek的技巧筆記

來源:新年逼自己一把,學會使用DeepSeek R1_嗶哩嗶哩_bilibili 前言 對于DeepSeek而言,我們不再需要那么多的提示詞技巧,但還是要有兩個注意點:你需要理解大語言模型的工作原理與局限,這能幫助你更好的知道AI可完成任務…

【工具篇】ChatGPT:開啟人工智能新紀元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒體界,還是咱們普通人的日常聊天里,都能聽到它的大名。好多人都在討論,這 ChatGPT 到底是個啥 “神器”,能讓大家這么著迷?今天咱就好好嘮嘮。 ChatGPT,全稱是 Chat Generative Pre-trained Trans…

【centOS】搭建公司內網git環境-GitLab 社區版(GitLab CE)

1. 安裝必要的依賴 以 CentOS 7 系統為例,安裝必要的依賴包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 倉庫 curl -sS https:/…

$route 和 $router 的區別是什么?

在 Vue Router 中,$route 和 $router 是兩個不同的對象,它們各自承擔著不同的角色。下面是它們的主要區別: 一、$route 定義$route 是當前路由的信息對象,包含了與當前路由相關的狀態和參數。它是一個只讀對象。 2. 主要屬性 params:動態路由參數,例如 /user/:id 中的 …

node.js 08 express的使用和熱重載nodemon的安裝

一.express的安裝和使用 安裝 npm i express 使用 //引入express const express require(express)//啟動服務器 const app express()//設置get請求地址,獲取請求地址信息,和發送返回的數據 app.get(/bailan,(req, res) > {//req.query可以獲取到客…

Python因為網絡原因安裝依賴庫報錯

現象 在終端運行以下指令 pip install pyautogui pillow keyboard 出現報錯,終端信息如下: PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…

面試問題記錄1

問題一:性能測試步驟 性能測試步驟主要包括以下幾個階段: ?1. 需求分析階段? 明確測試目標,了解性能測試需求,包括業務列表、性能指標、測試環境、數據量等詳細需求?12。熟悉項目相關的資源,如架構設計、軟硬件環…

開源 GPU 集群管理器 GPUStack 輕松拉起deepseek各版本模型

GPUStack 是一個用于運行 AI 模型的開源 GPU 集群管理器。 項目地址:gpustack/gpustack: Manage GPU clusters for running AI modelshttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://githu…

ESP32開發學習記錄---》GPIO

she 2025年2月5日,新年后決定開始充電提升自己,故作此記,以前沒有使用過IDF開發ESP32因此新年學習一下ESP32。 ESPIDF開發環境配置網上已經有很多的資料了,我就不再贅述,我這里只是對我的學習經歷的一些記錄。 首先學習一個…

3-kafka服務端之控制器

文章目錄 概述控制器的選舉與故障恢復控制器的選舉故障恢復 優雅關閉分區leader的選舉 概述 在Kafka集群中會有一個或多個broker,其中有一個broker會被選舉為控制器(Kafka Controler),它負責管理整個集群中所有分區和副本的狀態。…

物聯網的三層架構:感知層、網絡層與應用層

物聯網(Internet of Things, IoT)作為現代科技的重要組成部分,正在深刻改變我們的生活和工作方式。它將物理世界與數字世界無縫連接,通過智能設備、傳感器和網絡技術,實現數據的采集、傳輸和應用。物聯網的架構通常分為…

react的antd表單校驗,禁止輸入空格并觸發校驗提示

首先需要用到form組件&#xff0c;在form.item內添加rules屬性&#xff0c;寫正則表達式 <Form.Itemlabel"員工姓名"name"name"rules{[{ required: true, message: 員工姓名 },{ pattern: /^(?!\s*$).$/, message: 不能全是空格 },]}> <Input p…

JavaScript addEventListener事件列表

addEventListener 方法用于向指定元素添加事件監聽器&#xff0c;當該對象觸發指定的事件時&#xff0c;指定的回調函數就會被執行。以下是一些常見的事件類型 鼠標事件 click: 當用戶點擊某個對象時觸發。 dblclick: 當用戶雙擊某個對象時觸發。 contextmenu&#xff1a;當…

IDEA 中集成 Maven,配置環境、創建以及導入項目

目錄 在 IntelliJ IDEA 中集成 Maven 并配置環境 1. 打開 IDEA 設置 2. 定位 Maven 配置選項 3. 配置 Maven 路徑 4. 應用配置 創建 Maven 項目 1. 新建項目 2. 選擇項目類型 3. 配置項目信息 4. 確認 Maven 設置 5. 完成項目創建 導入 Maven 項目 1. 打開導入窗口…

神經網絡常見激活函數 1-sigmoid函數

sigmoid 1 函數求導 sigmoid函數 σ ( x ) 1 1 e ( ? x ) \sigma(x) \frac{1}{1e^{(-x)}} σ(x)1e(?x)1? sigmoid函數求導 d d x σ ( x ) d d x ( 1 1 e ? x ) e ? x ( 1 e ? x ) 2 ( 1 e ? x ) ? 1 ( 1 e ? x ) 2 1 1 e ? x ? 1 ( 1 e ? x ) 2 …

窮舉vs暴搜vs深搜vs回溯vs剪枝系列一>黃金礦工

目錄 決策樹&#xff1a;代碼設計代碼&#xff1a; 決策樹&#xff1a; 代碼設計 代碼&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

rabbitMQ消息轉換器

消息轉換器 Spring的消息發送代碼接收的消息體是一個Object&#xff1a; 而在數據傳輸時&#xff0c;它會把你發送的消息序列化為字節發送給MQ&#xff0c;接收消息的時候&#xff0c;還會把字節反序列化為Java對象。 只不過&#xff0c;默認情況下Spring采用的序列化方式是J…

Java 如何覆蓋第三方 jar 包中的類

目錄 一、需求描述二、示例描述三、操作步驟四、驗證結果五、實現原理 背景&#xff1a; 在我們日常的開發中&#xff0c;經常需要使用第三方的 jar 包&#xff0c;有時候我們會發現第三方的 jar 包中的某一個類有問題&#xff0c;或者我們需要定制化修改其中的邏輯&#xff0c…

CS 與 BS 架構的差異

在數字化的今天&#xff0c;選擇軟件架構模式對系統的性能、維護、安全和成本都有很大影響。BS架構和CS架構是最常見的兩種模式&#xff0c;了解它們的區別和特點對開發人員和企業決策者都很重要。 CS架構最早出現&#xff0c;當時用戶直接從主機獲取數據。隨著客戶端和服務端…

HTML之table表格學習

HTML table使用 thead、tbody、tfoot均可省略&#xff1b; 瀏覽器解析的時候會自動套上tbody tr 行 td 列 th 標題列屬性 colspan 列占用數 rowspan 行占用數 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…