上半学期数据结构复习
上半学期数据结构与算法一课和数据结构与算法实习课有很多数据结构要学习,上半学期数算就学习了二叉树和树和图,主要知识包括链表以及二叉树实现和遍历,转置等操作算法,哈夫曼树,并查集等等树算法和图论算法,除此之外就是一些数据结构。数算实习还讲了线段树,树状数组,树堆等高级数据结构。
练习题目在poj数算实习小组上,但是由于数据结构的题目比较裸,所以除非有变化的题目就不放题目和代码了。
各个数据结构难点注意点总结
树状数组
1.注意如果数据范围是0开始的,要统一加一使其从1开始。
2.对于非完全二叉树的树,如果要统计子树信息也满足树状数组应用条件,可以重新标号再应用树状数组。(例题:poj数算实习小组Apple Tree)
线段树
1.注意线段树一般把问题化为处理一个一个离散点的问题,[l,r]表示点l,l+1,…,r-1,r,分治时候边界要弄清楚。
2.如果操作次数远小于区间长度而且离线,可以考虑先读入全部数据再离散化,离散化注意!不可以直接离散化[a,b]为[f(a),f(b)],不然有反例[1,5],[1,2],[4,5],离散化后后两个盖住了前一个,这是因为1.离散数据的局限性。所以要化为[a,b+1)再离散化为[f(a),f(b+1)),即[f(a),f(b+1)-1]才正确。此时上一个例子为[1,6),[1,3),[4,6),保证了原来不相邻的一个右端点和另一个左端点离散化以后仍然不相邻。
3.注意可以把区间长度上调到2的幂次,这样快一点,或者直接开四倍空间,一定要四倍!以下摘自我的一篇作业里的讨论。
关于数组实现线段树分配空间的问题
先考虑一个问题,区间[1,2^k]用数组实现线段树至少需要分配多少元素的空间?设为f(k),因为是完全二叉树,则考虑其根结点1个元素,左右子树各f(k-1),总共为f(k)=2f(k-1)+1,f(0)=1,所以解得f(k)=2^(k+1)-1。这容易给人一个感觉,长为2^k的区间要那么长,是不是长为L区间大概分配2L数量级空间即可?
答案是不是的,对于长为L的区间,2L数量级即使加一个常数也不行,如果这样提交的话代码会通不过测试。
另一方面,4L数量级肯定是可以的,因为2L内必有一个2的幂次,而L分配空间至多只有那个2的幂次的空间,所以至多2L*2=4L,也就是说申请4倍L的空间再加一个比如10的常数肯定是对的。
但是给人的感觉是4L是一个很松的上界,毕竟左右儿子直接是自己两倍左右跳过了一大堆可能没有结点的空间,浪费了那么多空间没有放结点,那么是否存在更紧的上界呢?直觉觉得不仅应该存在,而且应该是2L级别的,毕竟除以2除不尽只是差了一个1,而且2的幂次似乎应该和其它数保持一致,至少是数量级上的一致。但是很遗憾,这与直觉相反,答案的常数常数最小是4,这很有意思。
具体证明比较困难,首先构造一个例子n=2^(2k-2)+2^(k-1),则最大地址可以达到=2^2k-2^k+1,在k无限大时候至少常数是4才可以。发现n的方法是用计算机模拟找出常数比较大的组数再看规律,不过这没什么数学技巧,而证明最大地址这一点可以用数学归纳法证明。事实上如果不追求严谨性,仅仅靠计算机模拟计算就可以断言结论成立了。
当然对于任意L,常数最小是4,而对于题目里具体L,只需要手动找出那个合适的2的幂次即可,可以省下一些空间,当然如果空间并不重要就直接开4L空间即可。
以上的讨论比较肤浅只是简单的计算机模拟,证明不是特别严谨,也省略了具体计算,如果有不正确之处还请指正。
4.区间更新时候不要更新彻底,不然复杂度很高,可以+lazy优化。(例题:poj数算实习小组A Simple Problem with Integers)
大(小)根堆(heap),二叉搜索树(BST),树堆(treap)
注意这三个数据结构的复习,各种操作和变形最好要熟记。
poj练习解题报告
poj数算实习小组题目清单
»树状数组练习题(3题)
Newest Problems
3 Cows 95% 90 95 2014-12-18
2 Apple Tree 94% 108 115 2014-12-18
1 Stars 99% 131 132 2014-12-18»线段树练习题(3题)
Newest Problems
3 Lost Cows 97% 113 116 2014-12-18
2 K-th Number 86% 104 121 2014-12-18
1 A Simple Problem with Integers 90% 174 194 2014-12-18»树堆练习题(4题)
Newest Problems
4 Black Box 94% 76 81 2014-12-18
3 Mayor’s posters 94% 93 99 2014-12-18
2 Tree 79% 30 38 2014-12-18
1 Binary Search Heap Construction 79% 72 91 2014-10-27
Cows
裸树状数组/线段树
Apple Tree
重新对树标号,树状数组
Stars
裸树状数组/线段树
Lost Cows
逆向考虑此问题,化为一个用线段树维护的问题
K-th Number
难题,权值线段树即主席树,但是本题排序+暴力也能过
A Simple Problem with Integers
线段树,区间更新+lazy优化
Black Box
树堆,同时维护左子树结点个数,方便二分查找第k小元素。
Mayor’s posters
线段树+离散化
Tree
难题,似乎和树堆没什么关系?
Binary Search Heap Construction
模拟建立树堆