计算机问题求解 – 论题2-11 - 基本的数据结构 2018年05月09日.

Slides:



Advertisements
Similar presentations
多喝白開水, 健康水噹噹 中原食品營養師 張瑋真 前 言 小明今年九歲, 就讀中原國小, 他每天早上都會去 學校附近的早餐店, 買早餐來吃, 他通常都會吃 三明治或蛋餅, 而且都會搭配一杯奶茶或是紅茶, 才會滿足的去學校上學。 中午放學回家後, 也會在路上的便利商店, 買一罐 運動飲料或是綠茶解渴。
Advertisements

翻譯技巧解說 例文 授課教師:何資宜. 一、加譯 「おしん」の視 聴率は、最高の時が 62.9 %に達した。ク ロジロが出てくる 「南極物語」は、配 給収入が 52 億円を超 えて、記録を更新し た。 《阿信》的收視率最 高時曾達 62.9% 。此 外,以兩隻小狗太郎 次郎為主角的《南極 物語》,票房收入也.
電腦與問題解決 5-1 電腦解題概論 5-2 電腦解題程序 5-3 演算法概論.
美味料理 5223汪芮臣.
治癒肺癌 的妙方.
品德教育讀書會分組報告 第三組 組員:董健毅老師、黃琡雯老師、方永強老師、 李淑瑜老師、郭德義老師、邱美鈴老師、 陳月鈴老師、曾婷瑜老師
小学科学中的化学 武威十九中 刘玉香.
基本概論 Basic concepts.
神州五号、六号的发射和回收都取得了成功 ,圆了几代中国人的航天梦,让全中国人为之骄傲和自豪 神州五号、六号的发射和回收都取得了成功 ,圆了几代中国人的航天梦,让全中国人为之骄傲和自豪!但是你们知道我们的科学家是怎样迅速地找到返回舱着陆的位置的吗? 这全依赖于GPS——卫星全球定位系统”。大家一定觉得很神奇吧!学习了今天的内容,你就会明白其中的奥妙。
情緒與壓力管理 手部舒壓運動 第六組.
Introduction 基本概念 授課老師:蕭志明
第一章 資料結構導論 1-1 資料結構簡介 1-2 認識程式設計 1-3 演算法效能分析 1-4 物件導向程式設計與Java.
第7章 樹與二元樹 (Trees and Binary Trees)
動畫與遊戲設計 Data structure and artificial intelligent
姓名:劉芷瑄 班級:J201 座號:39號 ISBN:957-33-1963-2
关于职教发展的几个理念 上海市教育科学研究院 周亚弟.
約用工讀生/學生助理說明會 人事室報告
作文教學變奏曲 在一個空桶裡舀水,只是枉然;在一頭公牛身上擠奶,則是危險;讓一個沒有話的人說話,那就是——作文!(史英)
指導教授:古錦松 分享同學: 蔡斗溍、陳姿云 陳俊仰、陳國睿(助教)
行政作用法 行政命令.
提升機密文書處理能力以貫徹執行個人資料保護 臺北市政府政風處 股長 呂佩毓
如何查財產(2/6) EX:利息明細提醒您於金融機構有存款;營利(股利)明細提醒您有買股票。
五-4 台灣的生活禮俗 組員:603 15號 黃醴萬 6號 吳家熙 5號 楊証傑 11號 李偉新.
Chapter 4 流程控制.
程設一.
空間向量 朱泰吉 蔡宇翔 張力夫 莊孟霏.
计算机导论 ——软件部分 巢爱棠 办公室:1208.
最後,是什麼決定一個領導者的成敗 這是一步思考與行動指南
行行重行行,與君生別離。 相去萬餘里,各在天一涯。 行行重行行:走了一程又一程 生別離:在有生之年分離 語出楚辭:「悲莫悲兮生別離,
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
樹狀結構 陳怡芬 2018/11/16 北一女中資訊專題研究.
Chapter8 Binary and Other Trees
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
Chap 3 堆疊與佇列 Stack and Queue.
第十五章 Linked List, Stack and Queue
计算机问题求解 – 论题 堆与堆排序 2018年05月14日 数据的组织(逻辑的,物理的)均可以影响到算法的设计和性能.
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
樹狀結構 Tree Structure chapter 7 德明科技大學資訊科技系.
本著作除另有註明外,採取創用CC「姓名標示-非商業性-相同方式分享」台灣2.5版授權釋出
计算机问题求解 – 论题2-14 -B树 2018年6月10日.
產品語意 班級:夜四技產設三甲 學生:鄭舜鴻 學號:9A01C023 指導教師:唐蔚.
第六章 樹狀結構 T r e e 版權屬作者所有,非經作者 同意不得用於教學以外用途.
第三章 栈和队列.
資料結構 第4章 堆疊.
暴力、草莽、土野、情色、權慾 —華西街的成人童話
Lok Sin Tong Leung Kau Kui college
樹 2 Michael Tsai 2013/3/26.
編譯程式設計 期末專題說明 V1.1 May 2004.
感謝同學們在加分題建議. 我會好好研讀+反省~
B+ Tree.
織物的認識 演示者:陳明玲 美容科:家政概論.
二叉树的遍历.
刑事訴訟法 不受理.
物理實驗水火箭活動 水火箭製作.
Linked Lists Prof. Michael Tsai 2013/3/12.
第7章 樹與二元樹(Trees and Binary Trees)
Disjoint Sets Michael Tsai 2013/05/14.
資料結構簡介 綠園.
三 顺序结构程序设计 厦大附中信息技术.
臺中市龍山國小 校園常見瓢蟲辨識   瓢蟲屬於鞘翅目瓢蟲科。目前世界上約有5000多種瓢蟲,台灣地區約有80種以上,其中能捕食有害生物的瓢蟲約七十種之多。瓢蟲因為捕食有害生物為主食,所以又稱為『活農藥』。
C#快速導讀 流程控制.
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
JAVA 程式設計與資料結構 第十七章 Tree.
第六章 直接成本法.
编译原理与实现 河北科技大学 信息科学与工程学院计算机系 杨奎河
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

计算机问题求解 – 论题2-11 - 基本的数据结构 2018年05月09日

问题:任意输入一行字符串,以#结束。输出这个字符串的反串 Program reverse(input, output); var elements: array[0:n] of char; (*n is big enough*) index: int; length: int; c: char; begin read(c); length:=0; while (c<>’#’) do elements[length]:=c; length := length+1; read(c); end for index:=length-1 to 0 do write(elements[index]); end. 问题1:N.Wirth说过程序=算法+数据结构。 你能就这个例子解释这句话的含义吗? 提醒大家:1,数组存放是对数据的组织管理方式,算法很简单;2,多个对象的组织和管理,通常用动态集合这个词来解读;3,不同的组织方式,可能带来算法的变化和效率的变化。 用栈来组织和管理,解 我们用不同的数据组织形式来进行动态集合的实现,会带来不同的思维方式; 分析字符类型和数组、栈的关系,解释什么叫数据结构 逻辑结构:如何建议元素之间的关系;如何操纵这些元素; 物理结构:观察它们在计算机中的物理存储结构,理解访问这些元素的代价 抽象数据类型: ADT:什么叫定义一个数据结构?以栈为例;什么叫实现一个数据结构?用数组实现栈 ADT定义了一个数学模型,如何去保障这个模型在实现阶段没有错误?ADT的形式规约 使用ADT的若干好处 指针的本质含义:地址并非专指物理地址,任何能够检索到对象的数据,均可以是地址; 栈的指针实现技术; 队列数据结构:定义、队列的形式规约;队列的指针实现;队列的数组实现; 表数据结构:定义、表的形式规约;表的指针实现;表的数组实现; 树数据结构:定义、形式规约;指针实现;可以采用数组实现吗?

问题2: 我们引入Dynamic set这个概念的用意是什么? 你能从上例中的” var elements: array[0:n] of char; ”以及某个具体输入“damrnqiz”中解释以下几个概念的关系吗? 数据;数据类型;数据结构 多个对象的数据,需要有效组织和管理:数据结构;从一个集合的角度去观察,定义集合元素类型,可以开展的组织动作 描述对象的数据:类型:从一个个体的角度去观察; 集合:数学概念;动态集合:计算过程中的运行的模型 我们引入Dynamic set这个概念的用意是什么?

本质上,我们所采用的所有表达动态集合的高级数据结构,定义其上的操作,少不了上述基本功能 问题3:你除了能看出动态集合上常见的操作外,能否看出“结构”来? 本质上,我们所采用的所有表达动态集合的高级数据结构,定义其上的操作,少不了上述基本功能 元素之间的关系!

问题4:我们只能采用数组来组织和管理动态集合吗? 不同的组织方式,可能带来算法的变化和效率的变化。 用栈来组织和管理,解 我们用不同的数据组织形式来进行动态集合的实现,会带来不同的思维方式; 分析字符类型和数组、栈的关系,解释什么叫数据结构 逻辑结构:如何建议元素之间的关系;如何操纵这些元素; 物理结构:观察它们在计算机中的物理存储结构,理解访问这些元素的代价 抽象数据类型: ADT:什么叫定义一个数据结构?以栈为例;什么叫实现一个数据结构?用数组实现栈 ADT定义了一个数学模型,如何去保障这个模型在实现阶段没有错误?ADT的形式规约 使用ADT的若干好处 指针的本质含义:地址并非专指物理地址,任何能够检索到对象的数据,均可以是地址; 栈的指针实现技术; 队列数据结构:定义、队列的形式规约;队列的指针实现;队列的数组实现; 表数据结构:定义、表的形式规约;表的指针实现;表的数组实现; 树数据结构:定义、形式规约;指针实现;可以采用数组实现吗?

其实,动态集合的不同组织方式,可能带来算法的变化和效率的变化 Program reverse(input, output) var s: stack; c: char begin initialize(s); read (c); while c<>”#” do push(s,c);read(c); end while not empty(s) do write(top(s)); pop(s); 定义栈的管理动作:initialize(S):创建一个栈; push(S,c):将c压入栈S中; top(S):栈顶元素; pop(S):将栈顶元素去除; empty(S):判定S是否为空 full(s):判断S是否满 我们用不同的数据组织形式来进行动态集合的实现,会带来不同的思维方式;

问题5:至此,你必须能清楚的理解什么叫“定义并实现一个数据结构” 但是,上述程序是无法执行的: 大多数语言并没有像提供array, record, pointer那样提供stack这样的语言设施供我们使用: 如此的数据抽象,不是都被语言支持 我们还会根据应用需求、管理需求进行这样那样的抽象,构造自己的数据管理方式: 队列、链表、树、图…… 问题5:至此,你必须能清楚的理解什么叫“定义并实现一个数据结构”

问题6:定义一个数据结构,必须定义哪些东西? 数据结构stack的定义 问题6:定义一个数据结构,必须定义哪些东西? 数据+操作 操作主要反映基本操作+特定操作

用高级语言提供的基本数据类型和数据结构来实现在自定义结构中定义的数据和操作

数据实现部分:

操作实现部分 一旦我们小心翼翼地完成了定义和实现,我们就可以发布这个“数据结构”为一个“数据类型”供别的程序员直接使用,他们不用关心这个类型的所有实现细节,就像我们自己使用int类型一样! 这个数据结构的定义中包含了动态集合中的元素逻辑结构和管理方式;实现中规定了物理结构和管理方式。

Program reverse(input, output) var s: stack; c: char begin initialize(s); read (c); while c<>”#” do push(s,c);read(c); end while not empty(s) do write(top(s)); pop(s);

实际上,我们还可以采用不同的实现方式来实现某个数据管理方式! 难道我们就定义了两个不同的stack了吗?

如果我们在构造自己的数据组织方式时,写出了一个关于这个方式的“约定”,而暂时没有涉及实现细节,甚至不再关心实现细节而交由其他人员实现时,我们写出来的“约定”就有了新名词: 抽象数据类型:ADT

完整的stack的ADT

自然语言能够描述清楚ADT中各个成分吗? 狭义的程序设计中难得一见的科学内涵!

Stack的数据部分的形式约束 规约的数据部分 针对数据的规约 生命周期内保持

Stack操作部分的形式约束

Stack操作部分的形式约束

这些数据规约和操作规约明确了这个数据结构的:成员数据类型、组织方式、使用方式 Stack操作部分的形式约束 这些数据规约和操作规约明确了这个数据结构的:成员数据类型、组织方式、使用方式 但这些规约和具体的数据结构实现无关:数组方式?链表方式? 实现这个ADT时:必须验证实现方法保持了这些约束的成立

这个规约和栈ADT中push的规约是等价的吗? a-stack: 一种用数组实现的栈结构 这个规约和栈ADT中push的规约是等价的吗? 必须要证明

下面的函数f是干什么的? 建立了验证a-stack规约是否符合stack ADT规约的基础

a-stack中push操作的验证 ∀𝑎1∈𝑎 − 𝑠 𝑡𝑎𝑐𝑘: pre−condition s.push f a1 ,b ⇒pre−condition(a.push a1,b ) ∀𝑎1∈𝑎 − 𝑠 𝑡𝑎𝑐𝑘: pre−condition s.push f a1 ,b ) and p𝑜𝑠𝑡−condition(a.push a1,b ⇒ post−condition(s.push(f a1 ,b)

pre−condition s.push f a1 ,b ≡|elems|<max |elems|=last ∀𝑎1∈𝑎 − 𝑠 𝑡𝑎𝑐𝑘: pre−condition s.push f a1 ,b ⇒pre−condition(a.push a1,b ) pre−condition s.push f a1 ,b ≡|elems|<max |elems|=last Max=n under f Last<n pre−condition(a.push a1,b ) = T

∀𝑎1∈𝑎 − 𝑠 𝑡𝑎𝑐𝑘: pre−condition s. push f a1 ,b and p𝑜𝑠𝑡−condition(a ∀𝑎1∈𝑎 − 𝑠 𝑡𝑎𝑐𝑘: pre−condition s.push f a1 ,b and p𝑜𝑠𝑡−condition(a.push a1,b ⇒ post−condition(s.push(f a1 ,b) pre−condition s.push f a1 ,b ≡|elems|<max p𝑜𝑠𝑡−condition(a.push a1,b )≡ last’=last+1 and elements’[last’]=b c ′ =c+1 and (elements ′ last ′ ,last) ∈𝑒𝑙𝑒𝑚 𝑠 ′ (c’>c and(b,c)∈elems’) post−condition(s.push(f a1 ,b)成立

以定义ADT为目标去定义数据结构的好处: 关注分离 信息隐藏 模块化设计 可以加载形式化研究

问题8: 你能举出一些例子,说 明queue这种结构中哪 些数据成分必须有?它 们必须满足什么性质? 哪些操作必须提供,它 们又必须遵循什么约定?

问题9: 栈与队列的本质差别是什么? 为什么我们需要这种差别? FIFO; 讨论题2:递归调用在程序运行时,常常利用栈数据结构。请解释一下为什么?

问题10: 你觉得在我们的讨论的“结 构”的背后是否有什么基本 的数学概念吗? 数据和处理数据的方法:一个封闭的系统,封闭在这个动态集合中 代数系统

链表:一切操作均围绕指针 问题11: 这个结构有什么不便之处吗? 数据的动态组织较为方便,但是数据的访问不够方便:worst case是n级别 问题11: 这个结构有什么不便之处吗?

如果给定的是key,而不是一个pointer,worst case是theta(n) 问题12: 删除一个对象的代价是多少?

问题13: 你能就下两例说说看,指针到底是什么? 数据的位置信息

进一步的改进 问题14; 为什么是“改进”? 监控“边界条件”

两列表单数组实现 基本原理:在一个数组空间维护两个链表,“实际数据”和“可用空间”。“此消彼长” 问题15: 你能解释一下 这几个图吗?

根树: 如何从链表的角度看它? Level 0 Root Inner node Leaf Level 1 Branching node Height=3 Level 2 Level 3 如果任意结点最多有两个子结点, 则该根树成为二叉树(binary tree), 显然用指针实现链表的方法很容易扩展到二叉树

这其实意味着: 即使问题逻辑需要多叉树, 我们也可以将其转换为二叉树来实现。

Open topics 用两个 queue 模拟一个 stack,要求尽可能高效,且不使用额外空间(可使用常数个额外变量)。 证明上述算法的正确性。

课外作业 TC pp.235-: ex.10.1-4; 10.1-5; 10.1-6 TC pp.240-: ex.10.2-1; 10.2-2; 10.2-3; 10.2-6; TC pp.245-: ex.10.3-4; 10.3-5; TC pp.248-: ex.10.4-2; 10.4-3; 10.4-4 TC pp.249-: prob.10-3