非启发式算法——二分、三分搜索算法

简介: 非启发式算法——二分、三分搜索算法

非启发式算法第一练——二分、三分搜索算法

非启发式算法是一类不依赖于启发式信息或领域知识的问题解决方法。其中,二分搜索和三分搜索算法是两个经典且广泛应用的技术。在本篇博客中,我们将深入了解这两种搜索算法的原理、应用场景以及如何在实际问题中使用它们。

二分搜索算法

原理

二分搜索算法,又称为二分查找,是一种高效的搜索方法。它基于分治思想,适用于已排序的数组或列表。其核心思想是在每一步中将搜索区间缩小一半,直到找到目标或区间为空。

步骤

  1. 确定搜索区间的左右边界。
  2. 计算中间位置的索引。
  3. 检查中间元素是否是目标。
  4. 如果中间元素等于目标,搜索完成。
  5. 如果中间元素大于目标,将搜索区间缩小为左半部分。
  6. 如果中间元素小于目标,将搜索区间缩小为右半部分。
  7. 重复步骤2-6,直到找到目标或区间为空。

应用场景

二分搜索广泛应用于需要在有序数据集中查找元素的场景,例如查找特定值、判定某个条件是否满足等。

示例代码

python

def binary_search(arr, target):
    left, right = 0, len(arr) - 1

    while left <= right:
        mid = (left + right) // 2

        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1

    return -1  # Target not found

Java 实现

public class BinarySearch {

    // 二分搜索算法
    static int binarySearch(int[] arr, int target) {
        int left = 0, 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; // 目标不在数组中
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int target = 5;

        int result = binarySearch(arr, target);

        if (result != -1) {
            System.out.println("Target found at index: " + result);
        } else {
            System.out.println("Target not found in the array.");
        }
    }
}

C++ 实现

#include <iostream>
#include <vector>

using namespace std;

// 二分搜索算法
int binarySearch(vector<int>& arr, int target) {
    int left = 0, right = arr.size() - 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; // 目标不在数组中
}

int main() {
    vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int target = 5;

    int result = binarySearch(arr, target);

    if (result != -1) {
        cout << "Target found at index: " << result << endl;
    } else {
        cout << "Target not found in the array." << endl;
    }

    return 0;
}

三分搜索算法

原理

三分搜索算法是二分搜索的扩展,用于在凸函数上寻找极值。与二分搜索不同,三分搜索每次将搜索区间分为三个部分,并根据目标函数值的情况确定下一步搜索的方向。

步骤

  1. 确定搜索区间的左右边界。
  2. 计算两个中间点,将搜索区间分为三部分。
  3. 比较两个中间点的函数值。
  4. 根据函数值的情况,确定搜索区间缩小的方向。
  5. 重复步骤2-4,直到满足停止条件。

应用场景

三分搜索主要用于寻找单峰函数的极值点,例如求解凸函数的最小值或最大值。

示例代码

python

def ternary_search(func, left, right, epsilon=1e-9):
    while right - left > epsilon:
        mid1 = left + (right - left) / 3
        mid2 = right - (right - left) / 3

        if func(mid1) < func(mid2):
            right = mid2
        else:
            left = mid1

    return (left + right) / 2

Java 实现

public class TernarySearch {

    // 三分搜索算法
    static double ternarySearch(double left, double right, double epsilon) {
        while (right - left > epsilon) {
            double mid1 = left + (right - left) / 3;
            double mid2 = right - (right - left) / 3;

            double f1 = function(mid1);
            double f2 = function(mid2);

            if (f1 < f2) {
                right = mid2;
            } else {
                left = mid1;
            }
        }

        return (left + right) / 2;
    }

    // 示例函数(替换成需要寻找极值的函数)
    static double function(double x) {
        // 这里替换成实际的函数表达式
        return x * x;
    }

    public static void main(String[] args) {
        double result = ternarySearch(-10, 10, 1e-9);

        System.out.println("The minimum/maximum value is: " + result);
    }
}

C++ 实现

#include <iostream>

using namespace std;

// 三分搜索算法
double ternarySearch(double left, double right, double epsilon) {
    while (right - left > epsilon) {
        double mid1 = left + (right - left) / 3;
        double mid2 = right - (right - left) / 3;

        double f1 = function(mid1);
        double f2 = function(mid2);

        if (f1 < f2) {
            right = mid2;
        } else {
            left = mid1;
        }
    }

    return (left + right) / 2;
}

// 示例函数(替换成需要寻找极值的函数)
double function(double x) {
    // 这里替换成实际的函数表达式
    return x * x;
}

int main() {
    double result = ternarySearch(-10, 10, 1e-9);

    cout << "The minimum/maximum value is: " << result << endl;

    return 0;
}

结语

二分搜索和三分搜索算法是解决一些特定问题的有力工具。它们的高效性和简单性使它们在算法和编程中得到了广泛的应用。通过深入理解这两种搜索算法的原理和应用场景,我们可以更好地运用它们来解决实际问题。在编写代码时,要根据具体问题选择合适的搜索算法,以提高算法效率。

目录
相关文章
|
10月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
424 5
|
10月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
338 0
|
算法 机器人 Python
【启发式算法】RRT*算法详细介绍(Python)
RRT(Rapidly-exploring Random Tree Star)* 是一种用于机器人路径规划的启发式算法,它是在经典的 RRT(Rapidly-exploring Random Tree)算法的基础上进行改进的。RRT* 通过优化路径质量,能够找到最短的路径,适用于高维空间中的路径规划问题。
1675 2
|
9月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
773 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
1473 3
|
9月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
421 0
|
10月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
11月前
|
机器学习/深度学习 并行计算 算法
MATLAB实现利用禁忌搜索算法解决基站选址问题
MATLAB实现利用禁忌搜索算法解决基站选址问题
352 0
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
340 0

热门文章

最新文章