为定义搜索范围,应明确以下几个方面:
1. 问题解的形式:表示成一个n元组的形式`(x[0],x[1],...,x[n-1])`
2. 显约束:对分量`x[i]`的取值范围限定。
3. 隐约束:为满足问题的解而对不同分量之间施加的约束。
4. 解空间:对于问题的一个实例,解向量满足显约束的所有n元组构成了该实例的一个解空间。
----
在搜索的过程中,应了解几个名词:
1. 扩展结点:一个正在生成孩子的结点。
2. 活结点:一个自身已生成但其孩子还没有全部生成的结点。
3. 死结点:一个所有孩子已生成的结点。
----
求解过程:
1. 定义问题的解空间。
2. 确定空间的组织结构。
3. 搜索解空间:
- 确定约束条件
- 确定限界条件
- 搜索过程
----
算法描述:
> (1)递归形式
```c++
// t为扩展节点在树中所处的层次
void Backtrack(int t){
if(t > n){
//搜索层次大于解空间的树的深度,说明找到了叶子结点,即找到了问题的一个解
output(x);
} else {
for (int i = s(n, t); i <= e(n, t); i++){
x[t] = d(i);
if(constraint(t) && bound(t)){
Backtrack(t + 1);
}
}
}
}
```
> (2)非递归形式
```c++
void NBacktrack(){
int t = 1;
while(t > 0){
if(s(n,t) <= e(n, t)){
for(int i = s(n, t); i <= e(n,t); i++){
x[t] = d(i);
if(constraint(t) && bound(t)){
if(t > n){
output(x);
} else {
t++;
}
}
}
} else {
t--;
}
}
}
```
- 1 设计接口
- 1.1 容器接口Container
- 1.2 背包接口Bag
- 1.3 栈接口Stack
- 1.4 队列接口Queue
- 1.5 Union-Find算法接口UF
- 2 实现接口
- 2.1 结点类Node
- 2.2 数组迭代器ArrayIterator
- 2.3 链表迭代器ListIterator
- 2.4 背包(Bag)的实现
- 2.4.1 能动态调整数组大小的Bag
- 2.4.2 链式Bag的实现
- 2.5 栈(Stack)的实现
- 2.5.1 能动态调整数组大小的Stack
- 2.5.2 链式Stack的实现
- 2.6 队列(Queue)的实现
- 2.6.1 能动态调整数组大小的Queue
- 2.6.2 链式Queue的实现
- 2.7 Union-Find算法的实现
- 2.7.1 DefaultUF
- 2.7.2 QuickFindUF
- 2.7.3 QuickUnionUF
- 2.7.4 WeightedQuickUnionUF
- 2.8 测试
- 2.8.1 测试Stack
- 2.8.2 测试Union-Find
- 3 排序算法
- 3.1 定义排序工具的类结构
- 3.2 选择排序
- 3.3 插入排序
- 3.4 希尔排序
- 3.5 归并排序
- 3.5.1 归并排序的合并方法
- 3.5.2 自顶向下的归并排序
- 3.5.3 自底向上的归并排序
- 3.6 快速排序
- 3.6.1 常规快速排序
- 3.6.2 排序前先洗牌
- 3.6.3 快速排序的改进方法-小数据量转成插入排序
- 3.6.4 快速排序的改进方法-三向切分
- 3.7 堆排序
- 3.8 最终的排序工具
- 4 搜索
- 4.1 二分搜索(binarySearch)
- 4.2 优先队列(MaxPriorityQueue)
- 4.3 二叉查找树(BST)
- 4.4 红黑二叉查找树(RedBlackBST)
- 4.5 B-树(BTree)
- 5 图
- 5.1 无向图(Graph)
- 5.2 有向图(Digraph)
- 6 贪心
- Dijkstra算法-单元最短路径
- 7 动态规划
- 7.1 最长公共子序列问题
- 7.2 0-1背包问题
- 7.3 加工顺序问题
- 8 搜索法
- 8.1 图的着色问题
- 8.2 深度优先搜索
- 8.3 回溯法
- 8.3.1 回溯法的算法框架
- 8.3.2 子集树
- 8.3.3 排列树
- 8.3.4 满m叉树(组合树)
- 8.4 广度优先搜索
- 8.5 分支限界法
- 9 随机化算法
- 9.1 数值随机化算法
- 9.2 蒙特卡罗算法
- 9.3 拉斯维加斯算法
- 9.4 舍伍德算法
- 10 数论算法
- 10.1 Stein求最大公约数
- 10.2 矩阵求斐波那切数列
- LeetCode刷题笔记