数据结构和算法总览

数据结构和算法总览html

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

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

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

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

3.图关系(表示多对多关系,自然存在于相对独立,分散的关系,如学生们之间的关系,城市间关系,)
数据结构和算法

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

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

 

二。大部分问题概括其解决思路,大体分为分治,贪心,动态,回溯等思路,即算法。spa

解决问题,也就是算法实现的过程,须要数据结构来实现。两者是一块儿产生的。htm

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

整体思路,先把问题极简化,再慢慢扩大规模,试图发现规律。大概知道规律后,先尝试分治法,由于分治有递归好基友帮忙,好实现,又好理解。

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

 

若是一个问题很小,很简单,那么通常解决操做也会很简单。也就没有研究的价值,因此通常须要研究的是问题规模比较大,因此才须要研究。

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

分治含有2个注意点:

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

2.  comquer 解决  Xn=b+c   ,    最后问题减小规模到某个阀值,能够表示为某些具体操做。

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

 

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

贪心有2种具体的操做

1.作完当前操做,删除一个元素,并更新删除这个元素所带来的条件变化来减小规模,  如插入排序

2.作完当前操做,合并某些元素,并更新合并这个元素所带来的条件变化来减小规模,  如和夫曼树。

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

 

动态:在这2个大思路下,针对某些特殊问题,如图的最短路径问题,须要考虑全部解,才能知道最优,可是每步都会从新计算,因此额外保存一些数据,避免重复计算。叫动态。很显然,动态就是包含分治和贪心啊。

 

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

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

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

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

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

 

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

 

算法总结:

1.分治

2.贪心

3.动态规划

4.排列组合

5,深度优先和回溯

数据结构:

1.线性

2.1对多

3.多对多

 

 

值得复习的:

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

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

最短距离(图+动态)

切钢条(图+动态)

值得复习,但复杂点的:

kmp

rbt

堆排

相关文章
相关标签/搜索