搜索算法:
线性搜索(Linear Search)
二分搜索(Binary Search)
深度优先搜索(Depth-First Search, DFS)
广度优先搜索(Breadth-First Search, BFS)
1. 线性搜索(Linear Search)
意义:
线性搜索是一种简单的搜索算法,它从头到尾遍历数组,检查每个元素是否为目标值。如果找到目标值,则返回其索引;如果遍历完整个数组都没有找到,则返回一个表示未找到的值(通常是-1)。
Java案例:
public class LinearSearch {public static int linearSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return i; // 找到目标,返回索引}}return -1; // 未找到目标,返回-1}public static void main(String[] args) {int[] arr = {3, 5, 2, 4, 9};int target = 4;int index = linearSearch(arr, target);if (index != -1) {System.out.println("Element found at index: " + index);} else {System.out.println("Element not found.");}}
}
2. 二分搜索(Binary Search)
意义:
二分搜索是一种在已排序数组中查找特定元素的搜索算法。它通过比较数组中间的元素与目标值来工作,如果中间元素与目标值相等,则搜索成功;如果目标值小于中间元素,则在数组的左半部分继续搜索;如果目标值大于中间元素,则在数组的右半部分继续搜索。这个过程重复进行,直到找到目标值或搜索范围为空。
Java案例:
public class BinarySearch {public static int binarySearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 找到目标,返回索引} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1; // 未找到目标,返回-1}public static void main(String[] args) {int[] arr = {2, 3, 4, 10, 40};int target = 10;int index = binarySearch(arr, target);if (index != -1) {System.out.println("Element found at index: " + index);} else {System.out.println("Element not found.");}}
}
3. 深度优先搜索(Depth-First Search, DFS)
意义:
深度优先搜索是一种用于遍历或搜索树或图的算法。它从一个节点开始,尽可能深地搜索树的分支。在图的遍历中,DFS会访问一个节点,然后沿着一条边走到下一个节点,然后继续深入,直到到达没有未访问邻居的节点,然后回溯。
Java案例(使用递归实现图的DFS遍历):
public class DFS {private boolean[] visited;private int[] graph;public DFS(int[][] graph) {this.graph = new int[graph.length];for (int[] row : graph) {for (int item : row) {this.graph[item] = item;}}visited = new boolean[graph.length];}public void dfs(int vertex) {visited[vertex] = true;System.out.print(vertex + " ");for (int i = 0; i < graph.length; i++) {if (graph[vertex] == i && !visited[i]) {dfs(i);}}}public static void main(String[] args) {int[][] graph = {{1, 2}, {0, 3}, {0, 4}, {1, 5}, {1, 2}};DFS dfs = new DFS(graph);dfs.dfs(0); // 从节点0开始遍历}
}
4. 广度优先搜索(Breadth-First Search, BFS)
意义:
广度优先搜索也是一种用于遍历或搜索树或图的算法。与DFS不同,BFS从一个节点开始,首先访问所有相邻的节点,然后再逐层向外扩展。
Java案例(使用队列实现图的BFS遍历):
import java.util.LinkedList;
import java.util.Queue;public class BFS {private boolean[] visited;private int[][] graph;public BFS(int[][] graph) {this.graph = graph;visited = new boolean[graph.length];}public void bfs(int startNode) {Queue<Integer> queue = new LinkedList<>();visited[startNode] = true;queue.add(startNode);while (!queue.isEmpty()) {int currentNode = queue.poll();System.out.print(currentNode + " ");for (int neighbor : graph[currentNode]) {if (!visited[neighbor]) {visited[neighbor] = true;queue.add(neighbor);}}}}public static void main(String[] args) {int[][] graph = {{1, 2}, {0, 3}, {0, 4}, {1, 5}, {1, 2}};BFS bfs = new BFS(graph);bfs.bfs(0); // 从节点0开始遍历}
}
这些案例展示了不同搜索算法的基本实现和应用场景。线性搜索和二分搜索主要用于数组的搜索,而深度优先搜索和广度优先搜索则用于图或树的遍历。每种算法都有其特定的应用场景和优势。