算法:二分搜索

最优化学习笔记(二)——二分法 二分法是一种一维搜索方法。它讨论的是求解一元单值函数f:R→R在区间[a0,b0]f: \mathbb{R} \to \mathbb{R} 在区间[a_0, b_0]的极小点问题。同时要求函数ff在区间[a0,b0][a_0, b_0]上为单调函数,并且是连续可微的,这里将使用ff的一阶导数f′f'。       二分法的计算过程比较简单,它主要是利用一阶导数来连续压缩区间的方法。 1.确定初 阅读详情

LeetCode题目

力扣难度
1011. 在 D 天内送达包裹的能力🟠
410. 分割数组的最大值🔴
875. 爱吃香蕉的珂珂🟠
剑指 Offer II 073. 狒狒吃香蕉🟠

解题分析

这类题目可能的解空间在一个范围内,不停二分遍历可能解。找到一个可行解后还要继续找,直到“最小值”的可行解。类比到二分搜索算法中就是满足条件的最左值。

以”410. 分割数组的最大值“问题为例,可能解空间在“最大的单个元素”和“所有元素和”之间。然后二分查找可行解空间,一个可行解是分组数等于或者小于目标组数。“小于目标组数”成立的原因是可以继续拆分,拆分后子数组元素和一定满足条件,显然这不一定是最优解。找到可行解后如果继续优化条件不成立,那么上一次的可行解就是最优解。

从可行解中找最左值“二分搜索”中边界条件很容易出错。比如下面找最左值的方式:

        while (left < right) {
            int mid = left + (right - left) / 2;

            int splits = split(nums, mid);
            if (splits > m) {
                // 如果分割数太多,说明「子数组各自的和的最大值」太小,此时需要将「子数组各自的和的最大值」调大
                // 下一轮搜索的区间是 [mid + 1, right]
                left = mid + 1;
            } else {
                // 下一轮搜索的区间是上一轮的反面区间 [left, mid]
                right = mid;
            }
        }

个人更喜欢下面的方式,容易理解,不易出错,缺点是代码有点冗余。

while(left <= right) {
	int mid = left + (right - left) / 2;
	int groups = split(nums, mid);

	if(groups > k) { // 分组和太小,分组数大于预定值
		left = mid + 1;
	} else if(groups < k) { // 分组和太大,分组数小于预定值
		right = mid - 1;
	} else { // 可能分组数 < k 走不到这里,因为 split 是贪心算法。但实际上可以从 < k 拆分到 k 组
		if(mid == max || split(nums, mid -1) > k) {
			return mid;
		} else {
			right = mid - 1;
		}
	}
}
package org.stone.study.algo.ex202403;  
  
/**  
 * [410. 分割数组的最大值](https://leetcode.cn/problems/split-array-largest-sum/)
 * * 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。  
 * 设计一个算法使得这 k 个子数组各自和的最大值最小。  
 */  
public class SplitArrayWithMinSum {  
  
    public static void main(String[] args) {  
        int[] nums = new int[] {7,2,5,10,8};  
        int k = 2;  
        // ans: 18  
        System.out.println("ans:" + new SplitArrayWithMinSum().splitArray(nums, k));  
    }  
  
    /**  
     * 给定一个非负整数数组 nums 和一个整数 k ,把这个数组分成 k 个非空的连续子数组。  
     * 找到一种分组方式,使得返回k 个子数组各自和的最大值最小  
     * @param nums  
     * @param k  
     * @return  
     */  
    public int splitArray(int[] nums, int k) {  
        int max = 0, sum = 0;  
        for(int num : nums) {  
            max = Math.max(max, num);  
            sum += num;  
        }  
  
        int left = max, right = sum;  
        while(left <= right) {  
            int mid = left + (right - left) / 2;  
  
            int groups = split(nums, mid);  
            //System.out.println("left:" + left + ", right:" + right + ", mid:" + mid + ", groups:" + groups);  
            if(groups > k) { // 分组和太小,分组数大于预定值  
                left = mid + 1;  
            } else if(groups < k) { // 分组和太大,分组数小于预定值  
                right = mid - 1;  
            } else { // 可能分组数 < k 走不到这里,因为 split 是贪心算法。但实际上可以从 < k 拆分到 k 组  
                if(mid == max || split(nums, mid -1) != k) {  
                    return mid;  
                } else {  
                    right = mid - 1;  
                }  
            }  
        }  
  
        return left;  
    }  
  
    /**  
     * 拆分数组,每组和最大为maxSum。返回可以拆分的组数  
     * 直接贪心算法实现  
     */  
    private int split(int[] nums, int maxSum) {  
        int curSum = 0;  
        int splitNum = 1;  
  
        for(int num : nums) {  
            if(curSum + num > maxSum) {  
                ++splitNum;  
                curSum = 0;  
            }  
  
            curSum += num;  
        }  
  
        return splitNum;  
    }  
}
package org.stone.study.algo.ex202403;  
  
import java.util.Arrays;  
  
/**  
 * [875. 爱吃香蕉的珂珂](https://leetcode.cn/problems/koko-eating-bananas/)
 * 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。  
 * 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。  
 * 珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。  
 * 返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。  
 */  
public class MinEatingSpeed {  
    /**  
     * 解法 1:二分查找最左值边界处理好理解一点。  
     * @param piles  
     * @param h  
     * @return  
     */  
    public int minEatingSpeed(int[] piles, int h) {  
        int max = Arrays.stream(piles).max().getAsInt();  
  
        int left = 1, right = max;  
        while(left <= right) {  
            int mid = left + (right - left) / 2;  
  
            long spent = spentHours(piles, mid);  
  
            if(spent > h) {  
                left = mid + 1;  
            } else if(spent < h){  
                right = mid - 1;  
            } else {  
                //System.out.println("spent:" + spent + ", left:" + left + ", right:" + right);  
                if(mid == 1 || spentHours(piles, mid - 1) > h) {  
                    return mid;  
                } else {  
                    right = mid - 1;  
                }  
            }  
        }  
        //System.out.println("left:" + left + ", right:" + right);  
        return left;  
    }  
  
    /**  
     * 以速度 speed 依次消耗 piles 数组。不足去整(往大的取)  
     */  
    private long spentHours(int[] piles, int speed) {  
        long spent = 0;  
        for(int pile : piles) {  
            spent += (pile + speed - 1) / speed;  
        }  
  
        return spent;  
    }  
  
  
    /**  
     * 解法 2,更简洁,但是二分查找最左值边界理解上有点困难  
     * @param piles  
     * @param h  
     * @return  
     */  
    public int minEatingSpeed2(int[] piles, int h) {  
        int max = 0;  
        for(int p : piles) {  
            max = Math.max(max, p);  
        }  
  
        int l = 1, r = max, ans = max;  
        while(l <= r) {  
            int total = 0;  
            int m = l + (r -l) / 2;  
            for(int p : piles) {  
                total += (p-1)/m + 1; //向上取整  
            }  
  
            if(total > h) {  
                l = m + 1;  
            } else {  
                ans = m;  
                r = m - 1;  
            }  
        }  
  
        return ans;  
    }  
}

通用的二分查找值,最左值,最右值方法请参考1


package org.stone.study.algo.search;  
  
/**  
 * @Author: shidonghua  
 * @Description:  
 * @Date: 3/8/21 09:07  
 * @Version: 1.0  
 */public class BinarySearch {  
  
    /**  
     * 二分搜索,并找最左边的元素  
     *  
     * @param a  
     * @param n  
     * @param value  
     * @return  
     */  
    public int bsearch_LeftMost(int[] a, int n, int value) {  
        int low = 0;  
        int high = n - 1;  
        while (low <= high) {  
            int mid = low + ((high - low) >> 1);  
            if (a[mid] > value) {  
                high = mid - 1;  
            } else if (a[mid] < value) {  
                low = mid + 1;  
            } else {  
                if ((mid == 0) || (a[mid - 1] != value)) return mid; // 最左逼近  
                else high = mid - 1;  
            }  
        }  
        return -1;  
    }  
  
    /**  
     * 二分搜索最右边的元素  
     *  
     * @param a  
     * @param n  
     * @param value  
     * @return  
     */  
    public int bsearch_RightMost(int[] a, int n, int value) {  
        int low = 0;  
        int high = n - 1;  
        while (low <= high) {  
            int mid = low + ((high - low) >> 1);  
            if (a[mid] > value) {  
                high = mid - 1;  
            } else if (a[mid] < value) {  
                low = mid + 1;  
            } else {  
                if ((mid == n - 1) || (a[mid + 1] != value)) return mid; // 往右边逼近  
                else low = mid + 1;  
            }  
        }  
        return -1;  
    }  
  
    /**  
     * 第一个大于等于元素  
     *  
     * @param a  
     * @param n  
     * @param value  
     * @return  
     */  
    public int bsearch_GE(int[] a, int n, int value) {  
        int low = 0;  
        int high = n - 1;  
        while (low <= high) {  
            int mid = low + ((high - low) >> 1);  
            if (a[mid] >= value) {  
                if ((mid == 0) || (a[mid - 1] < value)) return mid;  
                else high = mid - 1;  
            } else {  
                low = mid + 1;  
            }  
        }  
        return -1;  
    }  
  
    /**  
     * 最后一个小于等于  
     *  
     * @param a  
     * @param n  
     * @param value  
     * @return  
     */  
    public int bsearch_LE(int[] a, int n, int value) {  
        int low = 0;  
        int high = n - 1;  
        while (low <= high) {  
            int mid = low + ((high - low) >> 1);  
            if (a[mid] > value) {  
                high = mid - 1;  
            } else {  
                if ((mid == n - 1) || (a[mid + 1] > value)) return mid;  
                else low = mid + 1;  
            }  
        }  
        return -1;  
    }  
}

总结

二分搜索需要数组满足单调性,简单等值搜索的场景比较少,实际场景更多是最值搜索,映射到算法中就是满足条件的最左或者最右值。这时处理算法的边界条件很重要,也是最容易出错的地方。

算法题一般不会直接让写二分搜索,需要把具体问题映射到“二分搜索”的解题思路上。比如解空间在一个单调整数数组上,找最小解等。


  1. github ↩︎

Python 算法基础篇之线性搜索算法:顺序搜索、二分搜索 在算法和数据结构中,搜索是一种常见的操作,用于查找特定元素在数据集合中的位置。线性搜索算法是最简单的搜索算法之一,在一组数据中逐一比较查找目标元素。本篇博客将介绍线性搜索算法的两种实现方式:顺序搜索和二分搜索,并通过实例代码演示它们的应用。 阅读详情

相关推荐

二分搜索算法:效率与原理

本章深入探讨了二分搜索算法,对比了顺序搜索等其他搜索方法,分析了其时间复杂度,并展示了如何创建和使用字符串数组。通过电话簿类比,解释了二分搜索的工作原理,展示了其快速查找有序数组中元素的能力。

weixin_36369848的博客 391

二分法求最优值

题目链接:https://cn.vjudge.net/problem/ZOJ-4062 具体思路,二分法求最大值,然后看当前的值是不是符合情况,然后求出一个最优值。 AC代码: #include<iostream> #include<string> #include<cstring> #include<io...

diaomeijiao3430的博客 602

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1828

最优化方法Python计算:一元函数搜索算法——二分法

一元函数二分搜索算法的实现

u012958850的博客 2380

ArcGIS新手必看:用Landsat 8数据计算植被覆盖度的完整流程(附DEM裁剪技巧)

本文为ArcGIS新手提供了使用Landsat 8数据计算植被覆盖度的完整流程指南。详细讲解了从数据预处理、NDVI计算到基于像元二分模型反演植被覆盖度的核心步骤,并重点分享了利用DEM进行精确裁剪的实用技巧,帮助用户高效完成地表信息提取与分析。

weixin_29279047的博客 239

Android WLAN STA/AP 并发

Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能。对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 (softAP) 时不会中断 STA WLAN。

华南烹鱼宴 1248

二分算法——优选算法

1、二分算法并不局限于数组有序,在要找到数据的二段性即可使用二分算法。2、二分算法模板2.1.朴素二分模板else ...2.2.左边界查找模板2.3.右边界查找模板。

2302_80105876的博客 2109

电机控制——PMSM无感FOC控制(一)FOC入门

FOC 是一种电机控制技术,全称为 Field Oriented Control(磁场定向控制),也称作矢量控制。该技术可以提高电机的效率、控制稳定性和精度,广泛应用于电机驱动系统中,是目前无刷直流电机(BLDC)、永磁同步电机(PMSM)、感应电机的高效控制的最优方法之一。本节主要讲了FOC的大致流程,带大家先了解FOC到底是个什么东西在做什么,各个模块具体的原理会放到后面的章节详细讲解。FOC其实就是通过控制,相电流按照正弦变化,从而产生出旋转的磁场,控制电机转子转动。

zhuxinmingde的博客 2625

算法:二分搜索算法笔记

一、普通二分搜索算法 /** * 普通二分搜索 * @param nums * @param target * @return */ int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right) { int mid =

qq_36370187的博客 152

【ComfyUI】Flux 完整版文生图

本文介绍了一个基于Flux Dev的AI文生图全流程工作流,通过整合扩散模型、文本编码器和VAE解码器等核心组件,实现从文本到高清图像的端到端生成。工作流包含模型加载、条件构建、潜空间采样、图像解码和成果保存五个关键环节,支持高分辨率图像的细节还原和艺术风格塑造。应用场景涵盖艺术创作、内容生产、教学演示和科研数据准备等领域,适用于对画质和提示遵循性要求严格的场景。文章还提供了相关开发资源和学习教程链接,帮助用户深入理解AI绘图机制和实际应用。

Mr数据杨 1279

MacBook Air老本重装系统

手里的这个本子型号是A1466,cpu i5,4G内存,硬盘ssd 120G。 重装系统可以在原系统上升级到更新版本,或者用U盘安装。 先确定,这个本子可以安装什么系统。 最权威的信息当然是apple的官网,地址:https://support.apple.com/zh-cn/HT211683 在“检查兼容性”中,可以依次检查每个系统兼容的硬件型号。Mojave是A1466能安装的最高版本。 确认兼容性后,下一步就是下载安装文件。还是这个页面稍下面一点可以找到。 这里告诉用户文件可以在什

bigwood99的博客 2万+

算法:改写二分搜索算法

设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。问题来源:题目来源:《计算机算法设计与分析》王晓东输入格式:输入有两行:第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。输出格式:输出小于x的最大元素的最大下标i和大于x的最小

bensonrachel的博客 7991

44位abogus补环境与纯算逆向分析

44位ab参数补环境与纯算加密流程逆向分析

吴秋霖的博客 2774

实验1:二分搜索算法

Richard的专栏 2792

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1096

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PTA:改写二分搜索算法

改写二分搜索算法。返回小于x的最大元素位置和大于x的最小元素位置。

weixin_43554584的博客 2533

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

算法实验1:二分搜索的实现

二分搜索的实现 山东科技大学算法设计与分析实验1 一、实验目的和要求: 实现二分搜索的递归与非递归程序,跟踪分析执行过程,体会两者的执行效率,分析算法复杂性。 二、实验环境: VS2019 – c++文件(只要能运行cpp文件都可以) 三、算法描述及实验步骤 1.算法思想: 又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列

你说的白是什么白_ 948

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法模板:二分搜索

二分搜索算法模版

2201_75285132的博客 855

算法:二分搜索法

目录 @(二分搜索法) 例如: int a[]= {1,2,3,4,5,6,7,8}; 一个数组,我们要从中找到5在其中的位置,最简单就是如下: for(int i=0;i<a.length;i++){ if(a[i]==5){ return i; } } 这种方法用大O表达法分析[^1]的话, i=0;的频...

weixin_30606669的博客 97

如何修改二分搜索:适应特殊需求的变种算法完整指南

GitHub 加速计划 / c / C 项目是一个面向教育目的的算法集合,包含了数学、机器学习、计算机科学、物理等多个领域的 C 语言实现。其中,二分搜索作为经典的查找算法,在该项目中得到了多种创新变种实现,本文将带你探索如何根据特殊需求修改二分搜索算法。 ## 二分搜索变种算法概述 🚀 标准二分搜索算法适用于有序数组的精确查找,但在实际应用中,我们常常会遇到各种特殊需求,比如: - 查找第

gitblog_00024的博客 471

自学算法:02 二分搜索

无论整体是否有序,只要确定判定完中间值之后,可以进而确定哪一侧必然存在要找的值(或者某侧必然不存在要找的值),也就是缩小一半的寻找范围,就可以使用二分搜索法。

mrmobi的博客 412

【JavaScript】JS二分搜索算法:基本二分搜索、寻找左侧边界的二分搜索、寻找右侧边界的二分搜索

关于JavaScript中3种常见类型二分搜索算法的介绍

touyigeyueliang的博客 672

【Python】常用查询算法:最小项搜索、顺序搜索、二分搜索

目录 最小项搜索 顺序搜索 二分(叉)搜索 测试 main() 函数示例 最小项搜索 遍历整个列表,查询最小值 def min_search(items): """ 最小项搜索 :param items: :return: """ min_index = 0 for i in range(len(items)): ...

E.W的博客 1112

当程序员的直觉遇到二分搜索:这个算法怎么比我还会找东西?

边界条件vs(前者是闭区间,后者是左闭右开区间,用错了直接死循环!mid计算防溢出→ 当left+right超过INT_MAX时会溢出!→ 安全写法(数学上等价但更安全)更新区间时的+1/-1如果不写+1/-1,当剩余两个元素时会陷入死循环。亲身经历:因为这个bug在ACM竞赛罚时3次 T_T自从真正理解二分搜索后,我看待问题的角度都发生了变化。现在遇到复杂问题,第一反应就是:“能不能把这个系统变成有序状态?能不能用二分思想分解问题?

debugdynamo的博客 1126
上一篇: 2021-04-17
firestone-sh
博客等级 码龄24年 19粉丝 431原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值