哈夫曼樹與哈夫曼編碼:C 語言完整實作與原理圖解
基本概念 帶權路徑長度 (WPL):WPL = Σ(wᵢ × lᵢ),wᵢ 為葉節點權重,lᵢ 為根到葉路徑長度。 哈夫曼樹:給定 n 個權重,構造 WPL
判斷有向圖是否為 DAG:拓撲排序(Kahn 演算法)C++ 實作
問題定義 給定有向圖 G(V, E),判斷是否存在環。等價於:能否對所有頂點進行拓撲排序(拓撲順序存在 ⇔ 無環)。 Kahn 演算法(BFS 版拓撲排序)
三大線性時間排序演算法:計數、基數、桶排序 C++ 完整實作與分析
背景:比較排序的下界 決策樹模型證明:任何比較排序最壞情況需 Ω(n log n) 次比較。若輸入資料具備特定性質(整數範圍已知、位數固定、均勻分佈),可突破此
C++ 虛繼承與指標位址偏移深度解析:為什麼派生類指標比基類指標少 4 Bytes?
現象觀察 在多層繼承體系中,將派生類別物件位址指派給基類別指標時,指標值會發生偏移。實測發現:CSamplerTree* → CTree* 位址 +4;反向轉型
歸並排序完整指南:原理、雙路實作(自底向上/自頂向下)與效能分析
演算法核心思想 歸並排序基於分治法:將陣列遞歸拆分為單元素子陣列(自然有序),再兩兩合併為有序陣列。核心操作是 歸並:將兩個已排序序列合併為一個有序序列。 歸
C++ explicit 關鍵字詳解:抑制隱式轉換的最佳實踐
隱式轉換的雙面性 C++ 允許單參數建構函式定義隱式轉換,編譯器會自動將引數類型轉換為類別物件。這在某些情況下方便,但也可能導致難以察覺的 Bug。 問題示例
陣列中任意 n-1 個元素的最大乘積:O(n) 時間、O(1) 空間解法
問題陳述 給定整數陣列 a[n],求任意 n-1 個元素乘積的最大值。限制:不得使用除法,時間 O(n),空間 O(1)。 核心觀察 乘積最大值取決於正負號分
字串模式匹配問題(POJ 1165)完整解析與 C 語言 AC 代碼
問題描述 給定 n 個字串(不含空格),以及一個包含模式的查詢字串。模式支援: 不區分大小寫匹配。 中括號 [...] 表示單字元選項,例如 a[123]b
插入排序演算法:C++ 實作與效能分析
演算法簡介 插入排序是一種直觀且簡單的排序演算法,其核心思想類似整理撲克牌:維護一個已排序的前綴區間,每次從未排序區間取出一個元素,向前掃描找到合適位置並插入,
C++ 類別繼承與虛函數記憶體佈局深度解析:從 Point 到 Line 的派生實踐
前言 在 C++ 物件導向程式設計中,繼承是核心機制之一。當基類包含虛函數時,派生類別的記憶體佈局會發生什麼變化?指標轉型時位址偏移的奧秘又是什麼?本文透過一個
C++ 繼承實戰:Point 基類與 Line 派生類計算線段中點
問題描述 定義點類 Point 作為基類,派生出線段類 Line。利用繼承自基類的點座標信息,計算並輸出線段的中點座標。 類設計 基類 Point class
C++ 對象模型深度解析:虛函數表與虛指針實現原理
前言:多態的基石 C++ 多態的核心機制是 虛函數。編譯器通過 虛函數表 和 虛指針 實現運行時動態綁定。本文深入剖析單一繼承下的實現細節。 核心數據結構 虛
POJ 2007 Scrambled Polygon:凸多邊形頂點逆時針輸出算法
問題描述 給定一個凸多邊形的所有頂點(包含原點 (0,0)),頂點無序輸入。該多邊形佔據三個象限。要求從 (0,0) 開始,按逆時針順序輸出所有頂點。 核心幾
POJ 2151 概率 DP 題解:多隊伍答題概率計算
問題描述 有 T 支隊伍參加比賽,共 M 道題。第 i 支隊伍答對第 j 道題的概率為 p[i][j]。求:所有隊伍都至少答對 1 道題,且至少有 1 支隊伍答
C++ qsort 函數完整指南:用法、比較函數、多維數組排序與避坑
函數原型與參數詳解 void qsort(void *base, size_t num, size_t width, int (*comp
C++ 實現霍夫曼樹:最優二叉樹構建與帶權路徑長度計算
問題背景 霍夫曼樹(Huffman Tree) 又稱最優二叉樹,給定 N 個帶權葉節點,構建一棵二叉樹,使 帶權路徑長度 (WPL) = Σ (葉節點權值 ×
POJ 1287 Networking:最小生成樹 Prim 算法完整解析
問題描述 給定 N 個節點、M 條無向邊,每條邊有成本 C。求連接所有節點的最小總成本(最小生成樹,MST)。多測試用例,N=0 結束。N ≤ 100,稠密圖。
HDU 1556 區間覆蓋計數:線段樹與差分數組兩種解法對比
問題描述 給定 N 個區間 [x, y],求每個點 i (1 ≤ i ≤ N) 被多少個區間覆蓋。多組測試用例,N=0 結束。 解法一:線段樹(區間加、單點查