国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

次優(yōu)二叉查找樹(shù)(次優(yōu)查找樹(shù))_遞歸和非遞歸實(shí)現(xiàn)_20230414

這篇具有很好參考價(jià)值的文章主要介紹了次優(yōu)二叉查找樹(shù)(次優(yōu)查找樹(shù))_遞歸和非遞歸實(shí)現(xiàn)_20230414。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

次優(yōu)二叉查找樹(shù)(次優(yōu)查找樹(shù))-遞歸和非遞歸實(shí)現(xiàn)

  1. 前言

當(dāng)有序表中的各記錄的查找概率相等的時(shí)候,采用折半查找效率可以提升查找性能;如果有序表中的各記錄的查找概率不相等,那么折半查找就不再適用。

如果只考慮查找成功的情況,則使查找性能達(dá)到最佳性能的判定樹(shù)就是帶權(quán)路徑長(zhǎng)度的之和,也即路徑各個(gè)記錄的查找深度與查找權(quán)值的乘積之和,當(dāng)這個(gè)和取得最小值的時(shí)候。
P H = Σ c i ? w i , ? i ∈ ( 1.... n ) PH=Σc_i*w_i,\ i∈(1....n) PH=Σci??wi?,?i(1....n)
最優(yōu)二叉查找樹(shù)需要利用到動(dòng)態(tài)規(guī)劃的相關(guān)知識(shí),之前的文章有所涵蓋,有興趣的讀者可查閱之前的文章進(jìn)行理解。本文所闡述的方法,采用的是貪婪的編程思維,構(gòu)建出次優(yōu)二叉查找樹(shù)(Nearly optimal binary search tree)。

  1. 問(wèn)題分析

已知一個(gè)按照關(guān)鍵有序的記錄:

(rl,rl+1…rh)

其中關(guān)鍵字為升序排列,對(duì)于每個(gè)記錄的權(quán)值

(wl,wl+1…wh)

現(xiàn)在構(gòu)造一顆二叉樹(shù),是這顆二叉樹(shù)的帶權(quán)路徑長(zhǎng)度PH在同樣的二叉樹(shù)中近似最小,我們稱這類二叉樹(shù)為次優(yōu)二叉樹(shù)。

利用貪婪方法,構(gòu)造次優(yōu)查找樹(shù)的方法是:首先在序列l(wèi)…h(huán)構(gòu)造根節(jié)點(diǎn)root(i),使根節(jié)點(diǎn)左右兩顆子樹(shù)的差值取最小值,那么這個(gè)點(diǎn)就是根節(jié)點(diǎn)。采用公式,讓理解更為方便。

Δpi=|Σwj(i+1<j<h)-Σwj(l<j<i-1)|

求得i之后,然后分別對(duì)子序列(rl,rl+1…ri-1)和(ri+1,rr+2…rh)再分別構(gòu)造兩顆次優(yōu)二叉樹(shù),并設(shè)定其根節(jié)點(diǎn)為root(i),分別定位root(i)的左子樹(shù)和右子樹(shù)。

次優(yōu)二叉查找樹(shù)(次優(yōu)查找樹(shù))_遞歸和非遞歸實(shí)現(xiàn)_20230414

根據(jù)上面的分析,引入遞歸算法和非遞歸算法構(gòu)造次優(yōu)二叉書(shū)。

  1. 遞歸算法分析

由于構(gòu)造二叉樹(shù)的過(guò)程需要分別對(duì)左右子樹(shù)進(jìn)行處理,所以整體的需要涉及兩次遞歸調(diào)用。二叉樹(shù)的構(gòu)造過(guò)程和遍歷過(guò)程非常類似,都是對(duì)左右子樹(shù)訪問(wèn)的過(guò)程。針對(duì)本問(wèn)題,我們選擇先序遍歷模式完成問(wèn)題的解答。

由于采用遞歸,那么遞歸的結(jié)束條件是什么呢? 遞歸的結(jié)束條件就是遍歷到葉子結(jié)點(diǎn),在本問(wèn)題當(dāng)中,可以理解問(wèn)題根節(jié)點(diǎn)的下標(biāo)等于high或者low的時(shí)候,此時(shí)遞歸就滿足結(jié)束條件(不再進(jìn)行入棧操作)。

  1. 遞歸代碼C語(yǔ)言實(shí)現(xiàn)

遞歸函數(shù)的操作對(duì)象為記錄的權(quán)值和,在遞歸函數(shù)之前需要求解sw[0…n-1],我們使用void find_sw(int *sw, SSTable st)函數(shù)完成此項(xiàng)任務(wù)。

遞歸函數(shù)中包含子樹(shù)下標(biāo)的最小值與最大值,在先序遞歸之前,通過(guò)迭代求出根節(jié)點(diǎn)所在位置,然后與high和low進(jìn)行比較,我們使用void second_optimal(BiTree *bt, SElemType *rec, int *sw, int low, int high)函數(shù)完成這項(xiàng)任務(wù)。

a.) find_sw函數(shù)實(shí)現(xiàn),注意第1個(gè)元素的sw值為0

void find_sw(int *sw, SSTable st)
{
    int i;

    *(sw + 0) = 0;

    for (i = 1; i <= st.len; i++)
    {
        sw[i] = sw[i - 1] + st.elem[i].value;
    }
}

b.) second_optimal函數(shù)實(shí)現(xiàn)

void second_optimal(BiTree *bt, SElemType *rec, int *sw, int low, int high)
{
   int min;
   int i;
   int j;
   int dw;
   int delta;

   min=INT_MAX;
   dw=sw[high]+sw[low-1];
   i=low;

   for(j=i;j<=high;j++)
   {
        delta=abs(dw-(sw[j]+sw[j-1]));
        if(delta<min)
        {
            i=j;
            min=delta;
        }
   }

   *bt=(BiTree)malloc(sizeof(BiTNode));
   (*bt)->data=rec[i];

   if(i==low)
   {
        (*bt)->lchild=NULL;
   }
   else
   {
        second_optimal(&((*bt)->lchild),rec,sw,low,i-1);
   }

   if(i==high)
   {
        (*bt)->rchild=NULL;
   }
   else
   {
        second_optimal(&((*bt)->rchild), rec, sw, i + 1, high);
   }
}
  1. 非遞歸實(shí)現(xiàn)

為了實(shí)現(xiàn)非遞歸建立次優(yōu)二叉查找樹(shù),就需要借助棧(stack)的概念,本質(zhì)是就是借助自定義棧來(lái)實(shí)現(xiàn)編譯器中的函數(shù)棧的管理。棧實(shí)際上儲(chǔ)存的是記憶的狀態(tài),采用“后進(jìn)先出”模式來(lái)模擬編譯器中的函數(shù)棧。我們?cè)诶脳?shí)現(xiàn)功能之前,首先需要定義過(guò)程中需要記憶(保存)哪些參數(shù)。很明顯,對(duì)于本問(wèn)題,我們至少需要保留三個(gè)變量參數(shù)的當(dāng)前狀態(tài),下一個(gè)待處理二叉樹(shù)結(jié)點(diǎn)的指針(它必定來(lái)自于當(dāng)前結(jié)點(diǎn)的左孩子或者右孩子),子樹(shù)需要處理的范圍,也就是low和high的下標(biāo)位置,有了這些背景分析,定義棧保存的元素:

typedef struct StackNode
{
    BiTree node;
    int    low;
    int    high;
}StackNode;

基于上述定義,非遞歸次優(yōu)二叉樹(shù)實(shí)現(xiàn)函數(shù)如下:

void second_optimal(BiTree *bt, SElemType *rec, int *sw, int len)
{
   int min;
   int i;
   int j;
   int delta;
   int dw;
   int low;
   int high;

   SqStack S;
   StackNode st_node;
   StackNode temp;

   low=1;
   high=len;
   InitStack_Sq(&S);

   st_node.low=low;
   st_node.high=high;
   st_node.node=(BiTree)malloc(sizeof(BiTNode));
   *bt = st_node.node;

   Push_Sq(&S,st_node);

   
   while(!StackEmpty_Sq(S))
   {
        Pop_Sq(&S,&temp);

        low=temp.low;
        high=temp.high;
        i=low;
        min=INT_MAX;
        dw=sw[high]+sw[low-1];

        for(j=i;j<=high;j++)
        {
            delta=abs(dw-sw[j]-sw[j-1]);

            if(delta<min)
            {
                i=j;
                min=delta;
            }
        }

        temp.node->data=rec[i];


        //it should start with from pushing the right child into the stack
        if(i==high)
        {
            temp.node->rchild=NULL;
        }
        else
        {
            st_node.low=i+1;
            st_node.high=high;
            temp.node->rchild=(BiTree)malloc(sizeof(BiTNode));
            st_node.node=temp.node->rchild;

            // here it is st_node.node instead of st_node.node->rchild
            Push_Sq(&S, st_node);
        }

        if (i == low)
        {
            temp.node->lchild = NULL;
        }
        else
        {
            st_node.low = low;
            st_node.high = i - 1;
            temp.node->lchild = (BiTree)malloc(sizeof(BiTNode));
            st_node.node= temp.node->lchild;
            // here it is st_node.node instead of st_node.node->lchild

            Push_Sq(&S, st_node);
        }
   }

}

上述函數(shù)的實(shí)現(xiàn)涉及到棧操作,有興趣的讀者可以參考《數(shù)據(jù)結(jié)構(gòu)》嚴(yán)蔚敏版自行實(shí)現(xiàn),在此不再贅述。對(duì)于上述非遞歸代碼,請(qǐng)讀者自行理解。

  1. 總結(jié)

次優(yōu)二叉查找樹(shù)是一種基于貪心算法實(shí)現(xiàn)的二叉樹(shù),它摒棄了動(dòng)態(tài)規(guī)劃建立最優(yōu)二叉樹(shù)的繁瑣流程,同時(shí)又保留了查詢的效率。本文針對(duì)次優(yōu)二叉樹(shù),采用遞歸和迭代兩種不同的方式加以實(shí)現(xiàn),加深了對(duì)遞歸的理解,同時(shí)也復(fù)習(xí)了棧(stack)的相關(guān)知識(shí)。

參考資料:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415370.html

  1. 《數(shù)據(jù)結(jié)構(gòu)》-清華大學(xué),嚴(yán)蔚敏

到了這里,關(guān)于次優(yōu)二叉查找樹(shù)(次優(yōu)查找樹(shù))_遞歸和非遞歸實(shí)現(xiàn)_20230414的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn)

    哈夫曼編碼 等長(zhǎng)編碼:占的位置一樣 變長(zhǎng)編碼(不等長(zhǎng)編碼):經(jīng)常使用的編碼比較短,不常用的比較短 最優(yōu):總長(zhǎng)度最短 最優(yōu)的要求:占用空間盡可能短,不占用多余空間,且不能有二義性 這里給出哈夫曼二叉樹(shù)的實(shí)現(xiàn): HuffmanTree.h: 測(cè)試數(shù)據(jù)(主函數(shù)): 運(yùn)行結(jié)果截圖

    2024年02月16日
    瀏覽(25)
  • C語(yǔ)言實(shí)現(xiàn)八大排序算法(詳解插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)和計(jì)數(shù)排序)

    C語(yǔ)言實(shí)現(xiàn)八大排序算法(詳解插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)和計(jì)數(shù)排序)

    本篇文章使用C語(yǔ)言實(shí)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)中常見(jiàn)的八大排序算法,它們分別是 插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序、歸并排序和計(jì)數(shù)排序 。在排序算法的實(shí)現(xiàn)過(guò)程中,每種算法都有其獨(dú)特的特點(diǎn)和適用場(chǎng)景。插入排序通過(guò)逐步構(gòu)建有序序列來(lái)排序,希爾

    2024年01月24日
    瀏覽(23)
  • 二叉排序樹(shù)的定義及基本操作(構(gòu)造、查找、插入、刪除)遞歸及非遞歸算法

    二叉排序樹(shù)的定義及基本操作(構(gòu)造、查找、插入、刪除)遞歸及非遞歸算法

    二叉排序樹(shù)(Binary Sort Tree, BST),也稱二叉查找樹(shù)。 二叉排序樹(shù)或者是一棵空樹(shù),或者是一棵具有下列特性的非空二叉樹(shù): 1) 若左子樹(shù)非空,則左子樹(shù)上所有結(jié)點(diǎn)均小于根結(jié)點(diǎn)的值; 2) 若右子樹(shù)非空,則右子樹(shù)上所有結(jié)點(diǎn)均大于根結(jié)點(diǎn)的值;

    2024年02月08日
    瀏覽(26)
  • 快速排序的非遞歸實(shí)現(xiàn)、歸并排序的遞歸和非遞歸實(shí)現(xiàn)、基數(shù)排序、排序算法的時(shí)間復(fù)雜度

    快速排序的非遞歸實(shí)現(xiàn)、歸并排序的遞歸和非遞歸實(shí)現(xiàn)、基數(shù)排序、排序算法的時(shí)間復(fù)雜度

    我們使用一個(gè)棧來(lái)模擬函數(shù)的遞歸過(guò)程,這里就是在利用棧分區(qū)間。把一個(gè)區(qū)間分為 [left,keyi-1][key][keyi+1,right]遞歸下去,直至區(qū)間不存在或left right。 如圖所示: 先把整體的區(qū)間壓進(jìn)去,然后出棧,處理完畢后找到keyi再分為左右兩個(gè)區(qū)間。然后往棧里壓有區(qū)間,壓左區(qū)間,就

    2024年02月17日
    瀏覽(24)
  • 十大排序算法(中):冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)

    十大排序算法(中):冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)

    這篇文章,我們接著來(lái)講剩下的排序算法:冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸) 中心思想: 交換就是指根據(jù)序列中的兩個(gè)元素的比較結(jié)果來(lái)對(duì)換這兩個(gè)元素在序列中的位置,特點(diǎn)就是:將值較大的元素向序列尾部移動(dòng),將值較小的元素向序列

    2024年02月05日
    瀏覽(17)
  • 動(dòng)態(tài)規(guī)劃:最優(yōu)二叉搜索樹(shù)

    動(dòng)態(tài)規(guī)劃:最優(yōu)二叉搜索樹(shù)

    給定一個(gè)序列 有n個(gè)有序且各不相同的鍵, 集合 表示在K中成功的搜索的概率; 為n+1 個(gè)不同的啞鍵,表示所有在和 之間的值, 表示不成功的搜索的概率. 創(chuàng)建二叉搜索樹(shù), 使得其期望搜索花費(fèi)最小。 如果一棵最優(yōu)二叉搜索樹(shù)T的子樹(shù)T’含有鍵那么這個(gè)子樹(shù)T’肯定是子問(wèn)題鍵

    2024年01月20日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)-哈夫曼樹(shù)(最優(yōu)二叉樹(shù))

    目錄 一、引言 二、哈夫曼樹(shù)的概念 三、哈夫曼樹(shù)的構(gòu)建 1. 構(gòu)建步驟 2. 構(gòu)建示例 四、哈夫曼編碼 1. 編碼規(guī)則 2. 編碼示例 五、哈夫曼樹(shù)的應(yīng)用 1. 數(shù)據(jù)壓縮 2. 文件加密 六、總結(jié) 在計(jì)算機(jī)科學(xué)中,數(shù)據(jù)結(jié)構(gòu)是指計(jì)算機(jī)中數(shù)據(jù)組織、管理和存儲(chǔ)的方式。數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)的

    2024年02月07日
    瀏覽(21)
  • 排序算法:歸并排序(遞歸和非遞歸)

    排序算法:歸并排序(遞歸和非遞歸)

    朋友們、伙計(jì)們,我們又見(jiàn)面了,本期來(lái)給大家解讀一下有關(guān)排序算法的相關(guān)知識(shí)點(diǎn),如果看完之后對(duì)你有一定的啟發(fā),那么請(qǐng)留下你的三連,祝大家心想事成! C 語(yǔ) 言 專 欄: C語(yǔ)言:從入門(mén)到精通 數(shù)據(jù)結(jié)構(gòu)專欄: 數(shù)據(jù)結(jié)構(gòu) 個(gè)? 人? 主? 頁(yè)?: stackY、 ? 目錄 1.歸并排序

    2024年02月07日
    瀏覽(17)
  • 快速排序算法的遞歸和非遞歸

    快速排序算法的遞歸和非遞歸

    基本思路 選擇一個(gè)基準(zhǔn)值,將數(shù)組劃分三個(gè)區(qū)域,小于基準(zhǔn)值的區(qū)域位于左側(cè),等于基準(zhǔn)值的區(qū)域位于中間,大于基準(zhǔn)值的區(qū)域位于右側(cè)。將大于和小于區(qū)域繼續(xù)進(jìn)行分區(qū),周而復(fù)始,不斷進(jìn)行分區(qū)和交換,直到排序完成 遞歸 思路: 步驟1: 在當(dāng)前分區(qū)范圍[l,r]中隨機(jī)選中一

    2024年02月09日
    瀏覽(21)
  • 【動(dòng)態(tài)規(guī)劃】最優(yōu)二叉搜索樹(shù)——算法設(shè)計(jì)與分析

    【動(dòng)態(tài)規(guī)劃】最優(yōu)二叉搜索樹(shù)——算法設(shè)計(jì)與分析

    二叉搜索樹(shù)或者是一棵空樹(shù),或者是具有下列性質(zhì)的二叉樹(shù): 若它的左子樹(shù)不空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值; 若它的右子樹(shù)不空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值; 它的左、右子樹(shù)也分別為二叉搜索樹(shù)。 規(guī)定樹(shù)根為第0層,圓結(jié)點(diǎn)為數(shù)

    2024年02月16日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包