搜索
DFS
最常用的搜索算法,一般用递归实现。
BFS
状态空间中的BFS搜索,和图上的BFS很类似,都可以用队列来实现。
伪代码:
bfs(s) {
q = new queue()
q.push(s), visited[s] = true
while (!q.empty()) {
u = q.pop()
for each edge(u, v) {
if (!visited[v]) {
q.push(v)
visited[v] = true
}
}
}
}
二分搜索
这个也简单,非常常用。
int binary_search(int start, int end, int key) {
int ret = -1; // 未搜索到数据返回-1下标
int mid;
while (start <= end) {
mid = start + ((end - start) >> 1); // 直接平均可能会溢出,所以用这个算法
if (arr[mid] < key)
start = mid + 1;
else if (arr[mid] > key)
end = mid - 1;
else { // 最后检测相等是因为多数搜索情况不是大于就是小于
ret = mid;
break;
}
}
return ret; // 单一出口
}
搜索与模拟习题
习题 | ||||||
---|---|---|---|---|---|---|
T191062 | 深基15.例2 | 寄包柜 | 普及- | |||
T190986 | NOIP-J | 火星人 | 2004 | 普及/提高- | ||
T191059 | 深基9.例4 | 求第k小的数 | 普及/提高- | |||
T191596 | NOIP-J | 立体图 | 2008 | 普及/提高- | ||
T191601 | USACO Silver | Meteor Shower | 2008 | 普及/提高- | ||
T191602 | 数独 | 普及/提高- | ||||
T191061 | JLOI | 不重复数字 | 2011 | 普及+/提高 | ||
T191599 | 绘制二叉树 | 普及+/提高 | ||||
T191598 | NOIP-S | 时间复杂度 | 2017 | 普及+/提高 | ||
T191600 | NOIP-S | 字串变换 | 2002 | 普及+/提高 | ||
T191603 | NOIP-S | Mayan游戏 | 2011 | 提高+/省选- | ||
T191605 | NOIP-S | 旅行 | 2018 | 提高+/省选- | ||
T191606 | BalticOI | Switch the Lamp On | 2011 | 提高+/省选- | ||
T198834 | 魔板 | 提高+/省选- |