数据结构例题选讲.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * 数据结构例题选讲 L7we 二叉堆 二叉堆是一种完全二叉树,树的每个节点有一个权值,对于树的每棵子树都有:其根节点的权值不差于该子树上任何点的权值 功能:O(1)得到堆中的最优值,log(n)的维护 由于二叉堆是完全二叉树,可以像线段树一样用一维数组存储,当数组从下标1开始存储时,对于每个点(下标为i),其父亲结点的下标为i/2,左儿子结点下标为i*2,右儿子结点下标为i*2+1 基本操作:插入,删除 二叉堆 插入: void push(int x) { heap[++heap_size]=x; int cur=heap_size; int father=cur/2; while(father=1) { if(cmp(heap[cur],heap[father])) { swap(heap[cur],heap[father]); cur=father; father=cur/2; } else break; } } 二叉堆 删除: int pop() { int ans=heap[1]; heap[1]=heap[heap_size--]; int cur=1; int child=cur*2; while(child=heap_size) { if(child+1=heap_sizecmp(heap[child+1],heap[child])) child++; if(cmp(heap[child],heap[cur])) { swap(heap[cur],heap[child]); cur=child; child=cur*2; } else break; } return ans; } 树状数组应用 树状数组功能: log(n)复杂度解决区间问题 树状数组中的每个点管辖一段区间,通过某种规则可以方便的把1~n这种区间分成几块,每一块刚好是一个点的管辖区间,于是统计就方便了 每个点记录管辖区域内的和,可以log(n)复杂度求得区间和 每个点记录管辖区域内最值,可以log(n)复杂度求得区间最值 每个点记录 值落在管辖区域内 的数的个数,可以log(n)复杂度求得值在某个区间内的数的个数 等等 Enemy is week 给定n个数a1、a2、a3……an,求满足i,j,k(ijk)使得aiajak成立的i,j,k的三元组个数 (n=10^6,ai=10^6) 枚举i,j,k,复杂度n^3 枚举j,对于每个j寻找满足的i,k,复杂度n^2 Enemy is week 需要至少nlog(n)算法 枚举j,需要优化寻找i,k的办法 树状数组每个点记录有多少个数的值落在其管辖区域内 从前向后扫一遍数组,维护树状数组,对每个j用log(n)复杂度计算满足aiaj的i 从后向前扫一遍数组,维护树状数组,对每个j用log(n)复杂度计算满足akaj的k Cows 给定n个二元组(a1,b1),(a2,b2)……(an,bn),对于每个二元组(ai,bi)计算满足 aj=ai,bj=bi且两不等式不同时取等号 的二元组(aj,bj)的个数 把每个二元组映射为二维空间里的点,a为x坐标,b为y坐标,即是对每个点求位于其左上方,包含正上方、正左方,但不包含重叠点的 点的个数 把点按y从大到小排序,y相等时按x从小到大排序,树状数组维护x值落在管辖区域内的点的个数 注意处理重点情况 字典树 给定一些单词 apple,banana,orange,pear,strawberry …… 给出一些询问,每个询问为一个单词 pear,people,orange… 对于每个询问,回答其是否在给定的单词中出现过 字典树 枚举复杂度n*m*L,n为给定单词数,m为询问数,L为平均单词长度,一般不可接受 假如把单词换成数字,即给定一些数,询问查询某个数是否出现过,假如数的范围不大,直接开数组记录即可,假如数比较大,需要加哈希 重点是如何记录字符串使之可以方便存取 字典树 字典树是一颗t元有序树 t元:t为字符串中可能出现的字符种类数。比如,要用字典树表示纯由小写字母组成的字符串,t为26 有序树:结点的每个儿子互不等价。比如二叉树,左儿子与右儿子有区别 每个结点代表一个字符串,其儿子所代表的字符串为该点代表的字符串后面加一个字符,加的字符与它是父亲的第几个儿子有关 字典树 t=3 空 aa c b a cbb cba acc aca ab ac ba bb bc ca cb cc 字典树 如何表示一棵树 堆线段树,由于是完全二叉树,故可以用一维数组表示 假如用一维数组表示

文档评论(0)

189****6649 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档