第一章 绪论.

Slides:



Advertisements
Similar presentations
報告書名:父母會傷人 班級:二技幼四甲 姓名:吳婉如 學號:1A2I0034 指導老師:高家斌
Advertisements

迷 宫 最短路径 施沈翔.
分论坛二:04 山东交通学院 绩效考核管理的实践与思考 山东交通学院 李景芝
人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
媽,我們真的不一樣 青少年期與中年期 老師: 趙品淳老師 組員: 胡珮玟4A1I0006 馬菀謙4A1I0040
動畫與遊戲設計 Data structure and artificial intelligent
班級:二幼三甲 姓名:郭小瑄 、 詹淑評 學號:1A2I0029 、1A2I0025
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
指導老師:陳韻如 姓名:吳宜珊 學號:4A0I0911 班級:幼保二乙
第三章 鏈結串列 Linked List.
傳統童玩遊戲創新 組別:第八組 班級:幼保二甲 組員: 4A0I0005柯舒涵 4A0I0011謝孟真
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
数据结构与算法 数据结构与算法实验
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List Operations
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構 第5章 佇列.
Chap 3 堆疊與佇列 Stack and Queue.
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
第五章 数组和 广义表 数组 稀疏矩阵 广义表.
第五章 数组和广义表.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第2章 线性表(三) 1/.
第12章 樹狀搜尋結構 (Search Trees)
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
程序设计期末复习 黎金宁
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
1.1 数据结构讨论的范畴 1.2 基本概念 1.3 算法和算法的量度.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第 3 讲 线性表(一).
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
第二章 线性表.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
五、链 表 1、单链表 2、双向链表 3、链表应用.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
栈和队列练习.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
第三章 栈和队列.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter6 队列(Queues) The Abstract Data Type
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
王玲 第 2 章 线性表 王玲 2019/2/25.
自我參考結構 (self-reference – 1)
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第1章 绪论 2019/4/16.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
第二章 线性表.
資料結構簡介 綠園.
第 六 讲 栈和队列(一).
本 章 说 明 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的存贮结构
第 9 章 建構函式與解構函式.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第六章 样本及抽样分布 §2 抽样分布 4) 正态总体的样本均值与样本方差的分布: 定理1.
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
Chapter 2 Entity-Relationship Model
Presentation transcript:

第一章 绪论

一、数据结构讨论的范畴 二、基本概念 三、算法和算法的度量

一、数据结构讨论的范畴 非数值计算程序设计问题 数据的逻辑结构 数据的存储结构

二、基本概念 1. 数据与数据结构 2. 抽象数据类型

1. 数据与数据结构 数据: 所有能被输入到计算机中,且能被计算机处理的符号的集合。 是计算机操作的对象的总称。 是计算机处理的信息的某种特定的符号表示形式。

数据元素: 是数据(集合)中的一个“个体” 是数据结构中讨论的基本单位

数据结构: 带结构的数据元素的集合 或者说,数据结构是相互之间存在着某种逻辑关系的数据元素的集合。

数据结构: 是研究数据的逻辑结构和物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,而且确保经过这些运算以后所得的新结构仍然是原来的结构类型

概括地说: 数据结构是一门讨论“描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中如何表示和实现”的学科。

数据的逻辑结构可归结为以下四类: 线性结构 树形结构 图状结构 集合结构

数据的存储结构 —— 逻辑结构在存储器中的映象 “数据元素”的映象 ? “关系”的映象 ?

关系的映象方法: 顺序映象 用一组地址连续的存储单元 依次存储数据元素 x y

链式映象 以附加信息(指针)表示后继关系 需要用一个和 x 在一起的附加信息指示 y 的存储位置 y x

是指一个数学模型以及定义在此数学模型上的一组操作。 2. 抽象数据类型 (Abstract Data Type 简称ADT) 是指一个数学模型以及定义在此数学模型上的一组操作。

三、算法和算法的衡量 1.算法 2. 算法设计的原则 3. 算法效率的衡量方法和准则 4. 算法的存储空间需求

算法是对解决某类问题的方法的一种描述。一个算法必须满足以下五个重要特性: 1.有穷性 2.确定性 3.可行性 4.有输入 5.有输出

渐近时间复杂度 T (n) = O(f(n)) 随着问题规模 n 的增长,算法执行时间的增长率和 f(n) 的增长率相同。

第二章 线性表

线性表的概念 ---顺序存储 ---链式存储 ---基本操作算法实现

顺序映象方法是: 逻辑关系相邻, 物理位置相邻. 依次存放线性表中的数据元素 基地址 用一组地址连续的存储单元 a1 a2 … ai-1 ai … an 基地址

线性表顺序存储结构 const int MaxSize=50; ElemType list[MaxSize]; struct List { ElemType list[MaxSize]; int size; //当前线性表长度 };

一、有关空表的操作   1.初始化操作 2.清空操作 3.判空操作 *当前线性表长度*

二、有关查找的操作 1.遍历线性表操作 2.查找具有给定值的元素 3.更新表中具有给定值的元素

从表头元素起依次访问每一个元素,并且每个元素只被访问一次 a1 a2 … ai-1 ai … an 基地址 最后一个 L.list[0] L.list[L.size-1]

三 、有关插入的操作   1.末尾添加一个元素 2. 表头插入一个元素 后移 3.插在i位置操作

… an a1 a2 … ai-1 ai … an a1 a2 … ai-1 ai e i位置 表的长度增1 for (int j=L.size; j<=i; j--) { L.list[j]=L.list[j-1]; } 最后的位置 L.size i位置 a1 a2 … ai-1 ai … an a1 a2 … ai-1 ai … an e 表的长度增1

四、有关删除的操作   1.删除表头元素操作 2.删除i位置元素操作 前移

改变为 <ai-1, e> 和<e, ai> 插入、删除、建立等操作 在单链表中的实现: 有序对 <ai-1, ai> 改变为 <ai-1, e> 和<e, ai> ai-1 ai-1 ai e

s s = new LNode; s->data = e; //生成新结点 s->next = p->next; p->next = s; //插入 p ai-1 ai-1 ai e s

q = p->next; p->next = q->next; e = q->data; delete q; ai-1 ai-1 ai ai+1

逆位序输入建立带头结点的单链表 一、建立一个“空表”; 二、输入数据元素an; 三、输入数据元素an-1, 建立结点并前插; p->next = L->next; L->next = p; 四、依次类推,直至输入a1为止。

循环链表 a1 a2 … an 判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。 最后一个结点的指针域的指针又指回第一个结点 a1 a2 … an 判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。

p 双向链表 ai-1 ai-1 ai ai 插入 e s s->right = p->right; p->right = s; s->right->left = s; s->left = p;

删除 ai-1 ai-1 ai ai+1 p p->right = p->right->right; p->right->left = p;

第三章 稀疏矩阵和广义表

稀疏矩阵的概念 压缩存储方法: 一、三元组顺序表 二、带行指针向量的链接存储 三、十字链表

一、三元组顺序表 用“三元组”表示实现矩阵转置 原矩阵 转置后矩阵

二、带行指针向量的链接存储 需要把具有相同行号的三元组结点按照列号从小到大的顺序链接成一个单链表,每个三元组结点的类型可定义为: row col val next

行指针向量 2 2 -7 3 1 36 3 4 28 1 5 -5 1 2 14 vector /\ 三元组 1 2 14 1 5 -5 2 2 -7 3 1 36 3 4 28

三、 十字链表 cv ^ rv 1 1 3 1 4 5 ^ ^ 2 2 -1 ^ ^ 3 0 0 5 0 -1 0 0 2 0 0 0 3 1 2 ^ ^

广义表的概念 广义表是递归定义的线性结构 广义表是多层次的线性结构

广义表结构的特点: 数据元素有相对次序; 2)长度为最外层包含元素个数; 3)深度为所含括弧的重数; 4)可以共享; 原子:深度为 0;空表:深度为 1; 4)可以共享; 5)可以是一个递归的表。

广义表的存储结构 采用头、尾指针的链表结构 tag=1 sublist next tag=0 data next 表结点: 原子结点:

广义表的运算 1.求广义表长度 2.求广义表的深度 递归函数 含直接或间接调用本函数语句的函数

1.求广义表长度的递归算法 int Lenth(GLNode* GL) { if(GL!=NULL) return 1+Lenth(GL->next); else return 0; }

非递归算法如下: int Lenth(GLNode* GL) { int len=0; while(GL!=NULL) { len++; GL=GL->next; } return len; }

深度=Max {子表的深度} +1 2.求广义表的深度 可以直接求解的两种简单情况为: 空表的深度 = 1 原子的深度 = 0 将广义表分解成 n 个子表,分别 (递归)求得每个子表的深度, 深度=Max {子表的深度} +1 可以直接求解的两种简单情况为: 空表的深度 = 1 原子的深度 = 0

…  L L L L 1 1 1 while(L!=NULL) { if(L->tag==true) { L->sublist L->sublist L->sublist while(L!=NULL) { if(L->tag==true) { int dep=Depth(L->sublist); if(dep>max) max=dep; } L=L->next; }

第四章 栈和队列

栈的应用举例 例一、 数制转换 例二、 括号匹配的检验 表达式求值 递归

表达式求值 后缀式: a b  c d e /  f  + 后缀式算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。

如何从后缀式求值? 先找运算符,再找操作数 设立操作数栈 如何从中缀式转换成后缀式? 设立操作符栈

栈与递归 实现递归函数,必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数;反之,一个用栈实现的非递归函数可以改写为递归函数。 递归函数中的尾递归容易消除。

队列的定义 循环队列——顺序映象 链队列——链式映象

Q.front=(Q.front+1)%QueueMaxSize; 9 ... 求余: X %QueueMaxSize 结果在 0~ QueueMaxSize-1 之间 8 1 7 2 6 3 5 4 Q.front=(Q.front+1)%QueueMaxSize; Q.rear=(Q.rear+1)%QueueMaxSize;

循环队列的基本操作: 将新元素item的值插入到队尾 void Qinsert(QueueType& Q, const ElemType& item); 从队列Q中删除队首元素并返回之 ElemType Qdelete (QueueType& Q);

队列的链接存储结构 struct LNode { ElemType data; LNode *next; } ;

链队列类型 struct LinkQueue{ LNode *front; //队头指针 LNode *rear; //队尾指针 } ; … Q.front Q.rear a1 a2 an ∧

进队 ( 向链队中插入一个元素) … a1 a2 an an+1 /\ Q.rear->next=newptr; Q.front Q.rear a1 a2 an ∧ an+1 /\ Q.rear->next=newptr; Q.rear=newptr; newptr

出队 ( 从链头取出一个元素) a1 a2 an p p=Q.front; Q.front=p->next; delete p; Q.rear a1 a2 an ∧ p p=Q.front; Q.front=p->next; delete p;

出队的一种特殊情况 ( 只有一个结点时) a1 p=Q.front; Q.front=p->next; if Q.front=NULL Q.rear=NULL; delete p; Q.front Q.rear a1 ∧ p