最優編碼樹的雙子性

現在看一些書,不太愿意在書上面做一些標記,也沒啥特殊的原因。。哈哈。

樹的定義

無環連通圖,極小連通圖,極大無環圖。

某個節點,描述它的度,一般默認是出度,分叉的邊的條數。或者說孩子的個數。孩子和后代是不一樣的,注意區分。

長度

路徑長度就是邊數,直觀上也是這樣。應該不難理解。

深度和高度

規定根節點的深度為 0 ,空樹的高度為 -1 .

一個問題

d e p t h ( v ) + h e i g h t ( v ) ≤ h e i g h t ( T ) depth(v) + height(v) \leq height(T) depth(v)+height(v)height(T)
什么時候取等號,v 表示的是任意一個節點, T 表示的是根節點。當 v 所在的子樹的最深的葉節點是全樹最深的葉節點的時候,取到等號。

內部節點

我們發現,一些定義假設不是非常清晰,實際上,自己內心是感覺沒有完全掌握這些知識點的,內部節點是指除了葉節點之外的所有節點,也包括根節點。這里沒有考慮極端情況。極端情況只有一個根節點,根節點是內部節點,也是葉節點。

二叉樹

二叉樹的定義是節點的度不超過 2 , 也就是說不一定要求嚴格是二叉,一叉也是二叉樹,零叉也是二叉樹。

有序多叉樹可以轉換為二叉樹

也就是說,二叉樹可以很簡潔地刻畫有序多叉樹,類似,我寫一萬字,描述清楚一個知識點,一個大佬兩百字描述清楚一個知識點,功能上面都是一致的。轉換的步驟就是,首先把有序多叉樹的長子保留,假設最左邊的孩子就是長子,然后把其他的邊的斷掉,斷掉邊不是舍棄孩子,舍棄孩子就會損失一些重要信息。然后把長子和親兄弟連接起來。一定是要連接親兄弟。然后對新的二叉樹做適當的旋轉,注意是有序的多叉樹,所以右邊的孩子一般比左邊的孩子更大一些,根據這個條件來進行旋轉,就能得到一個我們肉眼看上去像二叉樹的結構,當然實際上這個就是二叉樹。

二叉樹的高度

h + 1 ≤ n ≤ 2 h + 1 ? 1 h + 1 \leq n \leq 2^{h + 1 } - 1 h+1n2h+1?1
左側取等號是二叉樹是單鏈的情況。右側取等號是滿二叉樹的情況。單鏈的二叉樹并不一定是左側鏈或者右側鏈,可以是兩者的結合,只要最后是單鏈就好。從你的全世界路過里面不是說,只要最后是你就好,么。

練習

非常奇怪,比如說數學練習題,就只有幾個,一個章節可能一二十個練習題,為什么大家的最后的成績差距非常大呢。難道是因為天賦么,可是就這么點考試題就真的能判斷一個人的天賦嗎。哈哈哈。早幾天看了一篇推文,說是看起來非常扎實穩的人,最后居然沒有上岸。我感覺是我本人,非常慌,于是取關了那個博主。假努力,他才是假努力呢,我是真努力。

最優編碼樹的雙子性

什么是最優編碼樹,什么是雙子性。假設真是自己需要理解的知識點,我感覺一個字都不能復制,可能每個字都需要形成自己的理解,才能把里面的邏輯關系搞清楚。我感覺一個練習題的質量的一個重要評價標準就是能不能綜合很多知識點,或者需要極多的前置知識(前置知識也屬于考試范圍內的,不屬于超綱范圍這種),我把這個部分的標題作為我這篇筆記的標題了,嘿嘿,比較高級。有些希臘字母不會讀,感覺有點影響自己閱讀了。谷歌的搜索貌似用不了。edge 搜出來是 sigma 。我還是習慣用搜索引擎,很多時候,大模型有時候要反應一下,我想要即時反饋。幾秒鐘都不太愿意等他。編碼就是把一些信息轉換為二進制的,非常神奇,一些非常復雜的信息,居然在電腦上能用一串 01 數字表示。

編碼的過程是,首先自底向上構建 PFC 編碼樹,然后構建編碼表,對于文本信息,查詢編碼表進行編碼,類似于以前間諜工作,用一本書里面的字,對應真正要傳遞的信息。合并的次數是樹的數目減去 1 .很容易理解,比如說,兩棵樹合并成一棵樹,只需要合并一次,最后剩下一棵樹就好。

下面是我之前寫的一個非常經典的哈夫曼編碼的題。看了一個大佬的博客,他說能體現一個人的科研素養的就是數學能力和編程能力,感覺有道理,說到底就是邏輯能力。

#include<iostream>
#include<queue> 
#include<vector>using namespace std;int n;
priority_queue<int, vector<int>, greater<int>> heap;int main() {cin >> n;for ( int i = 0; i < n; i++ ) {int x;cin >> x;heap.push( x );}long long ans = 0;while ( heap.size() > 1 ) {int a = heap.top(); heap.pop();int b = heap.top(); heap.pop();ans += a + b;heap.push( a + b );}cout << ans << endl;return 0;
}

然后我們來解答前面的問題,最優編碼樹就是讓平均編碼長度最小的二叉樹。最優二叉編碼樹一定是真二叉樹,真二叉樹的定義是任一節點的度數都是偶數。也就是說要么沒有孩子,有孩子就一定有兩個。二叉樹要求沒有那么嚴格,只要不超過兩個孩子就行了,僅有一個孩子也是可以接受并且是嚴格接受的。這個就是雙子性。就是真二叉樹的定義呀。原來。

雙子性更加優雅的定義:內部節點的左右孩子雙全。(內部節點就是除了葉節點的節點,葉節點沒有孩子,考慮一般的情況,內部節點一定是有孩子的,有孩子就一定是有兩個孩子,一個左孩子,一個右孩子)

最優編碼樹的構造

最優編碼樹的葉節點只能出現在最低兩層。假設不是出現在最低兩層,手繪的圖片,好像顯示不在博客里面
可以把左下方的子樹移動到右上方。也不是移動,是交換這兩個部分的節點。平均編碼長度是取決于葉節點的深度的,所以葉節點的深度是越小越好,體現在二叉樹里面是二叉樹越低越好,但是在人類世界里面,貌似正好相反。

完全二叉樹

幾種二叉樹的定義,感覺一直有點繞不清楚。。但是今天可能也繞不清楚,但是可以努力區分一下,我現在不認為有一勞永逸的方法。

二叉樹是分叉不能大于二,小于等于二都是可以接受的。滿二叉樹是每一層都鋪滿,每個有孩子的節點都是有兩個孩子,葉節點只出現在最下面一層。完全二叉樹是葉節點可以出現在最下面兩層。完全二叉樹把最下面一層去掉,就是滿二叉樹,當然滿二叉樹是特殊的完全二叉樹。真二叉樹是任一節點的度是偶數。可能列表描述更加清晰一些。(我自己看自己的筆記發現還是圖和表格會讓自己理解起來更加輕松,大片的文字,哪怕是自己寫的,閱讀起來也是比較費勁的了,哪怕作者非常賣力地闡述和分析這里面的邏輯,這可能就是我看不懂專業書籍的原因,閱讀大段的文字本身就是一件比較困難的事情。所以以后做筆記,我可以盡量用圖片,表格,各種形式來進行。加深自己對于知識點的理解。)

分類描述
二叉樹任一節點的度小于等于二
完全二叉樹除了最后一層,上面的部分是滿二叉樹,最后一層可能是滿的,可能不是滿的,每個節點的度都是偶數,應該不會出現內部節點只有一個孩子的情況。
滿二叉樹每一層都鋪滿
真二叉樹 proper binary tree每個節點的度都是偶數

我太喜歡表格了,非常清晰。以后寫筆記多寫一些表格。

考慮實際情況的優化

考慮實際情況,我們對一些知識點,或者一些網站,或者一些書籍,或者一些文字,肯定是有使用頻率的差異的。比如說,考試,考察算法,基礎算法,數據結構,搜索與圖論,數學,動態規劃,貪心,這些板塊的出現頻率一定是不一樣的,就像一本書有它的重點,重點我們要多花時間復習,非重點我們可以少花一些時間。全面發展等于全面平庸。也就是說我們要發揮長板思維,不要當一個六邊形戰士,因為我們的時間和精力是有限的,只能做好少部分事情。所以,不要平均用力,要有重點地用力,重點的部分,可以多用用力,不重點的部分,可以少用力甚至不用力。哈夫曼樹對編碼問題的解決,就是讓出現頻率最高的字母排列在哈夫曼樹的靠近根節點的部分,盡可能讓它的深度比較小,這樣代價就比較小。類似于我們把一些常用的網站收藏在瀏覽器首頁,雖然我擔心別人看到我經常訪問的網站把收藏夾隱藏了,但是我記住了一些常用網站的域名,或者編輯了收藏的備注,搜一下就有了。學習也是,經常用的書放在手邊,盡可能減小我們做這件事情的代價,我們才能更多地做這件事情。假設要去健身房鍛煉,需要走很遠的路,通過很多道安檢,然后要帶很多裝備,要花很長的一段完整的時間,很可能就會勸退很多人。小事很多人可以輕松地堅持,就是這個道理。降低門檻就是減小代價。更快進入狀態是最重要的。一些專業的書籍還是太深入了。看一遍根本理解不了里面的意思。。

二叉樹的遍歷的迭代形式

這塊大佬可能認為比較簡單,但是對我來說,屬于絕對的門檻。需要付出巨大努力都不一定能跨越的門檻。我需要把我的精力都貫注到這個知識點上面。

前序遍歷的迭代版本,需要用到輔助棧存右子樹,棧有先進后出,后進先出的特點,先盡可能地遍歷左子樹,哦這個叫做先序遍歷啊,我還以為是前序遍歷呢。。查了一下,好像是一個意思。先序遍歷的迭代版本的輔助棧,入棧的時候可以對右子樹判空進行優化,判斷確認不是 NULL 之后才允許入棧,NULL 不用入棧,節省了空間,判斷這個操作增加了判斷時間,可能可以減少入棧和出棧的時間。考慮兩個極端情況。

情況分析
幾乎都有右孩子增加了判斷的時間
幾乎都沒有右孩子增加了判斷的時間,節省了空間,節省了入棧出棧的時間
總結綜合來看,大概率是節省時間和空間的

最后

感覺專業課還有很遠的路要走,心態最重要,然后慢慢學一些知識點吧。

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

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

相關文章

MiB和MB

本文來自騰訊元寶 MiB 和 ?MB 有區別&#xff0c;盡管它們都用于表示數據存儲的單位&#xff0c;但它們的計算方式不同&#xff0c;分別基于不同的進制系統。 1. ?MiB&#xff08;Mebibyte&#xff09;? ?MiB 是基于二進制的單位&#xff0c;使用1024作為基數。1 MiB 102…

Labview和C#調用KNX API 相關東西

敘述:完全沒有聽說過KNX這個協議...................我這次項目中也是簡單的用了一下沒有過多的去研究 C#調用示例工程鏈接(labview調用示例在 DEBUG文件夾里面) 通過網盤分享的文件&#xff1a;KNX調用示例.zip 鏈接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…

損失函數理解(二)——交叉熵損失

損失函數的目的是為了定量描述不同模型&#xff08;例如神經網絡模型和人腦模型&#xff09;的差異。 交叉熵&#xff0c;顧名思義&#xff0c;與熵有關&#xff0c;先把模型換成熵這么一個數值&#xff0c;然后用這個數值比較不同模型之間的差異。 為什么要做這一步轉換&…

Kubernetes的Replica Set和ReplicaController有什么區別

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理應用程序副本的兩種資源&#xff0c;它們有類似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增強版本。 以下是它們的主要區別&#xff1a; 1. 功能的演進 ReplicationController 是 Kubernete…

信息系統運行管理員教程3--信息系統設施運維

第3章 信息系統設施運維 信息系統設施是支撐信息系統業務活動的信息系統軟硬件資產及環境。 第1節 信息系統設施運維的管理體系 信息系統設施運維的范圍包含信息系統涉及的所有設備及環境&#xff0c;主要包括基礎環境、硬件設備、網絡設備、基礎軟件等。 信息系統設施運維…

如何通過Python實現自動化任務:從入門到實踐

在當今快節奏的數字化時代,自動化技術正逐漸成為提高工作效率的利器。無論是處理重復性任務,還是管理復雜的工作流程,自動化都能為我們節省大量時間和精力。本文將以Python為例,帶你從零開始學習如何實現自動化任務,并通過一個實際案例展示其強大功能。 一、為什么選擇Pyt…

Spring Boot 與 MyBatis Plus 整合 KWDB 實現 JDBC 數據訪問

? 引言 本文主要介紹如何在 IDEA 中搭建一個使用 Maven 管理的 Spring Boot 應用項目工程&#xff0c;并結合在本地搭建的 KWDB 數據庫&#xff08;版本為&#xff1a;2.0.3&#xff09;來演示 Spring Boot 與 MyBatis Plus 的集成&#xff0c;以及對 KWDB 數據庫的數據操作…

Java鎖等待喚醒機制

在 Java 并發編程中&#xff0c;鎖的等待和喚醒機制至關重要&#xff0c;通常使用 wait()、notify() 和 notifyAll() 來實現線程間的協調。本文將詳細介紹這些方法的用法&#xff0c;并通過示例代碼加以說明。 1. wait()、notify() 與 notifyAll() 在 Java 中&#xff0c;Obj…

? UNIX網絡編程筆記:TCP客戶/服務器程序示例

服務器實例 有個著名的項目&#xff0c;tiny web&#xff0c;本項目將其改到windows下&#xff0c;并使用RAII重構&#xff0c;編寫過程中對于內存泄漏確實很頭疼&#xff0c;還沒寫完&#xff0c;后面會繼續更&#xff1a; #include <iostream> #include <vector&g…

AI Agent開發大全第四課-提示語工程:從簡單命令到AI對話的“魔法”公式

什么是提示語工程&#xff1f;一個讓AI“聽話”的秘密 如果你曾經嘗試過用ChatGPT或者其他大語言模型完成任務&#xff0c;那么你一定遇到過這樣的情況&#xff1a;明明你的問題是清晰的&#xff0c;但答案卻離題萬里&#xff1b;或者你認為自己提供的信息足夠詳盡&#xff0c…

系統架構設計知識體系總結

1.技術選型 1.什么是技術選型&#xff1f; 技術選型是指評估和選擇在項目或系統開發中使用的最合適的技術和工具的過程。這涉及考慮基于其能力、特性、與項目需求的兼容性、可擴展性、性能、維護和其他因素的各種可用選項。技術選型的目標是確定與項目目標相符合、能夠有效解…

基于3DMax與Vray引擎的輕量級室內場景渲染實踐

歡迎踏入3DMAX室內渲染的沉浸式學習之旅!在這個精心設計的實戰教程中,我們將攜手揭開3DMAX與Vray這對黃金搭檔在打造現實室內場景時的核心奧秘。無論您是渴望入門的3D新手,還是追求極致效果的專業設計師,這里都將為您呈現從場景藍圖構建到光影魔法施加的完整技術圖譜。我們…

邏輯卷,vdo,(阿里加速器)

一、邏輯卷 10 20 30 1.邏輯卷的2個特點 &#xff08;1&#xff09;邏輯卷可以將多個分區或者磁盤整合成一個更大的邏輯磁盤&#xff0c;然后可以從邏輯磁盤上劃分出分區&#xff08;邏輯磁盤的大小等于整合的物理磁盤大小之和。&#xff09; &#xff08;2&#xff09;能…

檢索增強生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在&#xff01;")loader PyPDFLoader(file_path)try:do…

安全守護:反光衣檢測技術的革新之路

視覺分析助力船上工人反光衣檢測 在現代工業生產與作業環境中&#xff0c;安全始終是首要考慮的因素。對于水上作業&#xff0c;如船舶維護、海上施工等場景&#xff0c;工人穿戴反光衣是預防事故、提高可見性的重要措施。然而&#xff0c;傳統的人工檢查方式不僅效率低下&…

【Scrapy】Scrapy教程8——處理子鏈接

通過前面幾篇文章,已經了解了如何去爬取網頁內容并存儲到數據庫,但是目前只是存儲了一個頁面的內容,現在想要獲取每篇文章鏈接內的文章內容,我們來看看怎么獲取。 生成新請求 首先我們肯定要先拿到鏈接,所以第一步都獲取文章標題和鏈接肯定少不了,然后再爬取獲取到到子…

Centos6配置yum源

Centos6配置yum源 為Centos6配置CentOS Vault源—防止yum源過期為Centos6配置epel源為Centos6配置ELRepo源---已ELRepo被官方清空Centos6安裝dockerdocker配置國內鏡像加速 為Centos6配置CentOS Vault源—防止yum源過期 參考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

“智改數轉”新風口,物聯網如何重構制造業競爭力?

一、政策背景 為深化制造業智能化改造、數字化轉型、網絡化聯接&#xff0c;江蘇省制定了《江蘇省深化制造業智能化改造數字化轉型網絡化聯接三年行動計劃&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造業企業設備更新、工藝…

制作Oracle11g Docker 鏡像

基于Linux系統&#xff0c;宿主主機要設置如下環境變量&#xff0c;oracle為64位版本 dockerfile中需要的數據庫安裝包可從csdn下載內找到 #!/bin/bash # 在宿主機上運行以設置Oracle所需的內核參數 # 這些命令需要root權限cat > /etc/sysctl.d/99-oracle.conf << EO…

從GTC2025首次量子日看英偉達量子AI融合算力網絡前景與趨勢

GTC2025 Quantum Day 最新內容全部匯總: 技術名稱描述合作伙伴/開發者應用場景/目標量子模擬器優化方案NVIDIA與IonQ、D-Wave合作,針對量子模擬器進行性能優化,提升量子計算任務效率。IonQ、D-Wave量子算法開發、復雜系統模擬混合量子-經典計算架構結合量子計算與經典GPU加速…