动态规划算法基础及leetcode例题

01 基础理论

题型:动规基础(斐波那契数列or爬楼梯);背包问题;打家劫舍;股票问题;子序列问题

动规误区:只要看懂递推就ok(递推公式只是一部分)

解决动态规划应该要思考的几步:

  • 状态转移的DP数组以及下标的含义
  • 递推公式
  • DP数组为何初始化
  • 遍历顺序
  • 打印DP数组

02 例题

基础题目

509.斐波那契数列

思路:

确定dp[i]含义:第i个斐波那契数值
递推公式:dp[i]=dp[i-1]+dp[i-2]
dp数组如何初始化:dp[0]=1,dp[1]=1
遍历顺序:从前向后
打印dp数组:为了debug,如果出错,打印检查输出数组;

java代码:

class Solution {
    public int fib(int n) {
        if (n <= 1) return n;             
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int index = 2; index <= n; index++){
            dp[index] = dp[index - 1] + dp[index - 2];
        }
        return dp[n];
    }
}

70. 爬楼梯

思路:

1阶 1种
2阶 2种
3阶 3种(1+2)【1阶的方法+2步就是3阶;2阶的方法+1步就到3阶】
4阶 5种(2+3)【2阶的方法+2步就是3阶;3阶的方法+1步就到3阶】
.....
找到了递推关系:依赖与前两个状态

java代码

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

背包问题

01背包、完全背包、多重背包

01背包

二维dp实现01背包:

一维dp数组实现01背包:

416. 分割等和子集

思路:子集为所有元素之和的一半

容量为[所有元素之和的一半]的背包,抽象为01背包问题
dp[j]的含义:容量为j的背包,所背的最大价值
目标:dp[target]=target【每个元素的数组就是它的重量,也是它的价值】
递推公式:dp[j]=max(dp[j],dp(j-weight[i])+value[i]);
初始化:dp[0]=0;其他非零数组也等于0
遍历顺序:倒序【先物品,后背包】,因为每个元素只使用一次

java代码:

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums == null || nums.length == 0) return false;
        int n = nums.length;
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        //总和为奇数,不能平分
        if(sum % 2 != 0) return false;
        int target = sum / 2;
        int[] dp = new int[target + 1];
        for(int i = 0; i < n; i++) {
            for(int j = target; j >= nums[i]; j--) {
                //物品 i 的重量是 nums[i],其价值也是 nums[i]
                dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
            }
        }
        return dp[target] == target;
    }
}

完全背包

与0-1背包区别:数据可以重复使用
遍历顺序:正序遍历

正序遍历:

private static void testCompletePack(){
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWeight = 4;
        int[] dp = new int[bagWeight + 1];
        for (int i = 0; i < weight.length; i++){ // 遍历物品
            for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
                System.out.print(j + "-" +dp[j]);
                System.out.print(" ");
            }
            System.out.println();
        }
}

//输出
1-15 2-30 3-45 4-60 
3-45 4-60 
4-60 

倒序遍历:

for (int i = 0; i < weight.length; i++){ // 遍历物品
    for (int j = bagWeight; j >= weight[i]; j--){ // 遍历背包容量
        dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
        System.out.print(j + "-" +dp[j]);
        System.out.print(" ");
     }
     System.out.println();
}

//输出
4-15 3-15 2-15 1-15 
4-35 3-20 
4-35 

518.零钱兑换II

动规五部曲:

dp含义:dp[j] 装满容量为j的背包,有dp[j]种方法【最终要求的:dp[amount]】
递推公式:dp[j]+=dp[j-coins[i]]//装满有多少种方法的递推公式
【dp[j]方法数与前面方法数相关(类似爬楼)】
初始化:dp[0]=1【装满背包为0的方法有一种】,非零下标初始为0
遍历顺序:先物品后背包(组合数);先背包后物品(排列数)

java代码:

class Solution {
    public int change(int amount, int[] coins) {
        //递推表达式
        int[] dp = new int[amount + 1];
        //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
        dp[0] = 1;
        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j <= amount; j++) {
                dp[j] += dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

377. 组合总和 Ⅳ

与上一次不同的是:

遍历顺序:先背包后物品(求全排列的个数)

java代码

class Solution {
    public int combinationSum4(int[] nums, int target) {
        if(nums == null || nums.length==0) return 0;

        int[] dp = new int[target+1];
        dp[0] = 1;

        for(int j=0;j<=target;j++){
            for(int i=0;i<nums.length;i++){
                if(j>=nums[i]){
                    dp[j] += dp[j-nums[i]];
                }
            }
        }

        return dp[target];
    
    }
}

70. 爬楼梯

核心:排列数

java代码:

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n+1];
        int[] nums = new int[]{1,2};

        dp[0]=1;

        for(int j = 0;j<=n;j++){
            for(int i=0;i<nums.length;i++){
                if(j>=nums[i]){
                    dp[j] += dp[j-nums[i]];
                }
            }
        }
        return dp[n];
    }
}
本文转载于网络 如有侵权请联系删除

相关文章

  • 免费开放接口API

    大家好,又见面了,我是你们的朋友全栈君。为了方便各类开发者,现提供免费开放Api接口,所有接口均无使用限制,返回格式全是JSON,所以基本能满足大家的开发需求,但请各位不要将这些Api接入正式项目,因为有一些不稳定因素,这些Api是我平时业余时间编写,可能有些不能满足需求的情况,请大家在留言区提出来,或者大家写Demo需要一些有关联的数据等等,都可以在留言区告诉我,我有时间一定会给大家处理。api.apiopen.top复制请去以上地址查看接口文档。因为前期服务杂乱,故此次下架所有历史版本,使用新版接口,新版接口处于开发状况,部分接口正在重写,敬请期待。接口示例:获取短视频 https://api.apiopen.top/api/getHaoKanVideo?page=0&size=2复制响应 { "code":200, "message":"成功!", "result":{ "total":11860, "list":[ { "id":7

  • 如何保证消息的顺序性?

    RabbitMQ可能出现的消息顺序不一致问题 消息中间件都是消息队列,也就是说我们发布消息是顺序的,到消息中间件中也是有顺序的,并且消费者从消息队列中取消息也是顺序的,那么消息可能从哪里乱序呢?? 答案是:可能是多个消费者消费时候有不同的消费速度,造成了乱序举个栗子 这里我们需要同步一个mysql基础库里的数据到操作库 我们在基础mysql里增删改一条数据,对应出来了增删改3条binlog(数据库更新的SQL语句信息),接着这三条binlog发送到MQ里面,到消费出来依次执行.需要保证人家是按照顺序来的,不然本来是有顺序性的:增加、修改、删除;系统换了顺序执行成了删除、修改、增加,就错了。RabbitMQ可能出现的顺序不一致问题--主要因为只由一个queue后,好几个消费者进行消费,他们互相之间不知道彼此顺序那如何保证消息的顺序性呢?rabbitmq:拆分多个queue,每个queue对应一个consumer,然后把需要保证顺序的数据刷到一个consumer中,不需要保证顺序的随便发给concumer接收或者还是一个queue,只对应一个consumer,然后这个consumer内部用

  • MySQL - order by和 group by 优化初探

    DBVersionmysql>selectversion(); +-----------+ |version()| +-----------+ |5.7.28| +-----------+ 1rowinset mysql>复制TableCREATETABLE`employees`( `id`int(11)NOTNULLAUTO_INCREMENT, `name`varchar(24)NOTNULLDEFAULT''COMMENT'姓名', `age`int(11)NOTNULLDEFAULT'0'COMMENT'年龄', `position`varchar(20)NOTNULLDEFAULT''COMMENT'职位', `hire_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'入职时间', PRIMARYKEY(`id`), KEY`idx_name_age_position

  • 当Docker遇到Intellij IDEA,再次解放了生产力~

    Idea是Java开发利器,SpringBoot是Java生态中最流行的微服务框架,docker是时下最火的容器技术,那么它们结合在一起会产生什么化学反应呢? 一、开发前准备1.Docker的安装可以参考https://docs.docker.com/install/ 2.配置docker远程连接端口vi/usr/lib/systemd/system/docker.service复制 找到ExecStart,在最后面添加-Htcp://0.0.0.0:2375,如下图所示3.重启dockersystemctldaemon-reload systemctlstartdocker复制复制4.开放端口firewall-cmd--zone=public--add-port=2375/tcp--permanent复制复制5.Idea安装插件,重启6.连接远程docker(1)编辑配置(2)填远程docker地址 (3)连接成功,会列出远程docker容器和镜像二、新建项目1.创建springboot项目项目结构图(1)配置pom文件<?xmlversion="1.0"e

  • 【大数据哔哔集20210110】后起之秀ClickHouse的优缺点和核心特性

    ClickHouseisacolumn-orienteddatabasemanagementsystem(DBMS)foronlineanalyticalprocessingofqueries(OLAP). 复制ClickHouse全称是ClickStream,DataWarehouse,简称ClickHouse就是基于页面的点击事件流,面向数据仓库进行OLAP分析。ClickHouse是一款开源的数据分析数据库,由战斗民族俄罗斯Yandex公司研发的,Yandex是做搜索引擎的,就类似与Google,百度等。我们都知道搜索引擎的营收主要来源与流量和广告业务,所以搜索引擎公司会着重分析用户网路流量,像Google有Anlytics,百度有百度统计,那么Yandex就对应于Yandex.Metrica。ClickHouse就式在Yandex.Metrica下产生的技术。根据官网的介绍(https://clickhouse.tech/benchmark/dbms/),ClickHouse在相同的服务器配置与数据量下,平均响应速度:Vertica的2.63倍(Vertica是一款收费的列式存

  • react官方推荐的classnames库

    一、为什么使用classnames这个库在react开发中,我们有的时候需要使用js来动态判断是否为组件添加class(类名),这里我们使用到了classnames二、学习网址https://www.npmjs.com/package/classnames https://github.com/JedWatson/classnames 三、安装与引入安装npminstallclassnames--save复制引入importclassnamesfrom‘classnames’;复制四、使用示例<ButtonclassName={classnames({ //这里可以根据各属性动态添加,如果属性值为true则为其添加该类名,如果值为false,则不添加。这样达到了动态添加class的目的 base:true, inProgress:this.props.store.submissionInProgress, error:this.props.store.errorOccurred, disabled:this.props.form.valid, })}> <Button

  • 超简单的CDH6部署和体验(单机版)

    为什么会超简单借助ansible简化了CDH6部署工作的大部分内容,也降低了手工操作失误的概率,今天实战的内容,是在一台安装了ansible的电脑上(苹果或Linux操作系统)运行ansible脚本,远程操作一台CentOS服务器,在上面部署CDH6,并操作验证本次部署是否成功。ansible学习如果您想了解ansible,请参考《ansible2.4安装和体验》为什么要部署单机版CDH6主要是用来做为大数据技术的学习和开发的环境,并不适合生产;实战简述本次实战内容:部署、启动、验证,整个过程如下图所示: 全文大纲本文由以下章节组成:环境信息;下载文件;文件摆放;CDH机器设置;ansible参数设置;部署;重启CDH服务器启动;设置;修复问题;体验;环境信息本次实战的操作过程如下图所示,安装ansible2.9版本的MabBookPro电脑作为ansible服务器,执行playbook脚本,对一台CentOS服务器进行远程操作,完成CDH6的部署和启动: 上图蓝色背景的电脑,可以是苹果操作系统,也可以是Linux操作系统,黄色背景的电脑要用来运行CDH6,必须是CentOS7.7操

  • [财务][数据化分析][帆软]行式报表-行式引擎适用于大数据量情形下。

    [财务][数据化分析][帆软]行式报表-行式引擎适用于大数据量情形下。这个设计器,只能用FineReport搞。没关系的,FineBI里面可以兼容展示FineReport报表。在公司采买的时候,如果资金上允许,请直接购买FineBI。行式引擎适用于大数据量情况下。使用此引擎很多报表特性将不再支持,详细内容清查看文档相关章节。通过配置工作目录连接FineBI并进行设计。 一、行式报表简介https://help.finereport.com/doc-view-396.html1.描述在 行式报表 中,介绍了行式列表报表的制作方式,下面来介绍几个在行式报表下的典型应用示例。在线视频教程请点击: 行式报表2.索引小节内容简介文档链接条件属性在满足一定条件下改变单元格的格式或者显示成不同的值。添加预警,间隔背景色-条件数据过滤从大量的数据当中,获取到符合条件的数据。筛选数据-过滤数据排序报表展示时,有些数据排序后显示更有层次。排序结果集筛选通过设置数据列的高属性中的结果集筛选来让其只显示N个数据。结果集筛选1.1预期效果在满足一定条件下改变单元格的格式或者显示成不同的值。如下图所示,单元格背景

  • 在联想小新锐7000笔记本上安装centos7

    本文由腾讯云+社区自动同步,原文地址http://blogtest.stackoverflow.club/install-centos-on-laptop/长话短说在https://www.centos.org/download/找一个合适的版本下载,不要选minimal版本就行。windows平台推荐用win32diskimager,linux平台就用dd吧设置笔记本为u盘启动,按照提示操作就一切ok其实装系统本来就应该很简单,只是不断发生的意外状况将它复杂化了折腾历程用了大半年的win10,一直都舍不得扔,倒不是它表现多出色,而是买电脑的时候我也付费了的,想想win系统和office的价格就心疼。但是最近发生的意外状况太多了:意外死机N次,更新系统没有用蓝牙鼠标只能开机后连接一次,掉线后就只能重启后才能重新连接。更新驱动无用。耳机与鼠标的情况相同。还有其他,比方说没有接交流电,电脑是开不了机的,这个bug通过更新一次biosfix了。基于以上理由,我想换linux系统。首先想到的当然是ubuntu,界面漂亮,兼容性好,不管什么样的机子都可以通过liveCD运行。使用pe更新bios

  • Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践

    0x00初衷最近参与的几个项目,无一例外对监控都有极强的要求,需要对项目中各组件进行详细监控,如服务端API的请求次数、响应时间、到达率、接口错误率、分布式存储中的集群IOPS、节点在线情况、偏移量等。比较常见的方式是写日志,将日志采集到远端进行分析和绘图,或写好本地监控脚本进行数据采集后,通过监控系统客户端push到监控系统中进行打点。基本上我们需要的都能覆盖,但仍然有一些问题在使用上不太舒服,如在大规模请求下日志采集和分析的效率比较难控制,或push打点的粒度和纬度以及查询不够灵活等。后来在同事对《GoogleSRE》这本书中的一些运维思想进行一番安利后,抱着试一试的态度,开始尝试使用Prometheus做为几个项目的监控解决方案。0x01Prometheus的特点多维数据模型(时序数据由metric名和一组K/V标签构成)。 灵活强大的查询语句(PromQL)。 不依赖存储,支持local和remote(OpenTSDB、InfluxDB等)不同模型。 采用HTTP协议,使用Pull模式采集数据。 监控目标,可以采用服务发现或静态配置的方式。 支持多种统计数据模型,图形化友好(G

  • ROS + Caffe 机器人操作系统框架和深度学习框架笔记 (機器人控制與人工智能)

    ROS+Caffe,这里以环境中物体识别为示例,机器人怎么知道环境里面有什么呢?[0.0567392-n03376595foldingchair] [0.0566773-n04099969rockingchair,rocker] [0.236507-n04239074slidingdoor] [0.477623-n03832673notebook,notebookcomputer] [0.233582-n03180011desktopcomputer] caffe在ros中主题以概率方式推断物品,比如椅子,门和笔记本电脑。如何实现?首先,需要安装BerkeleyVisionandLearningCenter(BVLC)的Caffe,在ubuntu14.0416.04上网上教程很多,这里就不多说,只列出核心步骤:最重要的就是看官网说明!!!----http://caffe.berkeleyvision.org/$sudoapt-getinstalllibatlas-devlibatlas-base-dev $sudoapt-getinstalllibprotobuf-devlibleve

  • 如何在Kubernetes里创建一个Nginx service

    Jerry之前的文章如何在Kubernetes里创建一个Nginx应用,已经使用kubectl命令行创建了Pod,但是在kubernetes中,Pod的IP地址会随着Pod的重启而变化,因此用Pod的IP地址来访问我们部署的nginx应用不太合适。Kubernetes里推荐的方式是用Service来消费nginx服务。Service为一组Pod提供一个统一的入口,并为它们提供负载均衡和服务发现支持。使用如下命令行基于pod创建一个service:kubectlexposedeploymentnginx-app--type=NodePort--port=80收到service/nginx-appexposed消息。使用命令行拿到创建成功的service的明细:kubectldescribeservicenginx-app使用http://<node_id>:32624访问这个nginx应用:看到上图说明访问nginx成功了。使用命令行查看nginx访问日志:kubectllogsnginx-app-f75d46bd9-q6c76要获取更多Jerry的原创文章,请关注公众号&q

  • 从迪士尼到谷歌,他用推荐算法玩儿转数据科学 | 数据科学50人·鲁颖

    鲁颖,曾任美国迪士尼集团首席数据科学家,他领导开发了迪士尼的用户个性化推荐系统,在个性化推荐算法领域有着丰富经历。现任谷歌高级数据科学家,领导GooglePlay数据科学团队。数据,让一切有迹可循,让一切有源可溯。小到点外卖、逛淘宝,大至金融风控、智慧城市......如今,我们每个人都是数据的生产者和受益者。在这样的背景下,“数据科学”应运而生。在数据科学家鲁颖看来,数据科学就是利用大数据的威力,科学系统地解决实际问题的学科。“一位优秀的数据科学家,必须得是‘多面小能手’,除了过硬的技术、严谨的思维,推理能力和沟通能力也是重中之重,大部分时间还要自己写代码同实际数据打交道。”鲁颖说道,“这需要很强的综合能力。”坐在DT君面前接受采访的他,在说话时,常常稍微抬起手比划着习惯的动作。鲁颖平时外表沉静,但只要谈及自己的职业,他立刻就会开始变得兴奋,眼里闪烁着光芒。他曾任美国迪士尼集团的首席数据科学家,已经在数据科学行业耕耘多年,现服务于谷歌,任GooglePlay高级数据科学家。作为统计学出身的博士,鲁颖对机器学习、数据挖掘和人工智能等十分着迷。“我天生喜欢数学,对数字特别敏感,是个有好奇心

  • 腾讯云云防火墙产品优势

    开启方便,无需部署云防火墙采用SDN技术,提供公有云上的SaaS化防火墙,实现云上资产自动识别和一键开关,进行简单策略配置即可使用,提供无需部署成本的云防火墙功能。 稳定可靠,平滑扩展具备主备容灾机制,保障性能稳定可靠。同时充分发挥SaaS化服务优势,支持带宽、资产及存储等弹性扩展,实现按需分配,平滑扩展。 统一管控,高效易用 云防火墙提供完整的互联网之间、VPC之间流量的统一访问控制和安全隔离能力,为用户提供统一的访问控制平面。 互联网边界访问控制:基于对公网IP配置的访问控制规则,从而封堵或观察有威胁的访问目的流量,也可以阻断外部威胁访问源对云上资产发起的攻击行为。 VPC边界访问控制:基于对租户内VPC之间配置访问控制规则,从而控制VPC之间的访问行为,实现VPC之间的安全隔离。 企业安全组:保持基于五元组的配置习惯,方便管理安全组配置,满足VPC子网间、VPC间、混合云专线间的防护场景,支持阻断日志,轻松构建云上的DMZ区。 云防火墙遵循传统防火墙的规则配置模式,结合安全运维人员的使用场景,降低用户学习成本,提高产品易用性。 等保合规,日志审计 满足等保要求中的边界防护和

  • 腾讯云护航服务购买指南

    腾讯云根据客户申请的护航业务需求,为客户量身定制专属的护航计划,如您需要购买,请您提前14个工作日提出申请。计费概述腾讯云专家护航服务为预付费按天结算方式计费,当前腾讯云专家护航服务为您提供如下服务方案:腾讯云专家护航服务收费标准服务类型服务形式收费专家驻场护航服务专家团队为用户云上业务提供系统容量体验及管理方案建议、系统优化建议、安全优化建议、容灾方案建议和全程应急保障,并提供驻场技术支持护航,提升用户云上业务稳定性。首日30000元,后续每增1天,总费用增加10000元购买方式请提前14个工作日在腾讯云官网>支持>护航服务提交申请,且申请的护航服务时间必须为连续的。欠费说明本服务为预付费按天结算方式计费,双方达成一致目标且客户完成付费后即可享受服务,账户欠费状态不影响本服务。退费说明本服务为预付费按天结算方式计费,暂不支持退费,如有特殊情况,请及时与商务经理联系。

  • 一周总结

    上周电脑出了点问题,自己用u盘重装了一遍系统,重装完后驱动装好调试了差不多电脑又蓝屏了,后来进安全模式检查了下是驱动不兼容, 然后又删除驱动结果发现又删多了,想了想还是再装一次吧,过程比较坎坷。 之后就是苦逼的环境搭建过程,jdk的配置,mysql环境搭建,值得一提的是mysql8及以上版本只能用压缩包配置,配置过程一定要小心, 不然配错了很麻烦,即使想删除mysql重新配置都很麻烦,我不小心忘记了改my.ini的后缀名,导致了在cmd中对mysql初始化出现了错误。 总结一些注意事项1my.ini中路径使用\\,里面不可以有空行。2mysqld后面有个空格再加-,不然会报错。3.不需要手动去建立Data文件夹。 4.如果测试时候提示密码过期,可以采用命令行输入mysqladmin-uroot-ppassword即可解决密码过期问题。

  • CentOS 7 安装 Oracle 11.2.0.4

    一、安装环境 CentOSLinuxrelease7.2.1511(Core) OracleDatabase11gRelease2(11.2.0.4) 二、安装前准备 2.1修改主机名 修改/etc/sysconfig/network配置文件中的HOSTNAME变量 [root@xqzt~]#hostnamectlset-hostnameoracledb ####永久性修改 [root@xqzt~]#vi/etc/sysconfig/network NETWORKING=yes HOSTNAME=oracledb [root@xqzt~]#hostname oracledb复制 2.2添加主机名与IP对应记录 [root@xqzt~]#vi/etc/hosts 172.17.22.70oracledb复制 2.3关闭Selinux [root@oracledb~]#sed-i"s/SELINUX=enforcing/SELINUX=disabled/"/etc/selinux/config [root@oracledb~]#setenforce0复制 2.4firewall

  • sql进阶练习题

      student SNO   SNAME   SAGE   SSEX01   赵雷   1990-01-0100:00:00   男02   钱电   1990-12-2100:00:00   男03   孙风   1990-05-2000:00:00   男04   李云   1990-08-0600:00:00   男06   吴兰   1992-03-0100:00:00   女07   郑竹&nb

  • WPF简单实现可以左右滑动的CheckBox复选框,样式模仿的微信

    <StackPanelGrid.Row="0"Orientation="Horizontal"HorizontalAlignment="Right"Margin="0,5,5,0"> <TextBlockText="自动刷新"FontSize="14"Margin="0,0,3,0"/> <CheckBoxWidth="36"Height="18"Cursor="Hand"IsChecked="{BindingAutoRefreshNewRecipe}"> <CheckBox.Template> <ControlTemplateTargetType="CheckBox"> <BorderWidth="{TemplateBindingWidth}"Height="{TemplateBindingHeight}"CornerRadius="8"Background="{TemplateBindingBackground}"> <GridName="btn"Width="{TemplateBindingHeig

  • HashMap源码分析

      /** *Thedefaultinitialcapacity-MUSTbeapoweroftwo.*初始化容量值的大小即初始化数组的大小为16以后扩容也必须是2的倍数 */ staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;//aka16 /** *Themaximumcapacity,usedifahighervalueisimplicitlyspecified *byeitheroftheconstructorswitharguments. *MUSTbeapoweroftwo<=1<<30.*初始化最大容量的大小 */ staticfinalintMAXIMUM_CAPACITY=1<<30; /** *Theloadfactorusedwhennonespecifiedinconstructor.*初始化负载因子的大小0.75 */ staticfinalfloatDEFAULT_LOAD_FACTOR=0.75f; /** *Thebincountthresholdforusingatr

  • Java NIO 选择器 Selector

    选择器Selector是I/O多路复用模型的核心组件,它可以监控实现了SelectableChannel接口的通道的就绪情况。基于多路复用(multiplexing)I/O模型,单线程的Java程序能够处理数万个连接,极大提高了系统的并发数。 1.多路复用I/O模型 I/O多路复用模型是操作系统提供给应用程序的一种进行I/O操作的模型。应用程序通过select/poll系统调用监控多个I/O设备,一旦某个或者多个I/O设备的处于就绪状态(例如:可读)则返回,应用程序随后可对就绪的设备进行操作。 .st22{fill:#191919;font-family:TimesNewRoman;font-size:10pt} .st11{fill:#191919;font-family:TimesNewRoman;font-size:13pt;font-weight:bold} .st33{font-family:Arial;font-size:10pt} 应用程序内核select数据未准备好阻塞等待等待数据数据已准备好复制完成复制数据到用户空间read处理数据阻塞等待系统调用返回可读系统调用返

相关推荐

推荐阅读