您的位置:首页 > 其它

2017年9月21日训练总结

2017-09-21 22:03 190 查看
这次训练总结写的是9月18日到9月21日。

总体来说线段树没有什么进展,于是就直接从头开始看数据结构了。由于这几天充分的将零碎的时间利用了起来,加上刚开始看的STL部分比较简单,也学到了好多东西,也发现好多东西老师上课的时候都讲过。下面总结一下这这四天的成果:

1、栈(stack)和队列(queue)。

早就讲过概念,但是由于缺乏相关练习题进行训练总结,未熟练应用。这几天才突然发现有很重要的作用。栈就是解决一些先进后出类的问题,而队列是先进先出,在搜索的时候也早已熟悉了它的用法和相关的操作,更有用的是优先队列(priority_queue<int> q;),通过优先队列每次改变队列中的元素的时候都可以一下就取到最优值,节省了大量时间,而且在比如求第K大数等问题中用优先队列很容易就能解决,在参加的一些网络赛中我也是灵机一动想到了这个,往往能多出一道题。有些问题不是算法不够优,而是存的的容器不对。

2、vector动态数组和map映射

动态数组一个很大的优点就是不用事先定好开多么大,而且它可以存大量的元素,与结构体结合用可以使问题简化很多。定义为 vector<int> v;  。vector与pair结合运用就相当于数组里存的元素是有两个元素的结构体。(v.push_back(make_pair(x,y))),取的时候(int x=v[i].first,y=v[i].second;)vector一个优点就是可以直接用下标读存。另外,与map结合就可以构成不占多少内存的超大二维数组map<int,vector<int>> mp;  ,mp.count(v)==0
 判断mp[v]是否建立,未建立就用mp[v]=vector<int>();建立一个空的vector即mp[v]。另外,map直接映射的优点使它能存无限的东西。。。比如map<int,string> ,无论多大的不超过int的数和多长的字符串,开数组会炸掉,但是map不占内存又很方便。上次也是偶然想到这一点才在最后半小时又出了一道题。

3、list 链表

链表的删除和插入元素非常快,但是由于每一个元素的地址都存在前一个元素中,查找起来必须从头开始找。。。它不像vector那样可以直接从下标读取。它的优点是删除一个元素,不用把后面的元素都往前移一位,非常方便。也支持很多函数,比如v.assign(10,2);  将10个值为2的元素赋到list中。头部尾部都可以插入元素,倒着输出、排序、清空、删除指定数字、判断是否为空、删除重复元素等都可以用函数直接办到。用数组也可以模拟链表,上周比赛有一个题就是这样,是HDU 6215。用数组模拟链表加队列可以完美解决。

STL个人感觉十分重要,对一些题目的时间、空间优化有非常重要的作用(好像数据结构都是这样),有时候算法会了,却只差一个STL优化。

今天花了一下午的时间看了一下hash,发现还有这么神奇的东西。。。用特殊的hash函数把指定的数变成数组的下标,查询的时间复杂度变成了无法优化的o(1)。。。但是只看了一个最简单的例题,还没完全搞懂,这几天继续看,尽快理解并熟练运用,然后开始看堆的相关知识。

即使看不懂,即使知道自己能力严重不足,我也不会放弃,我会更加努力,我相信我的努力会有成果,我会一直坚持下去,抱着我对ACM的热爱,抱着我的小小的理想,每日每夜地奋斗,明年的今天,可以自信对自己说,你努力过,你不后悔。即使现在成功不了,坚持下去,总有成功的一天。加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 训练日记