当前位置: 首页 > article >正文

java-搜索算法

搜索算法:

线性搜索(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开始遍历
    }
}

这些案例展示了不同搜索算法的基本实现和应用场景。线性搜索和二分搜索主要用于数组的搜索,而深度优先搜索和广度优先搜索则用于图或树的遍历。每种算法都有其特定的应用场景和优势。


http://www.kler.cn/a/403428.html

相关文章:

  • 算法日记 32 day 动态规划(完全背包)
  • 使用 Maven 构建一个简单的 Java 项目
  • 要素市场与收入分配
  • Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
  • 卷积神经网络各层介绍
  • Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题
  • java ssm 新青年在线学习网 学习网站 学习系统 学习平台 源码jsp
  • VMware Workstation 17.6.1
  • 开发者视角下的鸿蒙
  • 沸蛇鼠标,多功能智慧AI,重新定义生产力
  • 华为云鸿蒙应用入门级开发者认证考试题库(理论题和实验题)
  • Android12 Wifi的连接过程梳理
  • LeetCode 209 长度最小的子数组(滑动窗口)
  • 前端学习八股资料CSS(五)
  • nodejs21: 快速构建自定义设计样式Tailwind CSS
  • [SpB]如何开始使用 Spring Boot?
  • 7-简单巡检
  • 23.<Spring图书管理系统(强制登录版本)>
  • ADB->ADB宏控开关控制
  • django基于django的民族服饰数据分析系统的设计与实现
  • 接口性能优化的技巧
  • Spring学习笔记_42——@CookieValue
  • Android CTA配置和3C认证、SRRC认证
  • IT资产管理工具-NetBox
  • Python爬虫 | Scrapy 爬虫框架学习
  • CAAS 和 IAAS