排序算法
十大排序算法
BFPRT 算法 ( TOP-K 问题 )
随机洗牌算法
Fisher-Yates Shuffle(费雪耶兹洗牌算法):
也称为 Knuth Shuffle。
基本思想是从原始数组中随机取一个之前没取过的数字到新的数组中,直到数字全部取完。
时间复杂度为 O(n),空间复杂度为 O(n)。
void FisherYatesShuffle(List<int> arr)
{
int n = arr.Count;
for (int i = n - 1; i > 0; i--)
{
int j = Random.Range(0, i + 1);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
图论
深度优先遍历(DFS)
广度优先遍历(BFS)
寻路算法
A*算法
Dijkstra(迪杰斯特拉)算法
RVO动态避障算法
动态规划(记忆化搜索、备忘录递归、剪枝)
动态规划(英语:Dynamic programming,简称DP)是一种在数学、计算机科学、经济学和生物信息学中使用的方法,通过把原问题分解为相对简单的子问题的方式求解复杂问题。它常常适用于具有重叠子问题和最优子结构性质的问题。
简单来说,动态规划就是将一个问题拆分成一系列子问题,直到子问题可以直接解决。然后,将子问题的答案保存起来,以减少重复计算。最后,根据子问题答案反推,得出原问题的解。动态规划的核心思想是拆分子问题、记住过往、减少重复计算。比如BFS中就是记忆化搜索记录下遍历过的节点减少计算量。
以下给出经典示例:
斐波那契数列:
斐波那契数列是一个数字序列,其中每个数字是前两个数字的总和,但前两个数字分别为0和1。这个数列从第3项开始,每一项都等于前两项之和。如1,1,2,3,5…
int Fibonacci(int n)
{
if (n <= 1)
return n;
else
{
int a = 0, b = 1;
for (int i = 2; i <= n; i++)
{
int temp = a + b;
a = b;
b = temp;
}
return b;
}
}
背包问题