zoukankan      html  css  js  c++  java
  • 数据结构和算法总览

    数据结构和算法总览

    一。大部分问题抽象其数据类型,可分为三种。

    抽象出3种数据模型,并研究这3种模型的存储及常用操作,对于解决问题有很大帮助。而且有个重要一点就是让程序员交流起来更顺畅,代码都是推荐的那个套路,减低bug和提高效率。

    1.线性关系(可表示1对1关系模型, 天然存在于数据本身就是一个挨一个这种类型。如一个班学生按学号排位)

    2.树型关系,常见二叉平衡二叉(表示1对多关系,天然存在于树型层级的关系,或适合对半分的情况,如学生会分级管理, 地区分级,公司分级,成绩分级)

    3.图关系(表示多对多关系,天然存在于相对独立,分散的关系,如学生们之间的关系,城市间关系,)

    逻辑上模型有3种,数据的存储一般是3种,顺序存储和链表存储,还有一个hash  .

    在队列逻辑数据结构中,一般队列和环形缓冲这2中队列,体现了对存储天生的需求不同,非常经典,一般队列,选用链表,方便删除和添加,而环形队列,因为固定大小选用顺序存储,方便读起,

    二。大部分问题归纳其解决思路,大致分为分治,贪心,动态,回溯等思路,即算法。

    解决问题,也就是算法实现的过程,需要数据结构来实现。二者是一起产生的。

    面对一个问题如何分析?自己总结最灵魂的一句话就是如何找出同样形式和性质的小问题,分治,贪心,动态,无不包含此目标。

    总体思路,先把问题极简化,简化到心算就可以求解。再慢慢扩大规模,试图发现规律。大概知道规律后,先尝试分治法,因为分治有递归好基友帮忙,好实现,又好理解。

    还有一种就是每步都是最优解,期望最后是最优解,就是贪心。

    如果需要知道所有解才行的问题,那么也可以先尝试解答最小解,并记录,避免上层重复求解子问题。这就是动态表格法

    如果一个问题很小,很简单,那么一般解决操作也会很简单。也就没有研究的价值,所以一般需要研究的是问题规模比较大,所以才需要研究。

    那么很自然,算法的目标就是发现规律,把大问题分解为同样形式和性质小问题,并组合起来。这种自然的思路就是分治

    分治含有2个注意点:

    1,divide和combine 分解和组合,   原问题分解为同质的小问题的组合(X=X1+X2+a),X,无法由具体的操作表示。 a,某个具体的操作

    2.  comquer 解决  Xn=b+c   ,    最后问题减少规模到某个阀值,可以表示为某些具体操作。

    所以最终问题都变成了具体操作的组合。 X=((b+c)+(b+c)+a)+........................

    还有一种相对应的思路就是,每步都是最优解,并更新数据,让问题性质不变,只是缩小问题规模,叫贪心这样很大可能是次优解,但某些问题也是最优解,需证明。

    贪心具体的操作

    做完当前操作,删除此元素,并更新删除这个元素所带来的条件变化来减少规模。直至达到目标。

    基本上就是分治和贪心这两种思路,

    在这2个大思路下,针对某些特殊问题,如图的最短路径问题,需要考虑所有解,才能知道最优,如最终有A,B,C方案。而A方案其实又需要求解a1,a2,a3,b1.  而B方案需要求解 b1,b2,a1,如果从上往下就会发现会重复计算很多子方案。

    所以动态法其中一种就是表格法,从低往上,记录每个规模的最优解。提供给更大规模使用。也就是先求a1, b1,再求A.和B,C看看好。

    又比如切钢条。看看只有2寸,最好的方案是哪个是1+1,还是单个2寸。3寸最好的方案:是1,1,1, 还是 1,2  ,因为2的最佳方案之前求过,所以可以省去重复计算。如此   一个一个上去。直到我们需要的尺寸。

    动态:贪心算法,比如安排活动数量最大问题,是做出一个选择,减少问题规模,再继续选择,直到最后一次选择。依据是最优子结构。

    而动态,比如切钢条是无法做出第一个选择的,需要自底向上计算最优解答,并保存,一步一步达到我们的目标规模。依据也是最优子结构。

    所以动态解决的问题是需要考虑所有解,才能知道最优,而且最优包含子最优。所以从最低最优解,并记录。到最低+1层最优解解。一直到目标。

    综合,算法基本核心就1个:分解问题。

    从大直接分割为几个小部分有:分治的快排法

    从小部分组合为整体有:分治的归并法

    从小往大一层一层独立推进有 ,分治的汗罗塔的递归法

    从大往小,一层一层缩小有:贪心法的活动安排问题。

    从小往大,一层一层利用之前的解有:动态规划法的锯钢条,

    动态规划有分但不是分治的分而是吧问题最小化,

    动态规划也有治,但是它的治也不是分治法的那种组合的治,而是动态的治,因为无法证明2个分可以治在一起。是一种备忘录式的向上递归法。

    还有常见的算法处理的一类排列组合的问题。

    还有一些必须穷举的,在穷举的基础上进行优化,就是回溯思路

    还有一写问题和规模无关,比如随机算法。

    还有一种我把它叫做创造力算法,比如等差级数之和,按照常规递归思路或缩小问题规模,那么就是一般的一个一个累加,但是如果有相应知识和创造力思维,能吧一个大规模问题,突然变成另外一个规模很小的问题,如加法变成乘法。

    那就牛了。想想高斯,一年级就会乘法了,他不但牛在创造,也在于自学厉害,1年级自学了乘法,并会灵活运行。放到现实生活中,如果你发明了一个没人知道的乘法,把它用在大家知道的加法上。你说牛不牛!!!!!!!!!牛到暴躁。

    树的最优二叉树即哈夫曼树(Huffman Tree)看起来很简单,但没想出来没关系,霍夫曼本人是博士,而且是经过了一个学期才完成,而且还看了Shannon-Fano,及次优Shannon-Fano的树

    算法总结:

    1.分治

    2.贪心

    3.动态规划

    4.排列组合

    5,深度优先和回溯

    数据结构:

    1.线性

    2.1对多

    3.多对多

    值得复习的:

    快排和归并排序(线性结构数组+分治+递归)

    二叉树,以及平衡二叉树(树结构+递归)

    最短距离(图+动态)

    切钢条(图+动态)

    值得复习,但复杂点的:

    kmp

    rbt

    堆排

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/lsfv/p/10198533.html
Copyright © 2011-2022 走看看