几个算法原理

回溯法:

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就返回,尝试新的路径。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的方法就是回溯法。回溯法通常用最简单的递归方法来实现。

适用范围:

1.问题的解用向量表示
2.需要搜索一个或一组解
3.满足约束条件的最优解等等

回溯法的三个基本概念:

1.约束函数
2.状态空间树
3.扩展节点、活结点、死结点

回溯法解题的一般步骤:

先读题完成以下三个步骤:

1.描述解的形式,定义一个解空间,它包含问题的所有解,这一步主要明确问题的解空间树
2.构造状态空间树
3.构造约束函数(用于杀死节点)

之后用DFS思想进行回溯:

1.设置初始化的方案
2.变换方式去试探,若全部试完,则已退到头结束或无解
3.判断此法是否成功(构造函数),不成功则转2
4.试探成功则前进一步再试探
5.正确方案还未找到则转2
6.已找到一种方案则记录并打印

哈希表:

哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方(就像用字典查找汉字一样)

哈希冲突:
就像字典中的一个拼音可能对应多个汉字,哈希表也是如此,并且这种冲突无可避免。

哈希函数的time33算法:

public long Hash(final String key)
{
	long hash = 0;
	for(int i = 0;i < key.length();i++)
	{
		hash = hash * 33 + key[i];
	}
}

哈希冲突解决办法:

1.开发定址法–找hash表剩下空余的空间,找到空余的空间然后插入
2.链地址法–在原地址新建一个空间,然后以链表结点的形式插入到该空间(多用)

链地址法的实现:

1. 首先定义链结点,以结构体Node展示,其中Node有三个属性,一个是key值,一个value值,还有一个是作为链表的指针。还有作为类的哈希表,以及哈希表的构造方法
2.定义哈希表的hash算法,例如time33算法
3.定义一个查找根据key查找结点的方法,首先是用Hash函数计算头地址,然后根据头地址向下一个个去查找结点,如果结点的key和查找的key值相同,则匹配成功
4.定义一个插入结点的方法,首先是查看该key值的结点是否存在,如果存在则更改value值就好,如果不存在,则插入新结点

哈希表高效的特性,查找或者插入的情况在大多数情况下可以达到O(1),时间主要花在计算hash上

点赞