常见算法汇总
Hash
开放地址法,也称再散列法。
当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
见链接: https://blog.csdn.net/xyzbaihaiping/article/details/51607770
递归
所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
比如:阶乘的实现
- 自己调用自己
- 递归通常
不在意具体操作
,只关心初始条件
和上下层的变化关系
。 - 递归函数
需要有临界停止点
,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。 - 递归通常能被其他方案替代(栈、数组正向求)。
catalan数
catalan数卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。卡塔兰数的一般公式为 C(2n,n)/(n+1)。
https://www.cnblogs.com/Morning-Glory/p/11747744.html
Dijkstra最短路径
戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。Dijkstra 算法原始版本仅适用于找到两个顶点之间的最短路径,后来更常见的变体固定了一个顶点作为源结点然后找到该顶点到图中所有其它结点的最短路径,产生一个最短路径树。
设一个赋权有向图 。其中的每条边
的权值为一个非负的实数
,该权值表示从顶点
到顶点
的距离。并设一单源点
。现在我们的任务是:找出从源点
出发,到
中所有的节点的最短路径。
Dijkstra 算法的时间复杂度是 。其中:
分别为赋权有向图中的顶点个数和边的个数。
Breaking ties(路径搜索方法):
https://zhuanlan.zhihu.com/p/129373740
常见排序算法
1.冒泡算法
思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
......
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
时间复杂度O(n2);
2.桶排序
分而治之
每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。
如下图所示:
https://blog.csdn.net/qq_27124771/article/details/87651495
3.基数排序
也利用到了桶的概念。
个位数排序-》十位数排序-》百位数排序-》...
贪心算法
自顶向下的设计
该算法在对问题求解时,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解,即总是做出在当前看来是最好的选择。
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
https://zhuanlan.zhihu.com/p/57217890