【由浅入深学MySQL】之MySQL索引基础入门

本系列为:MySQL数据库详解,为千锋教育资深教学老师独家创作

致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~

文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!

在这里插入图片描述

前言

从今天开始本系列内容就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。


全文大约【1888】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图视频,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...

一. 索引

1. 什么是索引

先来带各位小伙伴了解下索引的好处是什么呢?

那肯定是查询数据块!

通过索引可以快速的查询到想要的数据。MySQL数据库中的索引其实就是一种可以快速获取数据的一种数据结构。 在表中除了表中的数据外,数据库系统还维护着满足特定查找算法的数据结构,这种数据结构以某种特定的方式指向数据,这种数据结构就是索引啦。

2. 索引的分类

按照功能分类:

普通索引: 最基本的索引,它没有任何限制。

唯一索引: 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值组合必须唯一。

主键索引: 一种特殊的唯一索引,不允许有空值。一般在建表时同时创建主键索引。

组合索引: 顾名思义,就是将单列索引进行组合。

外键索引: 只有InnoDB引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作。

全文索引: 快速匹配全部文档的方式。InnoDB引擎5.6版本后才支持全文索引。MEMORY引擎不支持。

按数据结构分类:

B+Tree索引 : MySQL使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎默认的索引类型。

Hash索引 : MySQL中Memory存储引擎默认支持的索引类型。

3. 索引的操作

3.1数据准备

下面各位小伙伴和一起来为演示索引准备一下表结构和数据:

-- 创建student表
CREATE TABLE `student` (
  `SId` int(10) NOT NULL AUTO_INCREMENT,
  `Sname` varchar(10) DEFAULT NULL,
  `Sage` int(255) DEFAULT NULL,
  `Ssex` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`SId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- 添加数据
INSERT INTO `student` VALUES ('1', '赵雷', '23', '男');
INSERT INTO `student` VALUES ('2', '钱电', '22', '男');
INSERT INTO `student` VALUES ('3', '穷奇', '12', '男');
INSERT INTO `student` VALUES ('4', '饕鬄', '23', '男');
INSERT INTO `student` VALUES ('5', '周梅', '45', '女');
INSERT INTO `student` VALUES ('6', '吴兰', '12', '女');
INSERT INTO `student` VALUES ('7', '郑竹', '43', '女');
INSERT INTO `student` VALUES ('9', '张三', '33', '女');
INSERT INTO `student` VALUES ('10', '李四', '44', '女');
INSERT INTO `student` VALUES ('11', '李四', '24', '女');
INSERT INTO `student` VALUES ('12', '赵六', '54', '女');
INSERT INTO `student` VALUES ('13', '孙七', '23', '女');
INSERT INTO `student` VALUES ('14', '青龙', '12', '男');
INSERT INTO `student` VALUES ('15', '白虎', '34', '女');
INSERT INTO `student` VALUES ('16', '梼杌', '54', '男');

3.2创建索引:

下面是创建索引的语法,各位小伙伴可以一起来试一试。

语法:

CREATE [UNIQUE|FULLTEXT] INDEX 索引名称

[USING 索引类型] -- 默认是B+TREE

ON 表名(列名...);

注意: 如果一个表中有一列是主键,那么就会默认为其创建主键索引!(主键列不需要单独创建索引)。

举个栗子:

-- 为student表中姓名列创建一个普通索引
CREATE INDEX idx_name ON student(Sname);

-- 为student表中年龄列创建一个唯一索引
CREATE UNIQUE INDEX idx_age ON student(Sage);

3.3查看索引

创建完索引后可以进行查看索引,如下:

语法:SHOW INDEX FROM 表名;

-- 查看student表中的索引
SHOW INDEX FROM student;

3.4删除索引

最后是删除索引语法和案例:

语法:DROP INDEX 索引名称 ON 表名;

-- 删除student表中的idx_score索引
DROP INDEX idx_score ON student;

-- 查看student表中的索引
SHOW INDEX FROM student;

4. 索引效率的测试

下面是创建product商品表,并添加100万条数据做测试。

-- 创建product商品表
CREATE TABLE product(
  id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品id
  NAME VARCHAR(10),                   -- 商品名称
  price INT                           -- 商品价格
);

-- 定义存储函数,生成长度为10的随机字符串并返回
DELIMITER $

CREATE FUNCTION rand_string() 
RETURNS VARCHAR(255)
BEGIN
DECLARE big_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';
DECLARE small_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 1;

WHILE i <= 10 DO
SET small_str =CONCAT(small_str,SUBSTRING(big_str,FLOOR(1+RAND()*52),1));
SET i=i+1;
END WHILE;

RETURN small_str;
END$

DELIMITER ;



-- 定义存储过程,添加100万条数据到product表中
DELIMITER $

CREATE PROCEDURE pro_test()
BEGIN
DECLARE num INT DEFAULT 1;

WHILE num <= 1000000 DO
INSERT INTO product VALUES (NULL,rand_string(),num);
SET num = num + 1;
END WHILE;
END$

DELIMITER ;

-- 调用存储过程
CALL pro_test();


-- 查询总记录条数
SELECT COUNT(*) FROM product;



-- 查询product表的索引
SHOW INDEX FROM product;

-- 查询name为OkIKDLVwtG的数据   (0.049)
SELECT * FROM product WHERE NAME='OkIKDLVwtG';

-- 通过id列查询OkIKDLVwtG的数据  (1毫秒)
SELECT * FROM product WHERE id=999998;

-- 为name列添加索引
ALTER TABLE product ADD INDEX idx_name(NAME);

-- 查询name为OkIKDLVwtG的数据   (0.001)
SELECT * FROM product WHERE NAME='OkIKDLVwtG';


/*
范围查询
*/
-- 查询价格为800~1000之间的所有数据 (0.052)
SELECT * FROM product WHERE price BETWEEN 800 AND 1000;

/*
排序查询
*/
-- 查询价格为800~1000之间的所有数据,降序排列  (0.083)
SELECT * FROM product WHERE price BETWEEN 800 AND 1000 ORDER BY price DESC;

-- 为price列添加索引
ALTER TABLE product ADD INDEX idx_price(price);

-- 查询价格为800~1000之间的所有数据 (0.011)
SELECT * FROM product WHERE price BETWEEN 800 AND 1000;

-- 查询价格为800~1000之间的所有数据,降序排列  (0.001)
SELECT * FROM product WHERE price BETWEEN 800 AND 1000 ORDER BY price DESC;

二. 结语

最后在这里对本文核心要点进行总结:

  1. 索引是提高查询速度的特别有效的工具,建议熟练掌握。

  2. 请记住各种不同类型的索引,在不同的业务场景选择合适的索引类型使用。


以上就是本文的全部内容啦,如果感觉对大家有帮助的话,可以关注我们持续追更哦~

更多教学视频:戳链接直达教学视频

本文转载于网络 如有侵权请联系删除

相关文章

  • Spring AOP入门使用详解

    大家好,又见面了,我是你们的朋友全栈君。1.maven依赖:<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context&

  • 并发编程之手写一个简单的线程池

    前言:有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用多线程的时候,往往都是通过直接newThread来实现多线程。但是往往良好多线程的设计大多都是使用线程池去实现,今天主要是跟大家分享如何自己实现一个简单的线程池,帮助理解线程池的工作的原理,以及手动实现的这个线程池存在哪些缺点不足,最后分析JDK源码中的线程池是如何设计来解决这些缺点和不足。一,为什么要使用线程池(1)降低资源的消耗。降低线程创建和销毁的资源消耗;(2)提高响应速度:线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间(3)提高线程的可管理性。二,手写一个线程池1、在手写一个线程池之前,我们应该简单的考虑一下,这个线程的数据结构(1)线程池中运行线程的个数(2)线程池中如何保存未处理的任务(3)线程池中的执行任务和清除任务的方法2、直接上代码吧MySelfThreadPool.javapackagecom.concurrent.pool; importjava.util.HashSet; importjava.util.Set; importjava.util.concur

  • 基于Alluxio优化大数据计算存储分离架构的最佳实践

    1.当前大数据挑战近年来,随着大数据规模的增长,以及大数据应用的发展,大数据技术的架构也在持续演进。早期的技术架构是计算资源和存储资源高度融合,计算和存储资源一体化存在以下明显的挑战:数据孤岛:如今,企业拥有PB级数据已经成为常态,EB级数据时代也将很快到来。企业需要面向结构化数据、非结构化数据、实时数据等多种类型的数据提供高扩展且统一的数据管理和数据存储能力。刚性扩容:在数据空间持续增长的背景下,大数据应用场景不断增加,对企业算力的需求也在加剧提升。而同时,新品发布、热点事件等带来的业务浪涌,也需要企业大数据系统拥有极致的弹性能力。利用率低:大数据行业技术栈迭代迅速,企业自行构建IDC中心和自行部署软件,一次性投资大,且折旧成本高,运营运维负担沉重。作业拥塞:随着业务的发展,在数据量巨大的背景下,单次分析作业常需要读取TB-PB级的数据,多任务并发下,极易出现作业拥塞。面对以上挑战,传统的以私有数据中心为基础的存算一体大数据架构,已无法满足企业海量数据分析的需求。业界知名分析机构IDC在最新的报告中明确指出:企业上云已成必然趋势。因此,在公有云上部署更灵活高效的大数据分析平台,将成为

  • 表征学习、图神经网络、可解释的 AI , ML & 机器人七大研究进展一览

    作者|GregoryJStein编译|翻译官balala编辑|丛末随着每一年的结束,麻省理工学院电气工程与计算机科学系博士GregoryJStein都会回顾一下对其影响最大的各大研究趋势或论文,今年亦如此。 作为该领域的研究人员,他发现深入研究其认为研究界取得的巨大进展,或找出目前可能没有取得进展的领域,可能会很有意义。 本文中,GregoryJStein对机器学习和机器人研究领域的目前的发展现状发表了他的看法。一、从ALPHAZERO到MUZERO AlphaZero是2017年我最喜欢的论文之一。DeepMind的国际象棋和围棋AI今年实现了重大升级,现在的版本名叫:MuZero,从而顺利将Atari游戏添加到了其以超越人类的表现完成的任务清单之列。以前对于AlphaZero来说,Atari游戏是遥不可及的,因为这款游戏的观察空间非常大,这使得AlphaZero难以构建行为树并得出决策结果。在围棋中,由于棋盘会遵循采取某个动作后棋盘会呈现的局势的一系列规则,因此预测行为结果是很容易的。但对于Atari而言,预测行动结果原则上需要预测下一帧游戏可能呈现的战局。当系统试图估计它在几帧内

  • 一文了解GaussDB 200的产品架构、数据流程、组网方案、服务部署原则、企业级增强特性...

    墨墨导读:本文是对GaussDB200产品的整体描述,包含产品架构、数据流程、组网方案、服务部署原则、企业级增强特性等。产品描述GaussDB200是企业级的大规模并行处理关系型数据库。GaussDB200采用MPP(MassivelyParallelProcessing)架构,支持行存储与列存储,提供PB级别数据量的处理能力。 GaussDB200在核心技术上跟传统数据库相比有巨大优势,可以解决很多行业用户的数据处理性能问题,可以为超大规模数据管理提供高性价比的通用计算平台,并可用于支撑各类数据仓库系统、BI(BusinessIntelligence)系统和决策支持系统,统一为上层应用的决策分析等提供服务。产品架构GaussDB200采用Share-nothing架构,由多个拥有独立且互不共享CPU、内存、存储等系统资源的节点组成。在这样的系统架构中,业务数据被分散存储在多个物理节点上,数据分析任务被推送到数据所在位置就近执行,通过控制模块的协调,并行地完成大规模的数据处理工作,实现对数据处理的快速响应。GaussDB200由多个MPPDBServer组成:MPPDBServer(C

  • CVE-2019-0708:RDP终极EXP爆出

    0x00漏洞概述CVE-2019-0708是微软于2019年05月14日发布的一个严重的RDP远程代码执行漏洞。该漏洞无需身份认证和用户交互,可能形成蠕虫爆发,影响堪比wannycry。2019年09月07日,@rapid7在其metasploit-framework仓库公开发布了CVE-2019-0708的利用模块,漏洞利用工具已经开始扩散,已经构成了蠕虫级的攻击威胁。0x01影响版本Windows7WindowsServer2008R2WindowsServer2008Windows2003WindowsXPWindows8和Windows10及之后版本的用户不受此漏洞影响 0x02漏洞原理由于对象指针在释放后再次被使用而引发UAF漏洞,详情见https://www.anquanke.com/post/id/181577 0x03环境搭建本次复现版本为win7sp1和win08R2Vmware环境下载链接:win7sp1: ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B585

  • DevOps

    DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。实现DevOps需要什么?硬性要求:工具上的准备上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下:代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion构建工具:Ant、Gradle、maven自动部署:Capistrano、CodeDeploy持续集成(CI):Bamboo、Hudson、Jenkins配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRockGuardRail容器:Docker、LXC、第三方厂商如AWS编排:Kubernetes、Core、ApacheMesos、DC/OS服务注册与发现:Zookeeper、etcd、Consul脚本语言:python、ruby、shell日志管理:ELK、Log

  • 向大家汇报,我们连续第二年登上KVM全球开源贡献榜

    用开源回馈社区,腾讯云是认真的。10月25日,凭借向KVM(内核虚拟化技术)贡献的patch数,腾讯云再次登上KVM开源贡献排行榜,连续两年成为国内贡献度最高的公有云厂商。在今年10月24到10月26日举行的KVMForum2018大会上,KVM主要维护者PaoloBonzini介绍了KVM开源项目的当前进展,并统计2018年全球企业对KVM的贡献和重要特性。其中,腾讯云向KVM内核贡献了40个patch,全球排名第七,其他上榜企业分别是Linaro/ARM、IBM、RedHat、Intel、Oracle、Google以及AMD。这已经是腾讯云连续第二年成为国内贡献度最高的公有云厂商,也是唯一上榜的中国企业。大会上公布的patch年度贡献数厂商排名,腾讯位列第七KVMForum是KVM开源项目组织的年度高端技术论坛会议,每年全球顶尖开发人员和用户齐聚一堂,在为期三天的时间里,探讨Linux虚拟化技术的发展趋势和未来挑战,是KVM社区最为重要和权威的大会。近年来,腾讯云一直秉承开放,共享的心态参与开源,凭借庞大的用户群和KVM集群规模,在KVM虚拟化上进行研究、探索和实践。此次腾讯云再次

  • 支付宝/微信/银联详细代码案例

    技术框架支付宝:扫码支付、电脑支付、WAP支付、APP支付服务端微信:扫码支付(模式一二)、公众号H5支付、WAP支付银联:电脑支付、WAP支付开发环境JDK1.7、Maven、Eclipse、SpringBoot1.5.2、spring-boot-starter-thymeleaf、Dubbox2.8.4、zookeeper3.4.6功能界面源码下载地址https://pan.baidu.com/s/1v_Lg4tf1-iI10n-hHdFf_A-------------------------------------------------- 【写著说明】以上文章属于此公众号原创所有,如需转载请注明出处。【免责申明】本公众平台不是广告商,也没有为其他三方网站或者个人做广告宣传。此分享的源代码和文章是小编在项目中、学习中整理的一些认为不错的项目。用户产生的一些自愿下载或者付费行为。与平台没有直接关系。

  • Fedora 常用软件

    本文列举了Fedora常用软件。右键菜单在终端中打开$yum-yinstallnautilus-open-terminal复制Tilix原名terminix新建/etc/yum.repos.d/terminix.repo文件[heikoada-terminix] name=Coprrepoforterminixownedbyheikoada baseurl=https://copr-be.cloud.fedoraproject.org/results/heikoada/terminix/fedora-$releasever-$basearch/ skip_if_unavailable=True gpgcheck=1 gpgkey=https://copr-be.cloud.fedoraproject.org/results/heikoada/terminix/pubkey.gpg enabled=1 enabled_metadata=1复制之后执行以下命令进行安装$dnfupdate $dnfinstalltilix复制字体$cp/usr/share/doc/freetype-infi

  • Java程序员普遍存在的面试问题以及应对之道(新书第一章节摘录)

    其实大多数Java开发确实能胜任日常的开发工作,但不少候选人却无法在面试中打动面试官。因为要在短时间的面试中全面展示自己的实力,这很需要技巧,而从当前大多数Java开发的面试现状来看,会面试的候选人不多。所以在展开讲述分布式组件面试技巧前,就先给出大多数候选人普遍会出现的问题,这需要大家引以为戒。1不少人只会“增删改查”对于Java初级开发而言,平时的主要工作确实只是“增删改查”,即需要根据不同的业务需求,用Java和数据库等技术实现各种增删改查功能。而对于Java高级开发乃至架构师而言,日常工作中除了要做“调优”、“组件架构设计”和“问题排查”等高级的技术工作以外,“增删改查”之类的开发工作也会占到一定的比重,但在面试中,你不能让面试官感觉你除了“增删改查”之外,不会其它技能。 比如作者在做技术面试官面试候选人时,发现不少人确实能很好地结合之前做过的项目需求,展示用Spring和数据库等技术实现各种业务需求的能力,也确实能回答用相关技术实现“增删改查”业务功能的相关问题,但被问及如下其它方面的问题时会一筹莫展,不少候选人甚至连相关术语都没听说过。 • 数据库性能调优方面的问题,比如,

  • 在Oracle中,实例恢复和介质恢复的区别是什么?

    Q题目在Oracle中,实例恢复和介质恢复的区别是什么?A答案Redo日志是Oracle为确保已经提交的事务不会丢失而建立的一种机制。实际上,Redo日志的存在是为两种场景准备的,一种称之为实例恢复(InstanceRecovery),一种称之为介质恢复(MediaRecovery)。介质恢复是基于物理备份恢复数据,它是Oracle数据库出现介质故障时恢复的重要保障。介质恢复包括块恢复、数据文件恢复、表空间恢复和整个数据库的恢复。介质恢复主要是针对错误类型中的介质失败,如果是少量的块失败,那么可以使用介质恢复中的块恢复来快速修复;但如果是其它情况的丢失,那么需要根据具体情况,可使用数据文件恢复、表空间恢复甚至全库恢复,可以参考如下的表格:错误分类恢复解决方案介质失败如果是少量的块损坏,使用块介质恢复;如果是大量的块、数据文件、表空间的损坏,可能需要对损坏的数据文件或者表空间执行完全恢复;如果是归档Redo日志文件或者联机Redo日志文件的丢失,那么只需要不完全恢复方式。逻辑损坏如果是程序员错误导致出现的问题,可通过补丁应用修复问题。对于无法修复的问题,也可采用介质恢复手段来恢复数据。用

  • 云原生 - 体验Istio的完美入门之旅(一)

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。 为了方便大家阅读,可以关注头条号或微信公众号,后续所有的文章将在移动端首发,想学习更多云原生知识,请关注我。 前言 随着微服务架构的流行,服务网格技术获得了业界的广泛关注,作为实现云原生的重要积木,各大厂商也纷纷开始布局,Amazon在2019年4月份推出了AppMesh;Google、IBM、Lyft联合开发了Istio。 Istio作为下一代服务网格的整体解决方案,得到了业界的普遍认可,站在kubernetes巨人的肩膀上,极大地提高了分布式应用的研发和运维效率。 2020是云原生普及的一年,如何部署、使用、运维Istio又是必须要学习知识,本篇希望带给大家一个完美的入门体验。 一、安装环境 本地环境:Linuxubuntu kubernetes版本:1.15.2 二、准备工作 1、下载最新版本 从Istio最新发布列表下载最新发布版本1.4.3压缩包,及其命令行工具(Istioctl),如下: #创建工作目录 mkdir

  • Typora设置引用块的颜色

    Typora使用主题github主题的引用块的颜色默认是灰色的,可以设置成自定义的颜色(此处设置为#53e873)。 点击左上角顶上的文件,点击偏好设置 选择外观-主题,打开主题文件夹 选择github.css文件,使用编辑器打开   blockquote样式修改 找到原先引用块的控制样式 将原先的样式修改的样式为(可按自己喜好设置) blockquote{  border-left:4pxsolid#53e873;  padding:015px;  color:#777777;}复制 修改完之后重启Typora,效果如下:    

  • Miox带你走进动态路由的世界——51信用卡前端团队

    写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题。这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做了一些尝试,确实很不错,star增速也表明了业界对其的认可!由于自己能力有限,不能很好地解读Miox,于是我就把Miox作者的文章给搬过来了,希望对大家有所帮着。(跟作者聊过之后,了解到作者团队开发了2年多,沉淀了很深,后来选择了开源,如果大家觉得好的话,可以去点一下star!)   github地址:GitHub:51nb/Miox 文档地址: https://51nb.github.io/miox-doc/ Miox带你走进动态路由的世界 最近,我们团队开源了一套沉淀了2年的前端SPA架构框架,主要是用来解决动态路由的问题。我们的思路来源于后端,采用中间件的设计模式来架构整个框架。我们的原则是让大家快速开发一个SPA单页应用,只关心业务逻辑,其他的行为都可以帮助处理掉。 其实我们的开源比较匆忙,从很多方面看还是有些不标准的,但是之后我们会严格按照标准的规范和流程

  • 转:Stack Overflow通过关注性能,实现单块应用架构的扩展能力

    原文来自于:http://www.infoq.com/cn/news/2015/07/scaling-stack-overflow 在NewYork QCon2015大会上,DavidFullerton深入解析了如何使用C#/MSSQL支撑StackOverflow网站的单块应用架构,这个网站每月处理40多亿的用户请求。Fullerton认为,关注性能就可以几乎免费地使网站具备应付高并发的扩展能力;同时,通过减少对外部服务的调用,SOA开销(SOAtax)得以避免。 Fullerton,  StackExchange的工程部副总裁,在演讲开篇就指出尽管StackExchange旗下网站使用的技术架构很平庸,但网站使用如此陈旧技术仍能运行良好的方法却很有趣。StackExchange掌控并运营着几个社区类“问答”风格网站,包括广受欢迎的StackOverflow 开发者问答门户网。 StackExchange团队完全以远程方式协同工作,即便团队成员在同一地点办公,公司也鼓励员工相互之间仅仅使用远程协同的方式,例如使用即时通讯工具和缺陷跟踪程序。Fu

  • 动态规划 VS 贪心算法

    分治:将问题划分为互不相交的子问题递归求解。 动规:应用于子问题重叠的情况。求解过程中将子问题的解记录在表格中。   动态规划主要用于求解最优化问题。 求解步骤: 找到最优子结构。最优子结构性质:问题的最优解由相关的子问题的最优解组合而成,而这些子问题可以独立求解。 递归地定义最优解的值。 自底向上地计算最优解的值。 得到最优解。 ps: *子问题可以与原问题求解形式一样但规模更小。 *自顶向下的递归方法:总是重复求解相同的子问题。 *动态规划方法:仔细安排求解顺序,对每个子问题只求解一次,并将结果保存。 *动态规划方法有两种等价实现:1.带备忘的自顶向下法(递归求解)。2.自底向上法(循环求解)。pps:第一种其实就是记忆化搜索。 *子结构要求子问题无关的。    子问题图 可以看作自顶向下递归调用树的“简化版”。即原递归调用树种的相同子问题合并为子问题图中的单一节点。相同的所有边都从父节点指向子节点。 当思考动态规划问题时,要弄清楚涉及的子问题及子问题之间的依赖关系。 用点表示子问题,用有向边<x,y> 表示求

  • bootstrap 不常用的属性

    1布局容器 Bootstrap需要为页面内容和栅格系统包裹一个 .container 容器。我们提供了两个作此用处的类。注意,由于 padding 等属性的原因,这两种容器类不能互相嵌套。 .container 类用于固定宽度并支持响应式布局的容器。 <divclass="container"> ... </div> 复制 .container-fluid 类用于100%宽度,占据全部视口(viewport)的容器。 <divclass="container-fluid"> ... </div> 复制 2栅格网格系统 2.1列组合 ​列总数不能超过12,大于12则自动换刀下一行 <divclass="container"> <divclass="row"> <divclass="col-md-4">4列</div> <divclass="col-md-8">8列</div> </div> <

  • es6新特性-解构表达式、Lambda表达式、局部变量及map/reduce方法

    循环内的变量在循环外可见,不合理: let定义的变量是局部变量:   const修饰的是常量,不允许再次修改,类似于java中的static:    解构表达式:

  • 三分 BZOJ4868 [Sxoi2017] 期末考试

    4868:[Sxoi2017]期末考试 TimeLimit:20Sec  MemoryLimit:512MBSubmit:605  Solved:270[Submit][Status][Discuss] Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。第i位同学希望在第ti天 或之前得知所.有.课程的成绩。如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程 公布成绩,每等待一天就会产生C不愉快度。对于第i门课程,按照原本的计划,会在第bi天公布成绩。有如下两种 操作可以调整公布成绩的时间:1.将负责课程X的部分老师调整到课程Y,调整之后公布课程X成绩的时间推迟一天 ,公布课程Y成绩的时间提前一天;每次操作产生A不愉快度。2.增加一部分老师负责学科Z,这将导致学科Z的出成 绩时间提前一天;每次操作产生B不愉快度。上面两种操作中的参数X,Y,Z均可任意指定,每种操作均可以执行多次 ,每次执行时都可以重新指定参数。现在希望你通过合理的操作,使得最后总的不愉快度之和最小,

  • POJ1390 Blocks(DP、记忆化搜索)

    题目链接:   http://poj.org/problem?id=1390 题目描述: Blocks   Description Someofyoumayhaveplayedagamecalled'Blocks'.Therearenblocksinarow,eachboxhasacolor.Hereisanexample:Gold,Silver,Silver,Silver,Silver,Bronze,Bronze,Bronze,Gold. Thecorrespondingpicturewillbeasshownbelow:  Figure1Ifsomeadjacentboxesareallofthesamecolor,andboththeboxtoitsleft(ifitexists)anditsright(ifitexists)areofsomeothercolor,wecallita'boxsegment'.Thereare4boxsegments.Thatis:gold,silver,bronze,gold.Thereare1,4,3,1

相关推荐

推荐阅读