資料結構(計財系).

Slides:



Advertisements
Similar presentations
大南海文化園區 (國立歷史博物館 -初期計畫) 簡介
Advertisements

第7章 樹與二元樹 (Trees and Binary Trees)
網路文學 1號林琬橙 27號吳秋梅.
第6章 二叉树和树 前面的章节主要讨论的是线性结构,二叉树和树属于非线性的结构。遍历非线性结构比线性结构要麻烦。
计算机硕士专业基础—C语言 赵海英
第十一章 理气剂.
计算机软件技术基础 数据结构与算法(4).
第5章 树( Tree )和二叉树 5.1 树的基本概念 5.2 二叉树 5.3 遍历二叉树和线索二叉树 5.4 树和森林
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第三节 固精缩尿止带药 1.特点:酸涩收敛,主归肾、膀胱经。 2.功效:固精、缩尿、止带。兼补肾。
消費者教育 第10章:外觀溝通:一種雙向的歷程
第8章 查找 数据结构(C++描述).
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
Chapter 5 迴圈.
Chap4 Tree.
利用共同供應契約 辦理大量訂購流程說明.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
Chap5 Graph.
Linked List Operations
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
資料結構 第3章 鏈結串列.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
Chapter8 Binary and Other Trees
哈夫曼编码.
Chapter 5 樹(Trees).
第12章 樹狀搜尋結構 (Search Trees)
資料結構 第6章 樹狀結構.
第十一章 Heap 結構.
演算法與資料結構 製作單位: 高雄市立高雄中學.
(Circular Linked Lists)
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第六章 树和二叉树.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
4.1 單向鏈結串列 4.2 堆疊的加入與刪除 4.3 佇列的加入與刪除 4.4 其他型式的佇列
鄧姚文 資料結構 第六章:樹(Tree) 鄧姚文
樹狀結構 Tree Structure chapter 7 德明科技大學資訊科技系.
Chap3 Linked List 鏈結串列.
第六章 樹狀結構 T r e e 版權屬作者所有,非經作者 同意不得用於教學以外用途.
樹 2 Michael Tsai 2013/3/26.
感謝同學們在加分題建議. 我會好好研讀+反省~
B+ Tree.
Chap4 Tree.
Tree & Binary Tree.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
Reference to FUNDAMENTALS OF DATA STRUCTURE IN C++
第7章 樹與二元樹(Trees and Binary Trees)
資料結構與C++程式設計進階 樹狀結構(Tree) 講師:林業峻 CSIE, NTU 11/ 12, 2009.
資料結構使用Java 第9章 樹(Tree).
C qsort.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Disjoint Sets Michael Tsai 2013/05/14.
DRC with Calibre 課程名稱:VLSI 報告人:黃家洋 日期: 改版(蔡秉均) 1.
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
進階資料結構(2) Disjoint Sets
陣列與結構.
12797: Letters ★★★☆☆ 題組:Problem Set Archive with Online Judge
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
MultiThread Introduction
10599: Robots(II) ★★★★☆ 題組:Problem Set Archive with Online Judge
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
Advanced Competitive Programming
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Trees 授課者:驕芸.
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
算法基础习题课2 助教:刘倩玉.
Presentation transcript:

資料結構(計財系)

樹狀結構 簡介 樹的走訪(traverse) 左子右兄弟樹 二元搜尋樹 勝者樹與敗者樹(winner tree, loser tree) 互斥集合(Disjoint set) 不用指標表示樹

Winner Tree 當要合併k個排序好的序列(變成一個序列)時: 每次都找出串列頂端值最小的串列 把頂端取出來 如何把頂端最小的串列找出來? 15 16 … 20 38 30 25 28 50 11 95 99 18 10 9 6 8 90 17

Winner Tree 6 6 6 8 9 6 8 17 10 9 20 6 8 9 90 17 15 20 20 15 15 11 95 18 16 38 30 25 50 16 99 20 … … … 28 … … … … … … … … … … … …

Winner Tree 6 6 8 8 6 8 9 9 6 8 17 15 10 9 20 6 15 8 9 90 17 15 20 20 25 15 11 95 18 16 38 30 28 50 16 99 20 … … … … … … … … … … … … … … … …

Winner Tree 分析:(k個序列,共n個數字) 樹的深度: 第一次建樹: 當輸出某個節點,重新建樹: 合併k個串列: lg (k+1) 第一次建樹: O(k) 當輸出某個節點,重新建樹: O(lg k) 合併k個串列: O(n lg k)

Loser Tree Winner tree 中,為了重建樹需要多看許多人,而且樹的節點很多數字都重複 6 8 6 8 9 9 6 8 17 15 10 9 20 6 15 8 9 90 17 15 20 20 25 15 11 95 18 16 38 30 28 50 16 99 20 … … … … … … … … … … … … … … … …

Loser Tree 如果改成存輸的人的鍵值呢? 不用多往旁邊看一次 6 8 8 9 9 17 15 10 20 9 90 20 10 9 25 15 11 95 18 16 38 30 28 50 16 99 20 … … … … … … … … … … … … … … … …

Disjoint Set 在程式中如何表示互斥集合? 先看集合應該有哪些運算: Union: 把兩個集合聯集 Find: 尋找某個項目在哪個集合中

Disjoint Set 如果單純把每一個項目加上一個欄位… Find: O(1) Union: O(n),太慢 1 Set=1 2 3 Set=2 3 Set=1 4 Set=1 4 Set=2 5 Set=1 6 Set=1 7 Set=1 8 Set=1 8 Set=2 9 Set=2 9 Set=1 10 Set=2 10 Set=1 11 Set=1 12 Set=1 13 Set=1 14 Set=1 14 Set=2 15 Set=1 15 Set=2 16 Set=1 16 Set=2

Disjoint Set 用樹來表示集合: 每一個node有一個指標指向自己的root,以root代表 自己所在的集合 Find: 往parent找,找到是NULL為止 Union: 把其中一個人的parent指向另一集合的成員 Ex: Union(9,2) 6 8 7 4 1 9 2 3 5

Disjoint Set struct NODE * find ( int key ) { struct NODE * tmp ;     for ( tmp = id_array[key] ;         tmp->parent != NULL ; tmp = tmp->parent ) ;     return tmp ; } void set_union ( int key1 , int key2 ) {     id_array[key2]->parent = find ( key1 ) ; }

Disjoint Set 退化樹: 以上union方法,可能會造成以下結果: 執行find時可能會變成O(n) 執行find時可能會變成O(n) 解決方式:Weighted union 1 2 3 …

Disjoint Set Weighted union : Union的時候,把level比較小的人的root接在level比 較大的人的root 4 1 9 2

Disjoint Set Weighted union : Union的時候,把level比較小的人的root接在level比 較大的人的root 如此一來可以保證, 假設有m個node時 樹的深度不會超過 (lg m) +1 8 3 7 4 1 9 2 6

Disjoint Set 只有兩顆樹深度相同時,union後的新樹 depth會+1。其餘則不變 void set_union ( int key1 , int key2 ) {     struct NODE * n1 ;     struct NODE * n2 ;     n1 = find ( key1 ) ;     n2 = find ( key2 ) ;     if ( depth[n1->key] > depth[n2->key] ) {         n2->parent = n1 ;     }     else {         n1->parent = n2 ;         if ( depth[n1->key] == depth[n2->key] )             depth[n2->key] ++ ;       } 只有兩顆樹深度相同時,union後的新樹 depth會+1。其餘則不變

Disjoint Set 假設執行10次find(5),每一次都會爬樹三層 4 1 9 2 8 3 7 6 5

Disjoint Set 假設執行10次find(5),每一次都會爬樹三層 瓦解規則: Find找到後,把路徑上的點 都直接連接到root 8 3 7 4 1 9 2 6 5

Disjoint Set struct Node* collapsing_find ( int key ) {     if(id_array[key]->parent !=NULL) {         id_array[key]->parent = collapsing_find ( id_array[key]->parent->key ) ;         return id_array[key]->parent;     }     else {         return id_array[key]; }

Disjoint Set Ackermann function Values of A(m, n)

Disjoint Set 用Weighted union與collapsing find進行連續 n次集合操作,其費時不會超過O(n×α(n)) 其中α(n)是Ackermann function A(n,n) 的反函 數 但是因為A(4,4)的值接近  ,因此α(n)可以 視為常數 證明略,更多相關可參考 http://en.wikipedia.org/wiki/Ackermann_f unction

不用指標表示樹 如果可以用陣列的index找到每個node,那其實 不一定要用指標來表示tree 前提:已經知道最多會有幾個node root 1 data 1 2 2 data 3 3 4 data data 4 5 6 5 data 6 data

不用指標表示樹 如果可以用陣列的index找到每個node,那其實 不一定要用指標來表示tree 前提:已經知道最多會有幾個node root 1 data 2 3 4 1 2 2 data 3 3 4 data data 4 5 6 5 6 5 data 6 data

不用指標表示樹 Disjoint set的程式碼