第四周ACM博客总结

这一周基本对算法知识进行了一次细致的阅读,自己也对算法知识有了更深一步的了解。这一周自己先将上周剩下的一点STL的内容补上了,这些容器之间相似的地方有很多,但都有各自的优点所在,需要结合题目特点进行选择使用。然后自己结合老师发的资料又详细思考了一下深度优先搜索和广度优先搜索的思路和原理。与此同时,自己也阅读了分治和动态规划的一些内容,因为这两项有些类似之处,就一块看了,大体的思路自己也有了一定的了解。

sort排序不但可以对整型进行排序,还能对字符串进行排序,默认是升序的,也是一种快速排序。例如,string str="kdcbajef";sort(str.begin(),str.end());。如果要降序排列,可以定义bool cmp(int a,int b){return a>b;} ,然后再main函数中sort(a,a+10,cmp),这样就可以降序排列。list是一个双向的链表,空间可以不连续,通过指针进行数据的访问,不能随机访问。set是用二叉搜索树实现的,容器内每一个元素,只会出现一次,并且是排好序的,可以去重。map是一个关联容器,内部函数的实现是利用平衡二叉树实现的,效率高。vector容器是单向开口的连续内存空间,而deque是一种双向开口的连续线性空间,可以在头尾两端分别插入和删除,vector也可以在头尾插入元素,但是头部操作效率不高。deque是由一段段的连续空间组成,在头部和尾部增加新的空间,就要配置一段连续的空间,连在deque的头部或者尾部。

搜索算法的原理就是枚举,常见的有深度优先搜索和广度优先搜索。深度优先搜索一般用于求可行解,广度优先搜索一般用来求最优解。

深度优先搜索,就是一直往下走,如果走不通的话再回来,换条路再走,知道结束为止。就是要先选一个起始点,访问当前结点,做好标记,然后跳转,如果存在一个和当前结点相邻且未被访问的结点,则将这个结点变成当前结点,重复刚才的操作,如果不存在那样的结点,就回过头来继续寻找,就是一种枚举完所有完整路径遍历所有情况的搜索方法。换一种说法,就是从根结点出发深度搜索,当搜索到某一结点时,就要判断该结点是否包含问题的解,如果包含,就从这个结点出发继续搜索下去,如果这个结点不包含问题的解,就往回走一步,再来进行搜索。

广度优先搜索,就是类似于一种分身吧,多条路径同时寻找。先是要选择一个起始点放入一个先进先出的队列中,如果队列不是空的,显示首元素,标记为当前结点,然后将与当前结点相邻并且还没有被访问的结点信息进行更新,全都放入队列中,再执行刚才的操作。也就是在扩展的结点处,先生成所有的分支,然后再进行选择,就像是这样不断的往下进行搜索。

分治算法,就是分开进行解决,把一个复杂的问题分成很多相似的小问题,一直到最后可以简单的解决问题。动态规划,可能和分治算法有些类似吧,也是将要解决的问题分成几个小的问题,按顺序求解,前一个问题的解为后面一个问题的解决提供有用的信息。解决任何一个问题的时候,列出各种可能的局部解,通过判断保留最优解,依次解决各个问题,最后一个问题就是初始问题的解。动态规划和分治法的区别就是动态法分解之后的问题不是互相独立的,下一个问题和上一个有关联,然后再进行解决。对这一部分内容,目前只是初识,自己以后要更加细细的学习。

以上就是这一周的总结了,我认为学习算法要把握住本质,一遍遍的进行学习,一直到懂了为止。希望自己能够更加深入的去研究算法知识,弄清楚算法本质的原理,来解决各种各样的算法题目。下一周还是希望自己在学习基本知识的基础上能够多练习点题目,通过题目进行知识的总结和熟练应用,以便可以解决更多相关的问题。

你可能感兴趣的:(算法,C++,c++,算法)