算法思想总结

1、递归与分治思想

定义

在高级语言中,函数调用自己和调用其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句简洁的调用自己的函数,成为递归函数。
不过,写递归程序最怕的就是陷入永不结束的无穷递归中。切记,每个递归定义必须至少有一个条件,当满足这个条件是递归不在进行,即函数不再调用自身而是返回。
使用递归能是程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但大量递归调用会建立函数的副本,会消耗大量的时间和内存,而迭代不需要此种付出。
“普通人都用迭代,只有天才采用递归”------ 还没真正学会递归

//对输入的任意字符 反向输出
//递归需要一个结束条件 那么可以将'#'作为一个输入结束的条件
void print()
{
	char a;
	cin >> a;
	if(a != '#') print();
	if(a != '#') cout<<a;
}

分治思想在算法设计中也非常常见,当一个问题规模较大且不易求解的时候,就可以考虑将问题分成几个小的模块,逐一解决。

折半查找算法的递归实现

基本思想:减小查找序列的长度,分而治之的进行关键字的查找。
实现过程:先确定待查找记录的所在范围,然后逐渐减小这个范围,直到找到该记录或查找失败为止。

汉诺塔

在世界中心贝纳勒斯圣庙里,一块黄铜板上插着三根宝石针。一根针从下到上传好了由大到小的64片金片,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片 不管在哪根针上,小片必须在大片的上面。

2、Brute Force(暴力破解)算法

两个字符串S、Y,长度为M、N。首先S[1]和T[1]比较,若相等,再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不相等,则T向右移动一个字符的位置,再进行比较。
效率低下

3、KMP算法

kmp算法核心就是避免不必要的回溯。问题由模式串决定,不是由目标决定!

4、深度优先搜索(DFS)

具体思想类似于房间里找钥匙,无论从哪间房子开始,将床头柜、床上、床下、衣柜等挨个寻找,做到不放过任何一个死角,当所有抽屉等全部找遍,再寻找下一个房间。
相当于树的前序遍历。

5、广度优先搜索(BFS)

钥匙放在沙发底上等犄角旮旯地方可能性极小,因此我们运用新的方案:先看看钥匙是否放在各个房间显眼位置,如果没有, 再看看各个房间的抽屉。这样逐步扩大查找的范围的方式我们成为广度优先遍历。
类似树的层序遍历

6、拓扑排序

一个无环的有向图成为无环图,简称DAG图。
在一个表示工程的有向图中,用定点表示活动,用弧表示活动之间的优先关系,这样的有向图为定点表示活动的网,我们称为AOV网。
拓扑序列:设G=(V,E)是一个具有n个定点的有向图,V中定点序列V1,V2…Vn满足从定点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前。则我们称这样的顶点序列为一个拓扑序列。
拓扑排序:对一个有向图构造拓扑序列的过程。

7、哈希表查找

散列表(哈希表)查找
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。我们把这种对应关系f称为散列函数,又称哈希(hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表(哈希表)。

8、冒泡排序

基本思想:两两相邻记录的关键字,如果反序则交换,知道没有反序的记录为止。

9、快速排序

找一个基准点值,小于它的放在左边,大于它的放在右边。与冒泡排序都属于交换排序类。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值