日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

最优二叉搜索树探究【C/C++】

發(fā)布時(shí)間:2025/4/16 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最优二叉搜索树探究【C/C++】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡述

什么是二叉樹

下面的這棵樹,就是二叉搜索樹

相對(duì)于什么最優(yōu)

這里考慮的是ASL(average search length)平均搜索長度。即根據(jù)概率來生成ASL最小的搜索樹。


到這里,最優(yōu)二叉搜索樹的概念就已經(jīng)清楚了。


解決方法

如果是遞歸來搜索也是可以的,但是很明顯需要做很多的重復(fù)的計(jì)算。
為了解決這個(gè)問題,所以我們采用動(dòng)態(tài)規(guī)劃來做,很明顯,這樣能降低計(jì)算的復(fù)雜度。

  • 處理方法:動(dòng)態(tài)規(guī)劃

在非葉節(jié)點(diǎn)上時(shí)候,為特定的數(shù)值,在葉子節(jié)點(diǎn)上時(shí)候,是一個(gè)區(qū)間(這里不懂可以再看上面的圖

顯然,我們需要先用遞歸的方式來理解一下這個(gè)問題。

  • w[i][j] = a[i-1] + b[i] +.. + b[j] + a[j]
  • 其中,a[i]表示的是第i個(gè)區(qū)間的概率,b[i]表示的是第i個(gè)節(jié)點(diǎn)的概率
  • w[i][i] = a[i-1] + b[i] + a[i] 這不就是一個(gè)只有一個(gè)非葉子節(jié)點(diǎn)的二叉樹么?
  • 如果是只有一個(gè)非葉子節(jié)點(diǎn)的二叉搜索樹的話:我們這里很好求
  • 進(jìn)行擴(kuò)展:我們現(xiàn)在只考慮這么的一棵樹,中間點(diǎn)為具體數(shù)值,那么就是非葉子節(jié)點(diǎn)。然后根據(jù)這個(gè)節(jié)點(diǎn)(設(shè)為節(jié)點(diǎn)k)的進(jìn)行推理ASL[i][j] = b[k] * 1 + (ASL_Left_tree + 1) * W[i][k-1] + (ASL_Right_tree + 1) * W[k+1][j]
  • 注意到,中間有部分可以提出來,得到ASL[i][j] = W[i][j] + (ASL_Left_tree ) * W[i][k-1] + (ASL_Right_tree ) * W[k+1][j] (這里W[i][j] = 1)
  • 但是我們這里其實(shí)考慮的整棵數(shù),對(duì)于更一般的,我們要考慮一個(gè)樹的一部分。
  • ASL[i][j] = 1 + (ASL_Left_tree ) * W[i][k-1] + (ASL_Right_tree ) * W[k+1][j] 這是上面的整理。下面再接著推理。
  • W[i][j] * ASL[i][j] = W[i][j] + (ASL_Left_tree ) * W[i][k-1] + (ASL_Right_tree ) * W[k+1][j] 注意,這里的W[i][j]都是在全局的樹上算的,因?yàn)檫@時(shí)候把左邊的W[i][j] 就類似的得到的我們想要的條件概率下是計(jì)算算法。
  • 做類似的變換很容易發(fā)現(xiàn),所謂左樹和右樹也是可以用i,j來表示的。然后,就得到一個(gè)很重要的 遞推公式
  • W[i][j] * ASL[i][j] = W[i][j] + ASL[i][k-1] * W[i][k-1] + ASL[k+1][j] * W[k+1][j] 但是我們注意到這里的 w[i][j] * ASL[i][j] 其實(shí)可以作為一個(gè)整體來計(jì)算的。這里就設(shè)置為M[i][j]
  • 所以公式變?yōu)榱薽[i][j] = w[i][j] + m[i][k-1] + m[k+1][j]。注意到,我們這里是假設(shè)了采用的是以第k個(gè)點(diǎn)作為分割點(diǎn)來構(gòu)建子樹的。但是實(shí)際上這個(gè)最優(yōu)的究竟該怎么搞,肯定是需要遍歷所有的可能的k來得到結(jié)果的。
  • 所以,其實(shí)m[i][j] = w[i][j] + min(m[i][k-1] + m[k+1][j])。但是我們這里需要注意到,我們想要的整棵數(shù)的ASL其實(shí)就是m[1][N],而此時(shí)的概率為1了,所以得到的相等。

邊界條件討論:

  • w[i+1][i] 這種情況究竟是算什么呢?我們這里設(shè)置為a[i]
  • m[i+1][i]這種情況呢?我們令它為0。這樣,我們?cè)诶蒙厦娴墓酵评沓鰜淼慕Y(jié)果的時(shí)候,就得到了m[i][i] = w[i][i]。
  • 至于它為0,其實(shí)很好證明,由于在ASL[i+1][i]肯定要是0才對(duì)的。

程序?qū)崿F(xiàn)細(xì)節(jié)

主要是注意一下,實(shí)現(xiàn)的時(shí)候,如何安排數(shù)據(jù)。建議的話,將b的那個(gè)數(shù)組前面空出一個(gè)來,這樣的話,就不需要修改太多的公式。
原因如下:

  • w[i][j] = a[i-1] + b[i] +.. + b[j] + a[j]
  • 為了避免程序?qū)崿F(xiàn)的時(shí)候越界。(否則就需要修改公式了,這里先可以先完成之后,再考慮優(yōu)化的問題)

看到這,如果你有去手動(dòng)實(shí)現(xiàn)的話,你會(huì)意識(shí)到另外一個(gè)問題。這個(gè)可行的k究竟是什么?

  • 由于我們之前已經(jīng)談到了設(shè)置了時(shí)候,我們講b的那個(gè)數(shù)組第一個(gè)位置放空,那么來說i和j都是從1開始遍歷起的,終止當(dāng)然就是以N作為終止點(diǎn)。
  • 知道上面的這些之后,我們就很容易理清了,我們嘗試將i到j(luò)上的所有節(jié)點(diǎn)

C++代碼

注釋部分寫好了詳細(xì)的代碼說明~
main函數(shù)開始部分是自動(dòng)生成數(shù)據(jù)來進(jìn)行測試

#include <iostream> using namespace std; #include <string> #define N 15int S[N]; double b[N + 1]; double a[N + 1]; // w[i][j] 表示i,j段的概率 // double w[N + 2][N + 2]; // w[i][j] = a[i-1] + b[i] +...+b[j] + a[j] double m[N + 2][N + 2]; int divided_point[N + 1][N + 1]; string getAns(int begin, int end); int main() {double sum = 0;for (int i = 0; i < N; ++i) {S[i] = 2 * i + 1;b[i+1] = 0.6 / (N+1);a[i] = 0.4 / (N+1);sum += (a[i] + b[i+1]);}b[0] = 0;a[N] = 1 - sum;/*for (int i = 0; i < N; ++i) {S[i] = 2 * i + 1;a[i + 1] = 0.04;b[i + 1] = 0.06;}a[0] = 0.1;b[0] = 0;*/// 初始化for (int i = 0; i <= N; ++i) {w[i + 1][i] = a[i];m[i + 1][i] = 0;// ASL[i][i-1]為0!}// r表示的是長度for (int r = 0; r < N; ++r)for (int i = 1; i <= N-r; i++) {// i表示的是起始點(diǎn)int j = i + r; // j表示的是終點(diǎn)// 由w[i][j]構(gòu)造函數(shù)很容易得到w[i][j] = w[i][j - 1] + a[j] + b[j];m[i][j] = m[i + 1][j]; // 因?yàn)閙[i][i-1]為0divided_point[i][j] = i;// 中間劃分點(diǎn)設(shè)為b[i] k為滑動(dòng)的移動(dòng)點(diǎn)for (int k = i + 1; k <= j; k++) {double t = m[i][k - 1] + m[k + 1][j];if (t < m[i][j]) { m[i][j] = t; divided_point[i][j] = k;}}m[i][j] += w[i][j];}cout << m[1][N] << " " << w[1][N] << endl;system("pause"); }

總結(jié)

以上是生活随笔為你收集整理的最优二叉搜索树探究【C/C++】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄页网站在线看 | 小香蕉影院 | 99久久精品无码一区二区毛片 | 国产成人在线视频观看 | 丁香婷婷视频 | 美女扒开屁股让男人捅 | 高hnp视频 | 涩涩屋视频在线观看 | 天堂影视av | 深夜福利一区 | 一本色道久久88亚洲精品综合 | 欧美 日韩 人妻 高清 中文 | 国产精品100 | 国产在线一二 | 亚洲精品高清在线观看 | 精品国精品国产 | 四虎影视在线 | 亚洲色成人一区二区三区小说 | 欧美少妇毛茸茸 | 亚洲av电影一区二区 | 日批的视频 | 一级毛毛片 | 中文字幕日韩精品在线 | 国产在线导航 | 国产亚洲精品久久久久久久久动漫 | 黄色二级视频 | 91色九色 | 欧美做受高潮 | 久久字幕 | 久久久久亚洲无码 | 亚洲激情在线观看视频 | 99久热在线精品996热是什么 | 91麻豆免费视频 | 中文字幕精品在线 | 毛片网站在线免费观看 | missav | 免费高清av在线看 | 亚洲伦理在线视频 | 国产午夜视频在线播放 | 久久香蕉网 | 久久9966 | 欧美14sex性hd摘花 | 精品视频在线一区二区 | 亚洲免费天堂 | 国产卡一卡二在线 | 麻豆视频在线播放 | 国产偷拍一区二区三区 | 国产视频久久久久久久 | 熟睡人妻被讨厌的公侵犯 | 国产亚洲精品美女久久久久 | 国产高清免费在线观看 | 性生活三级视频 | 国产成人精品一区二区三区福利 | 偷啪自啪| 99久久精品一区 | 淫僧荡尼巨乳(h)小说 | 91精品国产乱码久久久张津瑜 | 欧洲亚洲精品 | 黄色短视频在线播放 | 日韩福利视频 | 国产免费久久精品国产传媒 | 哺乳期给上司喂奶hd | 1级性生活片| 久草香蕉在线 | 老司机在线看片 | 亚洲一二三区在线观看 | 天天干天天操av | 黑人一级黄色片 | 超碰碰97 | 久久久久久久久久久影视 | 成人av影院在线观看 | 天天操天天干视频 | 成人有色视频 | 九草在线观看 | 日本亲子乱子伦xxxx50路 | 午夜爱爱毛片xxxx视频免费看 | 国产网站视频 | 一级片黄色 | 黑丝国产一区 | yjizz国产| 999久久久久久久久6666 | 天堂网中文字幕 | 亚洲国产久 | 亚洲天堂网一区 | 欧美色图片区 | 亚洲AV成人无码久久 | 精品久久久久成人码免费动漫 | 夜夜爱爱| 国产人免费人成免费视频 | 北条麻妃一区二区三区四区五区 | 在线免费观看a视频 | 日韩欧美国产高清 | 五月丁香久久婷婷 | 无码精品黑人一区二区三区 | 亚洲最大网 | 黄色一级淫片 | 在线视频观看免费 | 天堂福利在线 | 96精品| 色播五月婷婷 |