收藏 分享(赏)

数据结构课件第8章 查找表(简).PPT

上传人:魏子好的一塌糊涂的文献 文档编号:2679036 上传时间:2020-08-18 格式:PPT 页数:128 大小:1.97MB
下载 相关 举报
数据结构课件第8章 查找表(简).PPT_第1页
第1页 / 共128页
数据结构课件第8章 查找表(简).PPT_第2页
第2页 / 共128页
亲,该文档总共128页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、净眀(囔熴堶熴讀缁H缀窢挨澊唀椀椂鴃鴃鴃鬛瀝湥葾鑓靵奬瀀湥葾彧繧桢悈顎瀀瀀琀戀昀搀昀挀昀昀攀最椀昀瀀湥葾鑓靵奬灲湥葾彧繧桢悈顎瀀瀀琀尀尀愀戀搀昀挀戀昀攀昀挀最栀稀伀儀砀渀娀洀樀琀愀刀戀唀稀礀娀娀昀欀最砀稀伀伀欀挀眀瀀湥葾鑓靵奬瀀湥葾彧繧桢悈顎瀀湥葾鐀需夀繧怀顎暘昀愀攀搀戀搀昀搀搀挀挀繧桢悈顎愀戀挀搀攀昀最怀顎氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀繧昀繧攀繧最怀顎氀漀眀洀椀搀栀椀最栀匀猀甀挀挀怀顎匀猀甀挀挀愀渀攀戀愀爀甀渀攀甀氀礀瀀爀愀礀甀最匀攀瀀伀挀琀一漀瘀攀挀怀顎匀猀甀挀挀甀氀礀攀挀愀礀甀渀攀愀渀瀀爀伀挀琀攀

2、戀匀攀瀀一漀瘀愀爀甀最瀀爀甀最攀挀攀戀愀渀甀氀礀甀渀攀愀爀愀礀一漀瘀伀挀琀匀攀瀀怀顎琀礀瀀攀搀攀昀猀琀爀甀挀琀一漀搀攀笀氀攀洀吀礀瀀攀搀愀琀愀猀琀爀甀挀琀一漀搀攀渀攀砀琀紀一漀搀攀椀渀欀椀猀琀琀礀瀀攀搀攀昀猀琀爀甀挀琀笀一漀搀攀栀栀T一漀搀攀琀琀繧葢紀匀椀猀琀怀顎一漀搀攀匀攀愀爀挀栀开匀椀猀琀匀椀猀琀攀氀猀攀椀昀琀最琀搀愀琀愀最琀欀攀礀昀漀爀瀀栀瀀最琀搀愀琀愀欀攀礀瀀瀀最琀渀攀砀琀攀氀猀攀昀漀爀瀀琀瀀最琀搀愀琀愀欀攀礀瀀瀀最琀渀攀砀琀琀瀀瑥衣爀攀琀甀爀渀瀀紀匀攀愀爀挀栀开匀椀猀琀遒蹵顎驐繧齢葒靧獧蹑縀蒍怀顎怀顎欀欀伀搀椀椀欀伀椀洀瀀捓腑椀椀搀椀伀猀垕轛伀伀伀伀伀搀伀伀搀伀伀搀伀伀搀伀匀猀甀挀挀

3、怀顎湨殈偖葛驶靓桟羈涕搀浓烿瀀欀猀垕陛垙轫u腑葺掐桒猀垕轛娀伀儀一匀唀一娀伀唀圀唀一圀一一伀夀一一一伀倀儀刀匀吀唀嘀圀堀夀娀夀一娀伀唀一一伀一儀一匀唀一圀唀娀伀怀顎娀伀儀一匀唀一娀伀唀椀娀伀唀搀椀伀圀唀一椀一搀椀伀圀一椀圀一搀椀伀一椀一搀椀伀伀椀伀搀椀伀夀一椀夀一搀椀伀一匀猀甀挀挀怀顎塬葾琀礀瀀攀搀攀昀猀琀爀甀挀琀笀氀攀洀吀礀瀀攀搀愀琀愀一漀搀攀渀攀砀琀紀一漀搀攀一漀搀攀瀀琀爀琀礀瀀攀搀攀昀猀琀爀甀挀琀笀一漀搀攀瀀琀爀攀氀攀洀椀渀琀挀漀甀渀琀喋灟椀渀琀猀椀稀攀椀渀搀攀砀桞紀愀猀栀吀愀戀氀攀怀顎匀琀愀琀甀猀甀椀氀搀开愀猀栀愀猀栀吀愀戀氀攀吀攀氀攀洀渀攀眀一漀搀攀瀀琀爀嬀洀崀桺衣昀漀爀椀椀氀琀洀椀

4、吀攀氀攀洀嬀椀崀一唀吀挀漀甀渀琀吀猀椀稀攀椀渀搀攀砀洀攀礀吀礀瀀攀欀攀礀挀漀甀琀氀琀最琀欀攀礀眀栀椀氀攀欀攀礀焀最琀渀攀砀琀一唀怀顎渀欀攀礀椀昀吀攀氀攀洀嬀渀崀吀攀氀攀洀嬀渀崀焀尀梔蒈攀氀猀攀笀昀漀爀瀀吀攀氀攀洀嬀渀崀瀀最琀渀攀砀琀瀀瀀最琀渀攀砀琀瀀最琀渀攀砀琀焀散梔紀吀挀漀甀渀琀挀椀渀最琀最琀欀攀礀紀眀栀椀氀攀爀攀琀甀爀渀伀紀甀椀氀搀开愀猀栀伀傛絛葙v艼葭蝶肕砀瘀樀氀刀夀洀礀爀圀圀昀椀愀戀夀砀瀀堀倀最琀爀焀琀堀礀欀吀焀眀儀瀀愀唀倀戀洀挀稀唀繧桢悈顎愀戀挀搀攀昀最怀顎氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀愀戀挀搀攀昀最氀漀眀洀椀搀栀椀最栀繧昀繧

5、攀繧最怀顎氀漀眀洀椀搀栀椀最栀匀猀甀挀挀怀顎匀uot;) F2.WriteLine(床前明月光,疑是地上霜。) F2.WriteLine(举头望明月,低头思故乡。) MsgBox(文件已建立!) F2.Close() 关闭与输出流类对象F2关联的文件 End Sub End Class 8.4.2 StreamReader类 StreamReader类主要用来从文本文件读取数据。 1StreamReader类的构造函数 StreamReader类构造函数主要有两种格式。 格式1:Public Sub New( stream As Stream ) 功能:把参数stream指定的流对象初始化为S

6、treamReader 类的新实例。 格式2:Public Sub New( path As String ) 功能:把参数path指定的文件初始化为StreamReader类的 新实例。 这种流类新实例(对象) 既可以与文件流对象相关联, 也可以直接与外部文件相关联。 对文本文件进行读操作,需调用StreamReader类构造函数 ,创建StreamReader类对象。 语法格式: Dim As New StreamReader( ) 或 Dim As New StreamReader( ) 例如,若要打开文本文件“D:File1.txt”,准备进行 读操作,可以用以下两种方式建立Strea

7、mReader流对象。 首先建立FileStream类对象打开文件,然后使用 FileStream类对象调用StreamReader构造函数建立 StreamReader对象: Dim FS As New FileStream( D:File1.txt , FileMode.Open ) Dim SW As New StreamReader(FS) 直接调用StreamReader构造函数打开文件,建立 StreamReader对象: Dim SW As New StreamReader(D:File1.txt) 2StreamReader类的常用方法 (1)Read方法 Read方法用来从文

8、本文件里面读取字符。 格式:Public Overrides Function Read() As Integer 功能:读取输入流类对象中当前位置的一个字符,并使流 的当前位置提升一个字符,也就是说,使“流指针”指向下一 个字符。 该方法返回一个整数(ASC码) ,在到达流的末尾时返回 -1。 例如,下面语句: Dim chrA,chrB,chrC As Char chrA =F3.Read() chrB =F3.Read() chrC= F3.Read() 功能:从输入流类对象F3中读取前3个字符分别存放到字 符变量chrA、chrB和chrC中。 (2)ReadLine方法 ReadLi

9、ne方法从文本文件读取一行字符。 格式:Public Overrides Function ReadLine()As String 功能:从输入流类对象当前位置开始读入一行字符,并将该 行字符作为字符串返回,返回的字符串不包含回车换行符。 如果当前位置为输出流的末尾,则返回值为Nothing(空引 用)。 (3)Peek方法 格式:Public Overrides Function Peek() As Integer 功能:返回流中当前位置的字符的整数值(ASC码),但 一般不使用它。 如果没有可读取的字符,则返回-1。 说明: Peek方法不会改变输入流的当前位置。 (4)ReadToEnd

10、方法 格式:Public Overrides Function ReadToEnd() As String 功能:从输入流类对象当前位置开始读入字符,直到文件的末 尾,并把所读取的字符作为字符串返回。 如果当前位置位于流的末尾,则返回空字符串 ()。 例8-3 Read方法的测试。从文件“D:File1.txt”中 读出字符在TextBox1文本框中显示。 Imports System.IO Public Class Form1 Private Sub Form1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Hand

11、les Me.Click Dim F3 As New StreamReader(D:File1.txt) Dim chrA As Char Do While F3.Peek() -1 chrA = Chr(F3.Read() TextBox1.Text = TextBox1.Text & chrA Loop F3.Close() End Sub End Class 例8-4 ReadLine方法的测试。从“D:File2.txt”文 件中读出内容并在TextBox1文本框中显示。 Imports System.IO Public Class Form1 Private Sub Form1_Cl

12、ick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Click Dim F4 As New StreamReader(D:File2.txt) Dim line As String line = F4.ReadLine() Do While line Nothing TextBox1.Text = TextBox1.Text & line & vbCrLf line = F4.ReadLine() Loop F4.Close() End Sub End Class 例8-4 ReadLine方法的测试。从“

13、D:File2.txt”文 件中读出内容并在TextBox1文本框中显示。 Imports System.IO Public Class Form1 Private Sub Form1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Click Dim F4 As New StreamReader(D:File2.txt) Dim line As String line = F4.ReadLine() Do While line Nothing TextBox1.Text = TextBox1.Te

14、xt & line & vbCrLf line = F4.ReadLine() Loop F4.Close() End Sub End Class line = F4.ReadToEnd() TextBox1.Text = line 8.5 读/写二进制文件 读/写二进制文件也需要建立FileStream类对象以 打开文件,并使用BinaryReader类和BinaryWriter类 对象来读/写数据。 8.5.1 BinaryWriter类 1BinaryWriter类的构造函数 BinaryWriter类构造函数有多个重载版本,下面仅 介绍常用的格式及其功能。 格式1:Public Sub

15、 New(output As Stream) 功能:把参数output指定的输出流,用UTF-8编码初 始化为BinaryWriter类新实例。 格式2:Public Sub New(output As Stream, encoding As Encoding ) 功能:把参数output指定的输出流,以encoding参 数指定的编码方式初始化为BinaryWriter类新实例。 encoding参数用来指定输出流的编码方式。 例如,Encoding.ASCII、Encoding.Unicode和 Encoding.UTF8等3种不同的字符编码方式。 要操作二进制文件,先要打开文件,即创建F

16、ileStream类 对象,并建立该文件流对象与实际文件的关联。 这个流对象就是构造BinaryWriter类对象的output参数。 调用BinaryWriter类构造函数,创建BinaryStream类对象 ,建立文件流对象与实际文件的关联,语法格式: Dim As New BinaryWriter(,) 例如,打开一个二进制文件“D: File3.dat”,准备进 行写操作,要执行以下语句: Dim FS As New FileStream(D:File3.dat, FileMode.Create,FileAccess.Write) Dim BW As New BinaryWriter(

17、FS) 执行以上两个语句后,BinaryWriter类对象BW建立了与流 对象FS的关联,以后就可以对实际文件“D:t / 串的链表结构 Chunk *head, *tail; / 串的头和尾指针 int curlen; / 串的当前长度 LString; 在以链表存储串值时, 结点大小的选择将直接影响串处理 的效率。定义串的存储密度: 存储密度=串值所占的存储位/实际分配的存储位 显然,存储密度小(如结点大小为1),操作方便,然而存储占用量大 。 例如: 在编辑系统中,整个文本编辑区可以看成是一个串,每 一行是一个子串,构成一个结点。即: 同一行的串用定长结构 (80个字符), 行和行之间用

18、指针相联接。 Monday, April 12, 2010 nysfxy 19 5.3 串的模式匹配算法 是串的一种重要操作,很多软件,若有“编辑”菜单项的话,则 其中必有“查找”子菜单项。 回忆一下串匹配(查找)的定义:求子串位置:Index(S,T,pos) 初始条件:串S和T存在,T是非空串,0pos0)的“列后继”,又是同行元素ai,j-1 (j0)的“行后继”。它既在一个行表中,又在一个列表中。 N维数组是“其数据元素为N-1维数组”的线性表。 数组的每一维的下界都约定为0。一般情况下,数组每一维的 上、下界都可以任意设定。但数组一旦被定义,其维数和每一 维的上、下界均不能再变。数组

19、中元素之间的关系也不再改 变。 Monday, April 12, 2010 nysfxy 24 基本操作: 1 1)初始化:)初始化:InitArray( =0; jposjpos=-1;=-1; istartistart=0; =0; / /第一条对角线起始元素行下标第一条对角线起始元素行下标 for(kfor(k=-(m-1);k0) istartistart+;+; /for /for / /diagmaxldiagmaxl 沿对角线方向的扫描函数沿对角线方向的扫描函数diagscan(i,jdiagscan(i,j) ): : Monday, April 12, 2010 nysfx

20、y 30 void void diagscan(intdiagscan(int i, int j) i, int j) eqeq=0;len=0; =0;len=0; / /在一次扫描开始时对在一次扫描开始时对eqeq和和lenlen初始化初始化 while(iwhile(i n ; jposjpos= =sj sj; ; /if/if eqeq=0;len=0; =0;len=0; / /重新开始求新的一段连续出现的重新开始求新的一段连续出现的1 1 /else if/else if i+; j+; i+; j+; / /继续考察该对角线上当前的下一个元素继续考察该对角线上当前的下一个元素

21、/while/while / /diagscandiagscan Monday, April 12, 2010 nysfxy 31 算法算法5.75.7:求最长公共子串(:求最长公共子串(subsub的长度的长度) int int maxsamesubstring(charmaxsamesubstring(char *string1, char *string2, char * p2=string1; p1=string2; p2=string1; for( i=0; in; i+) for( i=0; in; i+) for( j=0; jm; j+) for( j=0; jm; j+) i

22、f( *(p1+i)=*(p2+j) if( *(p1+i)=*(p2+j) matijmatij=1;=1; else else matijmatij=0; =0; / /求出两个串的对应矩阵求出两个串的对应矩阵mat mat diagmaxldiagmaxl( mat, ( mat, maxlenmaxlen, , jposjpos ); ); / / 求得求得string1string1和和string2string2的最长的最长 / /公共子串的长度公共子串的长度maxlenmaxlen以及它在以及它在string1string1中的起始位置中的起始位置jposjpos if ( if

23、 (maxlenmaxlen=0) *sub = 0;=0) *sub = 0; else else SubStringSubString (sub,string1,jpos,maxlen (sub,string1,jpos,maxlen);/);/求得最长公共子串求得最长公共子串 return return maxlenmaxlen; ; / /maxsamesubstringmaxsamesubstring O(mO(m*n)*n) Monday, April 12, 2010 nysfxy 32 算法算法5.75.7求子串函数求子串函数 SubStringSubString ()( ()

24、(C+C+语言实现语言实现): ): void void SubString(charSubString(char * char *p; int k= int k=lenlen; ; sub=new charlen+1; sub=new charlen+1; / /为子串分配空间为子串分配空间 p=p=str+sstr+s; ; while(kwhile(k) ) / /复制子符序列复制子符序列 *sub+=*p+; k-; *sub+=*p+; k-; *sub=0; *sub=0; sub=sub- sub=sub-lenlen; ; / /指针复位指针复位 SubStringSubStr

25、ing Monday, April 12, 2010 nysfxy 33 5.6 矩阵的压缩存储 假若值相同的元素或零元素在矩阵中的分布有一定规律, 则称它为特殊形状矩阵,否则称为随机稀疏矩阵。 5.6.1 特殊形状矩阵的存储表示 1.对称矩阵 若N阶方阵A中的元素满足下述性质: aij=aji (i,j=0,1,2,n-1),则称A为对称矩阵。 对称矩阵中的元素关于主对角线对称,可以为每一对对称元素 只分配一个存储空间,则可将n2个元素压缩到n(n+1)/2个元素 的空间。 假设以一维数组Bn(n+1)/2存放对称矩阵的下三角中的元 素,其中Bk存放aij,则由等差数列的求和公式得出下标转换

26、 公式。 Monday, April 12, 2010 nysfxy 34 对于任意给定的一组下标(i,j),均可在B中找到对应的矩阵元素, 称Bn(n+1)/2为n阶矩阵的压缩存储。 2.三角矩阵 以主对角线划分,有上三角和下三角两种:所谓上(下)三角 矩阵:是指矩阵的下(上)三角(不包括主对角线)中的元素 均为常数c或零的n阶矩阵。 以上三角矩阵为例:存储方法与对称矩阵相类似:矩阵中的上三 角元素正好有n(n+1)/2个,而下三角的元素均为常数c,可共享 一个存储空间。 Monday, April 12, 2010 nysfxy 35 3.带状矩阵 是n阶矩阵中的所有非零元素都集中在以主对

27、角线为中心的 带状区域中。即除了主对角线上和主对角线邻近的上下方,所 有其它的元素均为零。 以对角矩阵为例:以行序为主序压缩存储在一维数组B3n-2 中,下标变换公式: k=(3(i-1)-1)+j-i+2=2i+j-3 ( |i-j|=1 ) 以上矩阵,由于其非零元素的分布有一明显的规律,从而可 以找到一个下标变换公式,因而仍然可以实现随机存取。 5.6.2 随机稀疏矩阵的存储压缩 假设 m 行 n 列的矩阵含 t 个非零元素,则称 为矩阵的稀疏因子。通常认为 0.05 的矩阵为稀疏矩阵 Monday, April 12, 2010 nysfxy 36 在存储稀疏矩阵时,为了节省存储单元,很

28、自然的 压缩存储方法就是只存储非零元素。但由于非零元素的 分布一般没有规律,因此,在存储非零元素的同时,还 必须存储适当的辅助信息,才能迅速确定一个非零元素 是矩阵中的哪一个元素。 最简单的方法:将非零元素的值和它所在的行号、列号 作为一个结点,存放在一起。于是矩阵的每一个非零元 素就由一个三元组(i,j,aij)唯一确定。 由此,一个稀疏矩阵可以用表示非零元素的三元组序列 来表示。 Monday, April 12, 2010 nysfxy 37 举例:已知稀疏矩阵M及行列数,写出其按行序为主序的三 元组序列。 结果为(1,2,12), (1,3,9),(3,1,-3),(3,6,14),(

29、4,3,24), (5,2,18),(6,1,15),(6,4,-7)。对应上述的三元组序列可以看成是 数据元素为三元组的线性表。 Monday, April 12, 2010 nysfxy 38 1. 三元组顺序表 将非零元素的值和它所在的行号、列号作为一个结点, 存放在一起。每一个非零元素就由一个三元组(i,j,aij) 唯一确定。 以顺序存储结构存放三元组的线性表,则可得稀疏矩阵 的一种压缩表示方法称之为三元组顺序表。 类型定义:假设稀疏矩阵中非零元素的最大个数为100 const maxsize=100; typedef int ElemType typedef struct int

30、i, j; /该非零元的行下标和列下标 ElemType e; / 该非零元的值 Triple; / 三元组类型 Monday, April 12, 2010 nysfxy 39 typedef struct Triple datamaxsize+1; /0号单元未用 int mu, nu, tu; /矩阵的行数、列数和非零元个数 TSMatrix; / 稀疏矩阵类型 下面以矩阵转置为例讨论对稀疏矩阵的运算,设M为 mn的矩阵,T为nm的矩阵,则由M求T的算法为: void transpose(ElemType M, ElemType T ) for(col=1;col=n;col+) for

31、(row=1;row=m;row+) Tcolrow=Mrowcol; /transpose Monday, April 12, 2010 nysfxy 40 用三元组表示稀疏矩阵时,求矩阵转置的运算就演化为“ 由M的三元组表求T的三元组表”的操作。 ijvijv 1 1 3 3 4 5 6 6 2 3 1 6 3 2 1 4 12 9 -3 14 24 18 15 -7 1 1 2 2 3 3 4 6 3 6 1 5 1 4 6 3 -3 15 12 18 9 24 -7 14 (a)矩阵M的三元组表 (b)矩阵T的三元组表 Monday, April 12, 2010 nysfxy 41

32、转置思想:(1)将矩阵的行列值相互交换; (2)将每个三元组中的 i和j相互调换; (3)重排三元组的次序为转置矩阵。 1.按照矩阵M的列序来进行转置(按需点菜) void TransposeSMatrix(TSMatrix M, TSMatrix T.nu=M.mu; T.tu=M.tu; int q=1; for ( int col=1;col=M.nu; col+) for ( int p=1; p = M.tu; p+) if ( M.datap.j=col) T.dataq.i=M.datap.j; T.dataq.j=M.datap.i; T.dataq.e=M.datap.e;

33、q+; Monday, April 12, 2010 nysfxy 42 算法的时间复杂度为O(nt), 最坏情况下,当t=mn时,时 间复杂度为O(mn2),采用正常方式实现矩阵转置的算法 时间复杂度为O(mn)。 2. 依次按三元组表M的次序进行转置,转置后直接放到三元组 表T的正确位置上。这种转置算法称为快速转置算法(按位就座 )。为了能将待转置三元组表M中元素一次定位到三元组 表T的正确位置上,需要预先计算以下数据: (1) 待转置矩阵M每一列中非零元素的个数(即转置 后矩阵T每一行中非零元素的个数)。 Monday, April 12, 2010 nysfxy 43 (2) 待转置矩

34、阵M每一列中第一个非零元素在三元组表T中 的正确位置(即转置后矩阵T每一行中第一个非零元素在三元 组T中的正确位置)。 需要设两个数组num 和rpos ,其中numcol用来存放三 元组表M中第col(col=1,2,M.nu)列中非零元素个数(即三元 组表T中第col行非零元素的个数),rposcol用来存放转置前 三元组表M中第col列(转置后三元组表T中第col行)中第一 个非零元素在三元组表T中的正确位置。 Monday, April 12, 2010 nysfxy 44 2221010 + + + + + + 1357889 1234567 1234567 num rpos 累加求

35、和运算 M.nuMAXMN Monday, April 12, 2010 nysfxy 45 const MAXMN=100 /矩阵行或列的最大值 int num, rpos; void creatpos(TSMatris M) /求M中每一列的第一个非零元素在T.data中的起始序号 for(col=1;col=M.nu;col+) numcol=0; for(t=1;t=M.nu;t+) numM.datat.j+;/求M中每一列所含非零元素的个数 rpos1=1; for(col=2;col=M.nu;col+) rposcol=rposcol-1+numcol-1; /creatpos Monday, April 12, 2010 nysfxy 46 status FastTransposeSMatrix(TSMatrix M, TSMatrix T.nu = M.mu; T.tu = M.tu; if (T.tu) creatrpos(M);

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 网络技术 > 热门技术

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报