线性结构.pptx

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线性结构线性结构的类型⑴数组;⑵带头结点的双链表: –Head结点: 虚拟“哨兵” –First结点: 第一个有实际内容的结点⑶队列: –Open-Close表 –循环队列(避免“假溢出”)最小值一个n个元素的线性表A。现有m条命令“t x y” (1≤n,m≤100000): t=0,A[X]=y; t=1,询问闭区间[x, y]中元素的最小值, 。分析利用二级检索的思想 把区间[1,n]分成若干块,每块长度为L=?n1/2?,一共最多?n/L?个块。块i的左右指针为li和ri O(n/L) –维护数组B, 保存每个块的最小值Modify(x,y) –A[x]=yO(1) –更新x所在块i的最小值B[i] O(L)?Min (x, y)操作1、[x,y]在块i内:min(x,y)=min{a[k]│x≤k≤y}2、[x,y]跨越块i…块j: min(x,y)=min{min{a[k]│x≤k≤ri-1}, min{B[k]│i≤k≤j},min{a[k]│lj+1≤k≤y},时间复杂度:O(n1/2) readln(n,m);{输入A表长度和命令条数} l:=round(sqrt(n));{计算块长} a[0]:=maxlongint;{表首初始化} fillchar(b,sizeof(b),$7F);{块的最小值初始化} for i:=1 to n do {输入A表元素,计算块的最小值} begin read(a[i]); if a[i]<b[i div l] then b[i div l]:=a[i];end; for i:=1 to m do begin read(c,x,y);{读第i条命令} if c=0 {A的第x个位置被赋值y,重新调整第x个位置所在块的最小值} then begin a[x]:=y;b[x div l]:=maxlongint; for j:=(x div l)*l to x do if a[j]<b[x div l] then b[x div l]:=a[j] end else begin{计算[x,y]的最小值} j:=x;min:=maxlongint;{计算块前的最小值} while (j mod l<>0)and(j<=y) do if a[j]<min then begin min:=a[j]; inc(j);end; while j+l<=y do if b[j div l]<min then begin min:=b[j div l];inc(j,l);end;{比较被”跨越”的块间的最小值, 调整最小值} while j<=y do if a[j]<min then begin min:=a[j];inc(j);end;{比较块后的元素, 调整最小值} writeln(min){输出最小值} end end;例2. 最接近的值给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数。即对于每个i,计算Ci=min{|Ai-Aj| | 1<=j<i},规定C1=0。分析问题的关键: 你只需要解决离线问题 –在线问题: 每输入一个Ai, 立刻输出Ci –离线问题: 在给出任何输出之前得到所有Ai预处理: 用O(nlogn)时间给所有Ai排序 主算法 根据从小到大的顺序构造双向链表 依次计算Cn, Cn-1, …, C1 在线问题可能么?主算法A={2, 6, 5, 10, 4, 7}, 依次计算C6, C5, C4,‥‥ –每次计算Ci时, 链表中恰好是计算Ci需要的元素 –计算Ci只需比较两个元素,然后删除AiO(1)type linktype=^node;{双链表元素} node=record v:longint;{数值} pre,next:linktype{前驱指针和后继指针} end; ttype=record{递增序列的元素类型} v,id:longint{数值和在原序列的下标} end;var n,i:longint;{A的长度为n} p,q:linktype;{ 循环链表的辅助指针} a,c:array[1.of longint;{原序列为a,最接近序列c} b:array[1. of ttype;{递增序列} link:array[1.of linktype;{递增序列对应的双链表}数据结构 read(n);{输入序列A,递增序列b初始化} for i:=1 to n do begin read(a[i]);b[i].v:=a[i];b[i].id:=i end; A按照递增顺序排成b; q:=nil; for i:=1 to n do {计算A序列中每个元素在递增序列中对应

文档评论(0)

企管文库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档