1. 程式人生 > >最優二叉樹、赫爾曼樹(學習記錄)

最優二叉樹、赫爾曼樹(學習記錄)

注意vector儲存的記憶體地址可能會變,所以如果用vector來儲存所有節點的話,需要先resize好容器,保證期間不進行節點的增減。multiset是允許關鍵字重複的容器

#include<vector>
#include<iostream>
#include<string>
#include<set>
using namespace std;
struct node {
    string data;
    int w;//權值或概率
    string ma;
    node *l, *r;
    int flag;
    node() { l = r = NULL;ma = ""
;flag = 0; } bool operator<(const node b) const { return w < b.w; } }; multiset<node> all; vector<node> resault;//最終的所有節點 int N; void dfs(node *&root)//赫爾曼編碼 { if (root->l) { root->l->ma = root->ma + "0";dfs(root->l); } if (root->r) { root->r->ma = root->ma + "1"
;dfs(root->r); } } int main() { int cnt = 0; cout << "請輸入節點的個數" << endl; cin >> N; resault.resize(2 * N - 1); cout<<"請依次輸入各節點的名字和權值"<<endl; while (N--) { node tem; cin >> tem.data >> tem.w; tem.flag = 1
; all.insert(tem); } while (all.size() != 1)//選2個最小的到resault中,並建立一個最小合併的節點到all { node tem; auto it2 = all.begin(), it = all.begin(); it2++; resault[cnt++] = *it; resault[cnt++] = *it2; tem.l = &resault[cnt - 2];tem.r = &resault[cnt - 1]; tem.data = "(" + tem.l->data + "+" + tem.r->data + ")"; tem.w = tem.l->w + tem.r->w; it2++; all.erase(it, it2); all.insert(tem); /*for (auto x : all) cout << x.data << " "; cout << endl;*/ } resault[cnt++] = *all.begin(); //遍歷,求所求//比如赫爾曼碼 node *root = &resault[resault.size() - 1]; dfs(root); for (auto x : resault) if (x.flag == 1) cout << x.data << " " << x.ma << endl; }

相關推薦

學習記錄

注意vector儲存的記憶體地址可能會變,所以如果用vector來儲存所有節點的話,需要先resize好容器,保證期間不進行節點的增減。multiset是允許關鍵字重複的容器 #include<

滿完全排序判定

二叉排序樹(Binary Sort Tree)又稱二叉查詢樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; (3)左、右子樹也分別為二叉排序樹;

的構建

一、構建最優二叉樹 ①、節點類:五個屬性:結點的資料、父結點、左子結點、右子結點、赫夫曼編碼 /** * 樹的結點類 * * @author lenovo * */ public class TreeNode { private Object obj;

哈夫編碼基於哈夫-,不唯一B(b-)B+

整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html http:/

一、介紹 赫夫曼樹可以用來優化演算法,減少執行次數;還可以用於電報編碼。 二、優化演算法 對於我們巢狀的if語句,通常我們需要判斷多次if。但是if裡表示式的順序與程式執行速度有很大關係。如果我們把頻率高的if條件放在前面的話就能夠避免多次檢測fa

資料結構學習筆記-森林和的轉化

int min(HuffmanTree &HT,int i) { int k = MAX; int j,flag = 0; for(j=1;j<=i;++j) { if(HT[j].weights2) { change = s1; s1 = s2; s2 = chang

OBST搜索

紅黑樹 std 變量 這樣的 最優二叉搜索樹 earch 操作 問題 問題:   簡述一下問題:假設有一顆詞典二叉樹,我們從中查找需要的單詞,使用紅黑樹或平衡樹這樣的數據結構總是可以在O(lgN)時間內進行查找,但單詞的出現頻率是不同的,我們給每個單詞加上一個搜索概率,然後

->

nco 代碼實現 type except close 輸出結點 eof fde 左右 文字描述 結點的路徑長度   從樹中一個結點到另一個結點之間的分支構成這兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。 樹的路徑長度    從樹根到每一個結點的路徑長度之和叫樹的路徑長

搜尋(JAVA實現

演算法課上老師講的最優二叉搜尋樹,自己又查了些資料才看明白。這篇只記錄下自己用java的實現和自己的一些細節的理解。想學習整個演算法的可以參照 https://blog.csdn.net/zhangyifei521/article/details/50833792 package bes

查詢_動態規劃

  原問題是給出各個節點和各個節點的被查詢概率,然後構造一棵各個節點平均被查詢比較次數最小的樹,則該問題可以用動態規劃來解決 示例如下 推廣到一般的情況,並設T(i, j)是由記錄{ri, …, rj}(1≤i≤j≤n)構成的二叉查詢樹,C(i, j)是這棵二叉查詢樹的平均比較次數,有

查找_動態規劃

turn alt 推廣 範圍 span 最小 根節點 col ret 原問題是給出各個節點和各個節點的被查找概率,然後構造一棵各個節點平均被查找比較次數最小的樹,則該問題可以用動態規劃來解決 示例如下 推廣到一般的情況,並設T(i, j)是由記錄{ri,

動態規劃法之長公共子串和查詢

1. 筆試常考的題型,最長公共子串問題:給定兩個字串str1和str2,返回兩個字串的最長公共子串(連續)和長度。 舉例: str1 = "abc" str2="caba" 它們的最長公共子串是 "ab"。 此題可用暴力法進行求解,求解的時間複雜度較高。現用動態規劃法進

《演算法導論》之搜尋

最優二叉搜尋樹 假定我們正在設計一個程式,實現英語文字到法語的翻譯。對英語文字中出現的每個單詞,我們需要查詢對應的法語單詞。為了實現這些查詢操作,可以建立一棵二叉搜尋樹,將n個英語單詞作為關鍵字,對應的法語單詞作為關聯資料。由於文字中的每個單詞都要進行搜尋,我們

搜尋探究【C/C++】

簡述 什麼是二叉樹 下面的這棵樹,就是二叉搜尋樹 相對於什麼最優 這裡考慮的是ASL(average search length)平均搜尋長度。即根據概率來生成ASL最小的搜尋樹。 到這裡,最優二叉

15.5 搜尋

背景 假定我們正在設計一個程式,實現英語文字到中文的翻譯。對英語文字中出現的每個單詞,我們需要查詢對應的中文。為了實現這些操作,我們可以建立一個二叉搜尋樹,將n個英語單詞作為關鍵字,對應的中文作為關聯資料。 #定義 給定一個n個不同關鍵字的已排序的序列K=<

動態規劃--問題

 1、問題描速: 設 S={x1, x2, ···, xn}  是一個有序集合,且x1, x2, ···, xn表示有序集合的二叉搜尋樹利用二叉樹的頂點儲存有序集中的元素,而且具有性質:儲存於每個頂點中的元素x 大於其左子樹中任一個頂點中儲存的元素,小於其右子樹中任意頂點

第十五章動態規劃之“查詢

本書從文字翻譯的案例切入,假設把英文翻譯為法文,每個英文單詞為關鍵字,其對應法文為衛星資料。用二叉查詢樹儲存,該怎麼設計這個查詢樹。即使是紅黑樹,查詢的時間複雜度也為O(lgn)即樹的深度。但是因為文章中某個單詞出現的頻率不同,所以可能有些頻率很高的單詞比如the的深度可能

PTA 7-8 修理牧場25 分

最優二叉樹問題 把最小的兩端拿出來連線後放入佇列中,重複的上述操作,, 用優先佇列可以容易完成 (注:部落格作為交流使用,切勿抄襲應付作業) #include <iostream> #i

資料結構之哈夫

文字壓縮是一種非常重要的技術,自然涉及到了壓縮編碼。哈夫曼編碼——一種最基本的壓縮編碼方法 幾個術語: 1、路徑:樹中兩個節點之間的分支序列 2、路徑長度:路徑上的分支數目

程式優化雜談——在程式中的應用

  首先呢,我想和大家討論一個非常簡單的問題:分類。  假設這裡有100個物品。其中屬於A類的物品有20個;B類10個;C類45個;D類15個;E類10個。現在要求寫一個程式對這100個物品進行分類。啊!這個問題是不是很簡單呢?你閉著眼睛也應該能寫出來。這裡我用偽C語言來寫這個程式。先約定:x[0]~x[99