算法

常用排序算法总结:

image.png

参考:排序算法时间复杂度、空间复杂度、稳定性比较

快速排序优化:快排的思路是每次都确定一个数据的位置,基于分治的思想,所以可以使用三路快排的思路进行优化。将数据分为大于、小于、和等于三个部分
快速排序 详解(快速排序 双路快排 三路快排)

遗传算法小记

遗传算法一般用来解决最优化问题,模拟生物进化的过程,优胜略汰,具有一定的意义吧。

最简单的一般流程:

编码初始化种群
计算个体适应度
选择父代
这里呢,有一点讲究,一般就是轮盘赌选择,某个个体可以多次出现,某些个体可能就灭绝了,要的就是随机性,没有选择到的个体就被淘汰了,不可能出现在下一代种群中了。
交叉、变异
选择子代
这里讲究比较多,父代交叉变异后分别产生一些新的个体,在这些个体中选择计算适应度,选择两个(一般是2个)精英保留直接成为下一代种群中的一分子,然后剩余的名额在这些个体连同父代形成新的集合中使用选择算子选择(简单如轮盘赌选择),形成新的种群。

如何停止呢,一种是按照迭代的次数,另一种就是在某一代种群中出现了你想要的值就可以了。

回溯法

1、概念
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
2、基本思想
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。
若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。
而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
3、用回溯法解题的一般步骤:
(1)针对所给问题,确定问题的解空间:
首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解。
(2)确定结点的扩展搜索规则
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
回溯法模板

void run(当前状态)
{
  if(当前状态的边界)
  {
      if(当前状态为最佳的目标形态)
          记下最优结果;
          return;
  }
  for(int i = 算符最小值; i <= 算符最大值 ; ++i)
  {
      算符i作用于当前状态,扩展出一个子状态;
      if(子状态满足约束条件)&&(子状态满足最优性要求)
          run(子状态);
  }
}

递归理解

递归三个要素:递 + 结束条件 + 归。
其实递归可以是“有去有回”,也可以是“有去无回”。但其根本是“由大往小地去,由近及远地去”。“递”是必需,“归”并非必需,依赖于要解决的问题,有的需要去的路上解决,有的需要回来的路上解决。有递无归的递归其实就是我们很容易理解的一种分治思想。
这个理解很不错,参考如下:
递归的理解

你可能感兴趣的:(算法)