算法導論 第三部分——基本數據結構——第14章:數據結構的擴張

本章通過擴張紅黑樹構造出兩種數據結構:動態順序統計和區間樹。

1、動態順序統計:查找倒數第i小的數據 復雜度為 ?lg(n)

為什么是擴張紅黑樹而不是搜索二叉樹或者二叉樹?

  相對于搜索二叉樹,紅黑樹的平衡性更好,高度在lg(n) 。這樣查找時的復雜度就是 lg(n)而不是n。在第9章順序統計量的時候列出了運行時間期望為線性和最壞運行時間為線性的

算法(http://www.cnblogs.com/NeilZhang/p/5650226.html) 。

struct的結點的結構: 與一般的紅黑樹相比,增加了 size ,對于任意一個結點 ?p.size = p.left->size + p.right->size + 1?

struct RBTreeNode
{int key;int color;struct RBTreeNode *parent;struct RBTreeNode *left;struct RBTreeNode *right;int size;  
};

對于檢索具有給定排序的元素:逐層查找

OS_SELECT(x,i)r = size[left[x]]+1; //先計算x的處于的位置if i = r         //x正好是第i小的關鍵字then return x;else if i < r   //x比第i關鍵字大,則在其左子樹查找then return OS_SELECT(left[x],i)else return OS_SELECT(right[x],i-r)  //x比第i關鍵字小,則在其右子樹查找

確定一個元素的秩(知道元素的值大小,確定它的 排序位數)

OS-RANK(T,x)r=x.left.size +1 y=xwhile  y!=T.rootif y==y.p.rightr=r+y.p.left.size + 1y=y.p
return r

樹的維護

  主要是針對 插入 和刪除 操作的維護,在紅黑樹的插入刪除的基礎之上還要 在插入和刪除之后 維護 size的大小,(需要從這個分支一直到root結點)復雜度為 lg(n)

對于紅黑樹的旋轉操作也要在其中添加有關size的比變化。

?

2、如何擴張數據結構

對一種數據結構的擴張過程分為四個步驟:

1)選擇基礎數據結構

2)確定要在基礎數據結構中添加哪些信息

3)驗證可用基礎數據結構上的基本修改操作來維護這些新添加的信息

4)設計新的操作

  書中給出了對紅黑樹進行擴張的定理,并給出了證明,這個看的時候有些難度,暫時跳過了。大概意思就是說當紅黑樹被選作基礎數據結構時,某些類型的附加信息總是可以用插入和刪除來進行有效地維護。

?

3、區間樹

  這小結講的是擴張紅黑樹以支持由區間構成的動態集合上的操作。區間可以很方便的表示各占用一段連續時間的一些事情。區間樹是一種動態集合進行維護的紅黑樹,該集合中的每個元素x都包含在一個區間int[x]。區間樹支持下列操作:

INTERVAL_INSERT(T,x):將包含區間域int的元素x插入到區間樹T中

INTERVAL_DELETE(T,X):從區間樹T中刪除元素x

INTERVAL_SEARCH(T,i):返回一個指向區間樹T中元素x的指針,使int[x]與i重疊,若集合中無此元素存在,則返回nil[T]。

修改紅黑樹得到的區間樹如下圖所示:

從圖可以看出,對區間樹以每個節點的左端點值進行中序變量即可得到有序的序列。有了區間樹的結果就很容易實現其相關操作。

?

轉載于:https://www.cnblogs.com/NeilZhang/p/5659360.html

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

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

相關文章

/hgfs下無共享文件夾?/mnt下沒有hgfs文件夾?vmhgfs-fuse:找不到命令?

前言&#xff1a;最近在使用linux的過程中&#xff0c;需要在宿主操作系統與客戶操作系統間建立共享文件夾&#xff0c;遇到了些許問題&#xff0c;在網上參考了許多文章與各種嘗試后&#xff0c;現得以解決&#xff0c;分享如下。1、系統環境&#xff1a;宿主操作系統&#xf…

GraphQL入門有

本文將從GraphQL是什么&#xff0c;為什么要使用GraphQL&#xff0c;使用GraphQL創建簡單例子&#xff0c;以及GraphQL實戰&#xff0c;四個方面對GraphQL進行闡述。說得不對的地方&#xff0c;希望大家指出斧正。 github項目地址&#xff1a;https://github.com/Charming2015/…

對話莊表偉:開源第一課

莊表偉目前就職于華為的開源管理中心。自2014年開源社成立之初&#xff0c;他便友情參與了開源社的籌辦工作。2017年&#xff0c;開源社轉型為完全由個人成員組成的組織&#xff0c;莊表偉就以個人身份加入了開源社。作為開源社理事&#xff0c;當被問到“為什么要參選”時&…

【FME實戰教程】002:FME完美實現CAD數據轉shp案例教程(以三調土地利用現狀數據為例)

FME完美實現CAD數據轉shp案例教程&#xff08;以三調土地利用數據為例&#xff09; 文章目錄1. cad數據預覽2. 轉換過程3. shp數據預覽1. cad數據預覽 2. 轉換過程 &#xff08;1&#xff09;打開FME Desktop2020中文軟件&#xff0c;點擊【新建】。 &#xff08;2&#xff09…

Linux學習之01_基礎命令介紹

初學Linux&#xff0c;還在摸索中&#xff0c;在這個過程中希望能記錄下學習到的東西&#xff0c;參考的的書籍為《鳥哥的Linux私房菜》 在這里學到的主要命令有這幾個&#xff1a; data cal bc man shutdown sync 1、基礎命令操作 data----顯示日期與實踐的命令 cal----顯示日…

窮舉算法實例

public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("輸入頭的個數:");int headsc.nextInt();System.out.println("輸入腿的個數:");int footsc.nextInt();for(int i0;i<head;i){//假設兔子的數量為iint jh…

VMware Workstation All Key

官方下載&#xff1a;https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 懶人打包&#xff1a;鏈接:https://pan.baidu.com/s/1kWJRfjL 密碼:wzce 注&#xff1a;如果是WinXP或32位系統請用 10.0 版本 VMware 所有版本永久許可證激活密鑰&…

【GlobalMapper精品教程】017:KML generator快速將坐標轉為KML文件

本文介紹KML generator軟件,并快速將坐標轉為KML文件的使用方法,并用globalmapper中打開kml文件加以驗證。本專欄配套完整的案例數據包,請打開data017.rar獲取軟件及數據。 文章目錄 1. KML文件介紹2. kml generator軟件介紹2.1 單點KML制作2.2 Excel數據KML制作2.3 文本文件…

從cpp向qml文件傳中文字符串的方法

Qt 使用Unicode編碼來存儲操作字符串&#xff0c;但很多情況下&#xff0c;我們不得不處理采用其他編碼格式的數據&#xff0c;舉例來說&#xff0c;中文多采用GBK和Big5編碼&#xff0c;而日本則多采用Shift-JIS or ISO2022編碼。將其他編碼格式的字符串轉化成采用Unicode編碼…

Codeforces 746 G. New Roads

題目鏈接&#xff1a;http://codeforces.com/contest/746/problem/G mamaya&#xff0c;不知道YY了一個什么做法就這樣過去了啊 2333 首先我顯然可以隨便構造出一棵樹滿足他所給出的深度要求。 但是他還對于葉子節點的數目有要求。 考慮首先構造一棵樹最大化在滿足給出的深度條…

模型驗證組件 FluentValidation

FluentValidation 是 .NET 下的模型驗證組件&#xff0c;和 ASP.NET MVC 基于Attribute 聲明式驗證的不同處&#xff0c;其利用表達式語法鏈式編程&#xff0c;使得驗證組件與實體分開。正如 FluentValidation 的 介紹&#xff1a; A small validation library for .NET that u…

第二屆中國PWA開發者日

點擊藍字關注我們活動介紹為加速推動漸進式 Web 應用 (PWA) 在中國的發展&#xff0c;微軟與英特爾攜手舉辦“第二屆中國 PWA 開發者日”。本次活動邀請一眾業界大咖圍繞 PWA 展開分享&#xff0c;探討最新技術進展&#xff0c;及 PWA 生態的實踐與落地。期待與您線上相聚。活動…

【GlobalMapper精品教程】018:提取影像數據的范圍生成矢量圖層

文章目錄 1. 加載影像數據2. 生成邊界3. 導出矢量范圍4. 背景影響邊界解決辦法1. 加載影像數據 以DSM為例,加載如下所示: 2. 生成邊界 在影像圖層上右鍵→圖層→【邊界框/覆蓋-創建圖層覆蓋框/多邊形區要素】,如下圖所示: 選擇【否】。 邊界創建完成。 3. 導出矢量范圍 …

MPMoviePlayerController屬性方法簡介

屬性說明property (nonatomic, copy) NSURL *contentURL播放媒體URL&#xff0c;這個URL可以是本地路徑&#xff0c;也可以是網絡路徑property (nonatomic, readonly) UIView *view播放器視圖&#xff0c;如果要顯示視頻必須將此視圖添加到控制器視圖中property (nonatomic, re…

在Leangoo里怎么設置看板周期?

設置看板周期有兩種方式&#xff1a; 1&#xff09;點擊看板上的看板周期時間直接修改 2&#xff09;通過菜單 設置看板周期 瀏覽器訪問官網鏈接&#xff1a;www.leangoo.com 轉載于:https://www.cnblogs.com/shineshine/p/5663104.html

consul部署多節點和consul-template部署

一.consul的介紹 1.1consul是什么&#xff1f; Consul是HashiCorp公司推出的開源工具,用于實現分布式系統的服務發現與配置。 Consul是分布式的、高可用的、可橫向擴展的。它具備以下特性 : service discovery:consul通過DNS或者HTTP接口使服務注冊和服務發現變的很容易,一些外…

基于ABP實現DDD

什么是DDD呢&#xff1f;領域驅動設計[DDD]是一種針對復雜需求的軟件開發方法。將軟件實現與不斷發展的模型聯系起來&#xff0c;專注于核心領域邏輯&#xff0c;而不是基礎設施細節。DDD適用于復雜領域和大規模應用&#xff0c;而不是簡單的CRUD應用。它有助于建立一個靈活、模…

二、通過工廠方法來配置bean

調用靜態工廠方法創建 Bean是將對象創建的過程封裝到靜態方法中. 當客戶端需要對象時, 只需要簡單地調用靜態方法, 而不同關心創建對象的細節. 要聲明通過靜態方法創建的 Bean, 需要在 Bean 的 class 屬性里指定擁有該工廠的方法的類, 同時在 factory-method 屬性里指定工廠方法…

【GlobalMapper精品教程】019:基于DSM提取離散隨機點的高程信息

本文講解在globalmapper中,基于DSM提取離散隨機點的高程信息,配套數據為data019.rar。 文章目錄 1. 離散點創建2. 提取離散點高程信息3. 高程標注1. 離散點創建 本文在ArcGIS中,根據給定的范圍,隨機生成離散點,如下圖: 拓展閱讀: ArcGIS根據范圍創建隨機點教程:【ArcG…

shell腳本注意點

2019獨角獸企業重金招聘Python工程師標準>>> 直接命令行寫腳本的時候&#xff0c;可以用 ; 分割&#xff0c;或 也可以直接回車&#xff0c;然后在繼續寫腳本在使用 方括號[ ] 的時候&#xff0c;里面空格兩邊都必須要有空格&#xff0c;比如 [ $a -gt 3 ] 在方括號…