【3.搜索算法】

百度上对于搜素算法的解释如下:

搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。现阶段一般有枚举算法深度优先搜索广度优先搜索A*算法回溯算法、蒙特卡洛树搜索、散列函数等算法。在大规模实验环境中,通常通过在搜索前,根据条件降低搜索规模;根据问题的约束条件进行剪枝;利用搜索过程中的中间解,避免重复计算这几种方法进行优化。

重点学习以下算法:

  1. 深度优先搜索
  2. 广度优先搜索
  3. 回溯算法
  4. 散列函数

3.1深度优先搜索

深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
作者:安然若知
链接:https://www.jianshu.com/p/bff70b786bb6

3.1.1算法步骤

一般地:

       1)构造一个顶点元素类型的栈,初始状态时其内的元素只有根节点;

       2)将栈中的栈顶元素与目标元素比较,如果是,停止寻找;否则,继续执行程序;

       3)移除栈顶元素,并将栈顶元素的后继节点依次加入栈中,;

       4)如果栈为空,查找失败;否则,转向第二步。

3.1.2代码样式

//层数固定的情况
void dfs(int k) {
    if(结束) {//打印、结束、比较
        做相应处理
    } else {
        for(...) {
            if() {满足条件
                设置条件    //存数组、设约束(已访问等)、加总量(求总和等)
                bfs(k+1)
                恢复条件设置
            }
        }
    }
}

二叉树: 

void dfs(TreeNode* t){
    stack1.pop();
    if(t != nullptr){
        cout << t->val << endl;
        if(t->right != nullptr)
            stack1.push(t->right);
        if(t->left != nullptr)
            stack1.push(t->left);
    }
    if(stack1.empty())
        return;
    else{
        dfs(stack1.top());
    }
}

3.2广度优先搜索

类似于树的按层次遍历的过程,一般用来求最短路径最小操作等等

3.2.1算法步骤

把根结点放到队列的末尾
每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素标记为它下一级元素的前驱
找到所要找的元素时结束程序
如果遍历整个树都还没有找到,则结束程序

3.2.2代码样式

void bfs(起始点) {
	将起始点放入队列中;
	标记起点访问;
	while(如果队列不为空){
		访问队列队首元素x;
		删除队首元素;
		if(出现最终状态) {
			做相应处理
		}
		for(遍历所有x相邻点){
			if(该点未被访问过且合法){
				将该点加入队列末尾;
				做相应操作:记录距离,更新前置结点等
			}
		}
	}
	队列为空,广搜结束;
}

二叉树:

void bfs(TreeNode *root){
    queue1.push(root);
    while(!queue1.empty()){
        TreeNode *t = queue1.front();
        queue1.pop();
        cout << t->val << endl;
        if(t->left != nullptr)
            queue1.push(t->left);
        if(t->right != nullptr)
            queue1.push(t->right);
    }
}

3.3回溯算法

回溯法(back tracking)(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。比较注明的有八皇后问题,全排列问题等。

更多:回溯算法讲解--适用于leetcode绝大多数回溯题目

void backtrack(int i,int n,other parameters)
{
  if( i == n)
{
 //get one answer
record answer;
return;
}
//下面的意思是求解空间第i个位置上的下一个解
for(next ans in position i of solution space)
{
  backtrack(i+1,n,other parameters);
}
}

4.散列函数(哈希)

散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。

hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数。输出字符串的长度称为hash函数的位数。

散列(Hashing)通过散列函数将要检索的项与索引(散列,散列值)关联起来,生成一种便于搜索的数据结构(散列表)。


更多:散列函数(哈希)

两个重要的知识点:

  1. 解决冲突的方法:开放定址法、拉链法
  2. 构造方法:直接定址法、除留余数法、平方取中法...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值