大数据Hadoop完全分布式及心得体会

文章目录 前言认识hadoop,根据所学知识完成作业,并总结本学期心得体会。 一、认识hadoop二、一课一得作业讲解实现步骤1. 搭建集群2. 模拟生成新能源车辆数据编写一个程序3. 最终部署,将这些数据写到HDFS中。 三、学习收获 前言 认识hadoop,根据所学知识完成作业,并总结本学期心得体会。 一、认识hadoop Hadoop是一个分布式系统基础技术框架,利用hadoop,开发用户可以在不了解分布式底层细节的情况下,开发分布式程序,从而达到充分利用集群的威力高速运算和存储的目的;而在本学期中,我们的专业老师带我们学习了Hadoop框架中最核心的设计:MapReduce和HDFS。 MapReduce从字面上就能看出,是由两个动词Map和Reduce组成,“Map” 就是将一个任务分解成为多个任务,“Reduce” 就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。即把一个巨大的任务分割成许许多多的小任务单元,最后再将每个小任务单元的结果汇总,并求得最终结果。 而map的输出和reduce的输入之间的还有一个数据处理过程,即为shuffle过程。该过程涉及分区、排序、分组等操作。 数据流转过程 HDFS的中文翻译是Hadoop分布式文件系统(Hadoop Distributed File System)。它本质还是程序,主要还是以树状目录结构来管理文件(和linux类似,/表示根路径),且可以运行在多个节点上(即分布式);它可以存储海量离线数据(如TB、PB、ZB级别的数据),并且保证数据高可用,支持高并发访问。但并不适合将大量的小文件存到HDFS。其主要原因是:HDFS的NameNode进程在内存中存储文件的元数据,故文件越多,消耗的内存就越大。大量的小文件,耗尽NameNode节点的内存,而实际存的文件总量却很小,HDFS存海量数据的优势没有发挥出来。 HDFS的框架 HDFS存文件的时候,会将文件按照一定的大小(默认是128M)进行分割,独立存储,这些独立的文件即为数据块(Block)。 二、一课一得作业讲解 题: 模拟生成新能源车辆数据编写一个程序,每天凌晨3点模拟生成当天的新能源车辆数据(字段信息必须包含:车架号、行驶总里程、车速、车辆状态、充电状态、剩余电量SOC、SOC低报警、数据生成时间等)。 1、最终部署时,要将这些数据写到第一题的HDFS中。 2、车辆数据要按天存储,数据格式是JSON格式,另外如果数据文件大于100M,则另起一个文件存。每天的数据总量不少于300M。比如假设程序是2023-01-1 03点运行,那么就将当前模拟生成的数据写入到HDFS的/can_data/2023-01-01文件夹的can-2023-01-01.json文件中,写满100M,则继续写到can-2023-01-01.json.2文件中,依次类推; 3、每天模拟生成的车辆数据中,必须至少包含20辆车的数据,即要含有20个车架号(一个车架号表示一辆车,用字符串表示); 4、每天生成的数据中要有少量(20条左右)重复数据(所有字段都相同的两条数据则认为是重复数据),且同一辆车的两条数据的数据生成时间间隔两秒; 5、每天生成的数据中要混有少量前几天的数据(即数据生成时间不是当天,而是前几天的)。 实现步骤 搭建集群模拟生成新能源车辆数据编写一个程序最终部署,将这些数据写到HDFS中。 1. 搭建集群 集群规划 主机IP主机名HDFSYARN192.168.91.4masterNameNode DataNodeResourceManager NodeManager192.168.91.5save1SecondaryNameNode DataNodeNodeManager192.168.91.6save2DataNodeNodeManager (1) 准备三台虚拟机,之前在伪分布式中部署过一台虚拟机了,因此直接复制三份虚拟机即可 1.1 先创建三个文件夹,并分别在每一个文件夹中复制一个虚拟机 1.2 启动VMware,重命名三个节点的名称分别为master save1 save2 1.3 分别修改master、save1、save2中的ip并重启网卡 修改IP命令 vi /etc/sysconfig/network-scripts/ifcfg-ens33; Esc 保存退出 :wq 重启网卡命令:service network restart; (2) 修改master、save1、save2的主机名 重命名命令: hostnamectl set-hostname master //master hostnamectl set-hostname save1 //save1 hostnamectl set-hostname save2 //save2 (3) 添加IP的映射

绝地求生 压q python版

仅做学习交流,非盈利,侵联删(狗头保命) 2023-06-26 测试可用 一、概述 1.1 效果 总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。 1.2 前置知识 游戏中有各种不同的q械,不同的q械后坐力不一样,射速也不同。相同的q械,装上不同的配件后,后坐力也会发生变化。q械的y轴上移是固定的,x轴是随机的,因此我们程序只移动鼠标y轴。x轴游戏中手动操作。 1.3 实现原理简述 通过python中的pynput模块监听键盘鼠标。 监听鼠标左键按下,这个时候开始移动鼠标。左键抬起,终止移动。 监听键盘按键,比如tab键,这时打开背包,截屏开始识别装备栏。 通过python的pyautogui模块来截屏,可以截取屏幕指定位置。 通过python的opencv模块来处理截取的图片。 通过SSIM算法来对比图片相似度,获取到装备栏的武器、配件。 通过python的pydirectinput操作鼠标移动。 二、详解 2.1 pynput监听键盘 import pynput.keyboard as keyboard # 监听键盘 def listen_keybord(): listener = keyboard.Listener(on_press=onPressed, on_release=onRelease) listener.start() pynput的监听为异步事件,但是会被阻塞,所以如果事件处理事件过长,得用异步处理。 2.2 监听事件 创建了c_equipment类来封装武器信息。 重点在tab键的监听,使用异步来检测装备信息。 def onRelease(key): try: if '1' == key.char: c_equipment.switch = 1 #主武器1 elif '2' == key.char: c_equipment.switch = 2 #主武器2 elif '3' == key.char: c_equipment.switch = 3 #手q switch=3的时候不压q elif '4' == key.

Spring Boot 整合 Redis 全面教程:从配置到使用

目录 一、添加 Redis 依赖二、配置 Redis 连接信息三、使用 RedisTemplate 进行操作1. 创建 RedisTemplate Bean2. 注入 RedisTemplate3. 执行 Redis 操作 四、使用 Spring Cache 简化缓存操作1. 添加 Spring Cache 依赖2. 启用缓存支持3. 使用缓存注解 五、使用 Redisson 实现分布式锁1. 添加 Redisson 依赖2. 配置 Redisson3. 使用 Redisson 获取锁: 六、完善 Redis 的其他配置一、连接池配置1. 在 配置文件中配置连接池相关参数2. 通过客户端连接池配置对象进行配置 二、超时设置1. 配置 Redis 连接超时时间2. 通过 Redis 客户端配置对象进行配置 Redis 是一种高性能的键值存储数据库,而 Spring Boot 是一个简化了开发过程的 Java 框架。将两者结合,可以轻松地在 Spring Boot 项目中使用 Redis 来实现数据缓存、会话管理和分布式锁等功能。 一、添加 Redis 依赖 在 pom.xml 文件中添加 Redis 相关依赖

解决Android studio中的Installed Build Tools revision 34.0.0 is corrupted的问题

AS官方推荐使用最新版,但是由于一些原因,可能用的不是最新版。我今天在搭建环境的时候,使用的AS版本是4.1.1,就报了标题中的错误,IDE提示卸载重新下载安装,我照做了,但是问题依旧存在。既然34.0.0不行,那其他行不行呢?我把其他版本也下载下来了,发现29.0.0是可以的。 于是上网查找原因:找到这个解决方案。原文博客: (19条消息) 2022年最优解决方案Installed Build Tools revision 31.0.0 is corrupted_31.0.0 dx d8_快乐李同学(李俊德-大连理工大学)的博客-CSDN博客 根据构建报错信息"31.0.0版本的构建工具缺少了DX文件",以及StackOverflow的解决方案发现,31.0.0版本的构建工具缺少了"dx"和"dx.jar"这两文件,正确的做法就是复制对应路径的"d8"和"d8.jar"这两文件创建副本,并分别改名为"dx"和"dx.jar","d8"和"d8.jar"这两文件的大致路径为: C:\Users\user\AppData\Local\Android\Sdk\build-tools\31.0.0\d8 C:\Users\user\AppData\Local\Android\Sdk\build-tools\31.0.0\lib\d8.jar 将这两个名称修改一下就可以了。

2023年最新最全uniapp入门学习,零基础入门uniapp到实战项目,unicloud数据后台快速打造uniapp小程序项目

今天开始带着大家一起零基础学习uniapp,在下面的课程中我们就简称uniapp为uni吧。我这里从零基础开始教大家,后面可以带大家简单的做一个实战项目。所以不用担心自己没有基础,跟着石头哥认真学习就行了的。 一,认识uniapp 1-1,uniapp的好处 我们学习uniapp之前先要认识uniapp的好处 看下官网 https://uniapp.dcloud.net.cn 就可以看到,我们用编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。 总结起来uniapp有以下几点好处 1,同一套代码可以编译运行多端(小程序,安卓,ios,web等)2,节省人力和维护成本3,接近原生,体验效果更好4,开发效率高,开发时间更短5,学习成本比较低(3-15天即可入门)6,社区活跃,版本迭代快,有问题更容易在社区解决 1-2,为什么要选择uni-app uni-app在开发者数量、案例、跨端抹平度、扩展灵活性、性能体验、周边生态、学习成本、开发成本等8大关键指标上拥有更强的优势 1-3,功能框架图和多平台运行 从下面uni-app功能框架图可看出,uni-app在跨平台的过程中,不牺牲平台特色,可优雅的调用平台专有能力,真正做到海纳百川、各取所长。其实说白了,就是开发一套uniapp代码,就可以在当前主流的平台上运行。大大的节省了开发成本。 大家看下上图,其实就可以知道,如果没有uniapp,我们想在app,h5,小程序里运行我们的项目,那么我们至少要开发4套不同平台的代码,uni真正的好处就是我们只需要开发一套代码就可以在主流的平台上全平台运行。 下图可以看到我们一套代码可以在多个平台运行的效果。 1-4,uniapp和vue,小程序的关系 uniapp是基于vue框架,所以如果你会vue的话,来学uniapp会很简单 uniapp的开发规范和小程序相似,所以如果你跟着石头哥学过小程序,再来学uniapp就能很快的入门。 当然了,如果你没有小程序或者vue基础,也没事的,只要跟着石头哥认真学习这门uniapp入门课即可。 二,开发者工具 所谓工欲善其事,必先利其器。我们开发uniapp肯定要有一个得心应手的开发者工具。 我们开发uniapp的工具就是HBuilderX 2-1,下载HBuilderX开发者工具 HBuilderX是通用的前端开发工具,但为uni-app做了特别强化。下面是hbuilder官方的简介 我们可以直接去官网下载HBuilderX开发者工具 官网下载地址 进去后我们只需要点击下载即可,记得window和mac电脑要下载自己对应的版本。 2-2,安装HBuilderX 其实HBuilderX的安装很简单,我们上面下载好的安装包,解压好就可以了,解压好以后如下图。当然我这里是window电脑的安装过程,大家如果是mac电脑,可以自行安装。安装过程基本上大差小不差的。 我们在解压好的文件里双击exe文件即可运行。 打开后如下 当然了,如果感觉每次从目录里双击exe文件打开麻烦,可以固定到任务栏或者创建快捷方式,然后把快捷方式放到桌面。 也可以直接发送到桌面快捷方式 一般情况下,我们第一次打开项目关闭的时候,系统会提示我们自动创建一个桌面快捷方式的。 当然我比较喜欢固定到任务栏,因为以后要经常用整个开发者工具,所以怎么样打开方便就怎么来就行了。 三,创建属于自己的第一个uni-app 当然如果你有学过石头哥的小程序课程,再来学习uni就可以很快的入门的。反过来说,如果你没有小程序或者vue基础,也没事的,只要跟着石头哥认真学习即可。 3-1,创建一个新的uniapp项目 在点击工具栏里的文件 -> 新建 -> 项目 然后在弹出的创建页面做以下配置 1,项目名称:随便取,可以用汉字,但是尽量用英文或者拼音2,项目路径:一般保持默认即可,不过我个人比较喜欢放在桌面,这样后面找代码方便些。3,选择模板:学习期间用默认空白模板即可,后面我们学的差不多了,就可以使用官方提供的模板,进行快速开发了。4,vue版本:因为我们的uniapp是基于vue开发的,所以这里要选择vue版本,既然我们学习,就建议大家学习最新的,用vue 3这个版本就可以了5,学习期间,我们不使用uniCloud和gitCode代码托管平台,所以这两个选项不用勾选即可。所有这些设置完,就可以点击创建了。 关于项目路径,比如我在桌面新建一个demo1空白文件夹,然后在创建项目时点击浏览,选择自己创建的demo1文件夹即可。 这样我们创建的项目就会在demo1文件里,也就是我们的项目源码就存在了demo1里 新创建好的项目如下 可以看到我们的新项目就创建在了demo1里,到这里我们的第一个uniapp项目就创建好了。 跟着石头哥学过微信小程序开发的同学大概可以看出来,uniapp项目其实和小程序项目很相似的。 一些组件,语法也很相似,因为uniapp就是基于vue框架的,而小程序呢也是借鉴了vue。所以你学过石头哥的小程序课程,再来学uni,肯定学的很快的。当然了,即便没学过小程序,石头哥也会手把手的带着大家零基础入门uni的,只要跟着石头哥认真学习。 3-2,认识uniapp项目目录结构 我们上面一步创建好了项目,这一节我们就来认识项目。 一个完整的uni项目的目录结构如下,我们后期随着学习的深入会逐个带大家学习,所以目前阶段,大家只需要大致知道就行,没有必要死记硬背下来。 大家可以先对照着官方给出的目录结构,大致的知道我们创建的第一个项目里每个文件都是什么作用。我在配套视频讲解里,会慢慢的带着大家熟悉的。 我这里先用通俗的话给大家说下我们新建项目的目录结构,方便大家理解 pages:所有页面存放的目录,我们目前只有一个index页面,后面再创建别的页面,比如个人中心,列表页,详情页等,都是放在这个pages文件里static:静态资源目录,例如图标,图片,音视频等App.vue:我们的根组件,用来配置App全局样式以及监听,所有页面的切换都是在这里进行的。index.html:就是我们的uniapp使用的vue框架生成的单页面文件,有点类似我们的网页的index页。main.js:项目初始化入口文件,主要用来初始化一些需要的东西manifest.json :用来指定应用名称、appid、logo、版本等打包信息,后面我们配置微信小程序,支付宝小程序等,可以在这里配置pages.json :配置页面路由、导航条、选项卡等页面类信息,决定页面文件的路径,窗口样式,导航栏,底部的tabbar等。uni.scss :这里是uni-app内置的常用样式变量,方便控制应用的整体风格,比如颜色,边框等 官方文档也有大致的介绍的 3-3,认识开发者工具 我们可以在顶部的工具栏里做一些开发者的配置,比如我这里把主题设置为了酷黑色。 当然了这里大家根据自己的喜好,去做一些简单的设置即可。我们后面的学习中会慢慢的用到工具栏里的东西,在视频里我慢慢的给大家做介绍。 我们常用的开发者工具的功能还有模拟器,调试器,在下一节的。 3-4,项目的预览 我们项目的预览常用的有下面几个方式。为了降低大家的学习成本,我们学习阶段主要运行到内置浏览器,后面会慢慢教大家运行到小程序或者手机上。 运行到浏览器就是运行到我们电脑上的浏览器

flutter 3.10.5 安装问题

按照 文档 安装 flutter,不过在执行 flutter doctor 的时候遇到了一些代理或者源无法连接的问题。 问题列表如下: [!] Network resources ✗ A network error occurred while checking "https://maven.google.com/": Operation timed out ✗ An HTTP error occurred while checking "https://github.com/": Operation timed out 其中 github 的问题,最好通过设置一个代理解决,github设置代理方式如下: git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 marven的部分最好替换一个国内的源,替换步骤如下: 打开flutter根目录打开文件 packages/flutter_tools/lib/src/http_host_validator.dart修改其中 kMaven(修改地址如下:http://maven.aliyun.com/nexus/content/groups/public/)删除 bin/cache重新执行 flutter doctor const String kMaven = 'http://maven.aliyun.com/nexus/content/groups/public/'; 基本上就消除了那个错误提示。 再次执行的时候可能出现一下错误: [!] Network resources ✗ A cryptographic error occurred while checking "

MySQL-SQL全部锁详解(上)

​♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术专栏 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇! 目录 MySQL SQL 锁 1 概述 2 全局锁 2.1 介绍 2.2 语法 1). 加全局锁 2). 数据备份 3). 释放锁 2.3 特点 3 表级锁 3.1 介绍 3.2 表锁 A. 读锁 B. 写锁 测试: 3.3 元数据锁 演示: 3.4 意向锁 1). 介绍 2). 分类\ MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。 SQL 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

数据库期末复习(SQL,范式,数据库设计例题)

SQL语句 创表 create table 表名( id number(10) primary key not null, //列名 类型 主键 不为空 name varchar(20) not null, //varchar (可变长度,指定最大长度20字节) 不为空 mobile varchar(11) check(length(mobile)=11) unique //约束长度等于11 取唯一值 constraint 自命名 foreign key(address) references Massage(address) //address是外码,被参照表是Massage constraint 自命名 primary key(mobile) ) //常用数据类型 // varchar(size) : 存储可变长度字符串, size 规定字符串最大长度 // number(m,n) : m 表示总长度,n表示小数位的精度,只有m表示可以存入最大为m位的整数 // date : 表示日期和时间,7个字节固定宽度,有7个属性,分别为世纪-年-月-日-小时-分-秒 视图 create view 视图名 as select ....; drop view 视图名; view 和 with as 的区别:view 创建后不删除就一直都还在,with as 执行后就不存在了 例题:建立一个视图V1,显示老师与学生的授课关系,包括年份,学期,课程名称,老师ID,老师姓名,学生ID,学生姓名

机器学习:基于逻辑回归对航空公司乘客满意度的因素分析

机器学习:基于逻辑回归对航空公司乘客满意度的因素分析 作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持 专栏案例:机器学习案例机器学习(一):线性回归之最小二乘法机器学习(二):线性回归之梯度下降法机器学习(三):基于线性回归对波士顿房价预测机器学习(四):基于KNN算法对鸢尾花类别进行分类预测机器学习(五):基于KNN模型对高炉发电量进行回归预测分析机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析机器学习(八):基于PCA对人脸识别数据降维并建立KNN模型检验机器学习(十四):基于逻辑回归对超市销售活动预测分析机器学习(十五):基于神经网络对用户评论情感分析预测机器学习(十六):线性回归分析女性身高与体重之间的关系机器学习(十七):基于支持向量机(SVM)进行人脸识别预测机器学习(十八):基于逻辑回归对优惠券使用情况预测分析机器学习(十九):基于逻辑回归对某银行客户违约预测分析机器学习(二十):LightGBM算法原理(附案例实战)机器学习(二十一):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测机器学习(二十二):基于逻辑回归(Logistic Regression)对股票客户流失预测分析 文章目录 机器学习:基于逻辑回归对航空公司乘客满意度的因素分析1、前言2、数据说明3、数据读取及预处理4、客户满意度分布情况5、乘客其他情况5.1 不同满意度的乘客中男女人数5.2 不同满意度的乘客中客户类型的人数5.3 不同满意度的乘客中旅行类型的人数 6、相关性分析7、建模预测 1、前言 航空公司乘客满意度是一个关键的指标,对于航空公司来说至关重要。了解乘客满意度的因素可以帮助航空公司优化服务,提升乘客体验,从而提高乘客忠诚度和口碑。 本文旨在基于逻辑回归方法对航空公司乘客满意度的因素进行分析。逻辑回归是一种广泛应用于分类问题的统计学习方法,能够帮助我们理解和预测不同因素对乘客满意度的影响程度。 在本文中,我们将收集与乘客满意度相关的数据,包括乘客的个人信息、航班信息、服务评价等方面。然后,我们将使用逻辑回归模型对这些数据进行建模和分析,以确定对乘客满意度具有显著影响的因素。 通过本文的研究,我们期望能够揭示出哪些因素对乘客满意度的影响最为显著,从而为航空公司制定改进策略和提供更优质的服务提供依据。 本文将首先介绍航空公司乘客满意度的研究背景和意义,然后详细阐述逻辑回归方法的原理和应用。接着,我们将描述数据收集和预处理的过程,并展示实证分析的结果和讨论。最后,我们将总结研究的主要发现,并提出对未来研究的展望。 通过对航空公司乘客满意度的因素进行逻辑回归分析,我们可以为航空公司提供有针对性的改进建议,提升乘客满意度,从而增强竞争力和业务增长。 2、数据说明 id唯一的身份证件Gender乘客性别(女性、男性)CustomerType客户类型(忠诚客户、不忠诚客户)Age乘客的实际年龄TypeOfTravel乘客飞行目的(个人旅行、商务旅行)Class乘客飞机上的旅行舱位(商务舱、环保舱、生态升级版)FlightDistance此旅程的飞行距离InflightWifiservice机上wifi服务的满意度(0:不适用;1-5)DepartureArrivalTimeCconvenient出发/到达时间的满意度方便EaseOfOnlineBooking在线预订的满意度GateLocation登机口位置满意度FoodAndDrink食物和饮料的满意度OnlineBoarding网上登机满意度SeatComfort座椅舒适度满意度InflightEntertainment机上娱乐的满意度OnBoardService机上服务的满意度LegRoomService腿部客房服务的满意度BaggageHandling行李处理满意度CheckinService入住服务的满意度InflightService机上服务的满意度Cleanliness清洁度的满意度DepartureDelayInMinutes出发时延误几分钟ArrivalDelayInMinutes抵达时延迟几分钟satisfaction航空公司满意度(满意、中性或不满意) 3、数据读取及预处理 对数据进行导入。 import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 设置字体为中文字体(例如SimHei、Arial Unicode MS等) plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 df = pd.read_csv(r"D:\Download\data.csv") df.head() 使用isna().sum()对数据查看是否有缺失值 df.isna().sum() 发现ArrivalDelayInMinutes列有297个缺失值,本文将ArrivalDelayInMinutes列的平均值进行填充。 df['ArrivalDelayInMinutes'] = df['ArrivalDelayInMinutes'].fillna(round(df['ArrivalDelayInMinutes'].mean(),2)) 使用duplicated().sum() 查看是否有重复值 df.duplicated().sum() 使用shape查看数据大小,结果发现有97247行,24列 df.shape 4、客户满意度分布情况 为了展示乘客满意度的分类分布情况,将用绘制饼图来进行解释。

mysql删除表数据 MySQL清空表内容 3种命令方法及比较

一、MySQL清空表数据命令:truncate SQL语法: truncate table 表名 注意: 不能与where一起使用。truncate删除数据后是不可以rollback的。truncate删除数据后会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。truncate删除数据后不写服务器log,整体删除速度快。truncate删除数据后不激活trigger(触发器)。 二、MySQL删除表命令:drop SQL语法: drop table 表名; 或者是 drop table if exists 表名; 注意: truncate只会清除表数据,drop不光清除表数据还要删除表结构。 三、MySQL清空数据表内容的语法:delete SQL命令: delete from 表名 where id='1'; 或 delete from 表名; 注意: delete含义:你要删除哪张表的数据 ?你要删掉哪些行 ?delete可以删除一行,也可以删除多行;如果不加where条件,则是删除表所有的数据,这是很危险的!不建议这样做! 总结: 1、当你不再需要该表时, 用 drop; 2、当你仍要保留该表,但要删除所有数据表记录时, 用 truncate; 3、当你要删除部分记录或者有可能会后悔的话, 用 delete。 4、不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。 效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。 delete的效果有点像将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。 .

Python 数据可视化实战--新零售智能销售数据可视化项目实战

一.读取与处理新零售智能销售数据 import pandas as pd data4 = pd.read_csv('../data/订单表2018-4.csv', encoding='gbk') data5 = pd.read_csv('../data/订单表2018-5.csv', encoding='gbk') data6 = pd.read_csv('../data/订单表2018-6.csv', encoding='gbk') data7 = pd.read_csv('../data/订单表2018-7.csv', encoding='gbk') data8 = pd.read_csv('../data/订单表2018-8.csv', encoding='gbk') data9 = pd.read_csv('../data/订单表2018-9.csv', encoding='gbk') goods_info = pd.read_excel('../data/商品表.xlsx') print(data4.shape, data5.shape, data6.shape, data7.shape, data8.shape, data9.shape, goods_info.shape) data = pd.concat([data4, data5, data6, data7, data8, data9], ignore_index=True) print('订单表合并后的形状为', data.shape) print('订单表各列的缺失值数目为:\n', data.isnull().sum()) # 删除缺失值 print('未做删除缺失值前订单表行列数目为:', data.shape) data = data.dropna(how='any') # 删除 print('删除完缺失值后订单表行列数目为:', data.shape) # 清洗商品表 print('商品表各列的缺失值数目为:\n', goods_info.isnull().sum()) # 删除缺失值 print('未做删除缺失值前商品表行列数目为:', goods_info.

机器学习之K-Means(k均值)算法

1 K-Means介绍 K-Means算法又称K均值算法,属于聚类(clustering)算法的一种,是应用最广泛的聚类算法之一。所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程,即存在有先验知识的训练数据集。 K-Means是无监督学习的杰出代表之一。 1.1 K-means 的著名解释:牧师—村民模型 (1)有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。 (2)听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。 (3)牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点…… (4)就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。 1.2 K-Means的原理 对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。给定样本集D,k-means算法针对聚类所得簇划分C最小化平方误差。 这条公式在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度,E值越小则簇内样本相似度越高。k-means算法通常采用欧氏距离来计算数据对象间的距离。 1.3 K-Means的计算步骤 K-Means聚类算法步骤实质是EM算法(最大期望算法(Expectation-Maximization algorithm, EM))的模型优化过程,具体步骤如下: (1)随机选择k个样本作为初始簇类的均值向量; (2)将每个样本数据集划分离它距离最近的簇; (3)根据每个样本所属的簇,更新簇类的均值向量; (4)重复(2)(3)步,当达到设置的迭代次数或簇类的均值向量不再改变时,模型构建完成,输出聚类算法结果。 K-Means最核心的部分就是先固定中心点,调整每个样本所属的类别来减少损失值;再固定每个样本的类别,调整中心点继续减小损失值。两个过程交替循环,损失值单调递减直到最(极)小值,中心点和样本划分的类别同时收敛。 K-means 的本质是基于欧式距离的数据划分算法,均值和方差大的维度将对数据的聚类产生决定性影响。所以未做归一化处理和统一单位的数据是无法直接参与运算和比较的。常见的数据预处理方式有:数据归一化,数据标准化。 此外,离群点或者噪声数据会对均值产生较大的影响,导致中心偏移,因此我们还需要对数据进行异常点检测。 1.4 K-Means的K值选择 K 值的选取对 K-means 影响很大,这也是 K-means 最大的缺点,常见的选取 K 值的方法有:手肘法、Gap statistic 方法。 (1)手肘法 - 核心指标:SSE(sum of the squared errors,误差平方和) - 核心思想 随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数 显然,肘部对于的k值为3(曲率最高),故对于这个数据集的聚类而言,最佳聚类数应该选3。 (2)轮廓系数 手肘法的缺点在于需要人工看不够自动化,所以我们又有了 Gap statistic 方法,此方法出自斯坦福大学的论文:“estimating the number of clusters in a dataset via the gap statistic” 其中Dk为损失函数,这里E(logDk)指的是logDk的期望。这个数值通常通过蒙特卡洛模拟产生,我们在样本里所在的区域中按照均匀分布随机产生和原始样本数一样多的随机样本,并对这个随机样本做 K-Means,从而得到一个Dk。如此往复多次,通常 20 次,我们可以得到 20 个logDk。对这 20 个数值求平均值,就得到了E(logDk)的近似值。最终可以计算 Gap Statisitc。而 Gap statistic 取得最大值所对应的 K 就是最佳的 K。

【Java】PriorityQueue--优先级队列

目录 一、优先级队列 (1)概念 二、优先级队列的模拟实现 (1)堆的概念 (2)堆的存储方式 (3)堆的创建 堆向下调整 (4)堆的插入与删除 堆的插入 堆的删除 三、常用接口介绍 1、PriorityQueue的特性 2、PriorityQueue常用接口介绍 (1)优先级队列的构造 (2)插入/删除/获取优先级最高的元素 四、堆排序 一、优先级队列 (1)概念 前面介绍过队列, 队列是一种先进先出(FIFO)的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列 ,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下, 数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就是 优先级队列(Priority Queue)。 二、优先级队列的模拟实现 JDK1.8 中的 PriorityQueue底层使用了堆这种数据结构 ,而堆实际就是在完全二叉树的基础上进行了一些调整。 (1)堆的概念 如果有一个 关键码的集合 K = {k0 , k1 , k2 , … , kn-1} ,把它的所有元素 按完全二叉树的顺序存储方式存储在一个一维数组中 并满足: Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0 , 1 , 2… ,则 称为小堆 ( 或大堆) 。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 堆的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 大根堆和小根堆的示例图如下:

彻底卸载mysql的详细步骤

目录 一、前言 二、操作步骤 (一) 停止mysql的服务 (二)控制面板卸载 (三)清除残留的文件 (四)删除注册表内容 (五)删除MySQL环境变量 一、前言 卸载mysql的原因有挺多,有些是mysql文件里面没有data包和my.ini文件,一个是存储东西的包,一个是管理整个myql的文件。有些是因为mysql运行忽然出现了问题,这就不得不需要重新来了。 但是,data包和in配置i文件不会不存在的,只是放到了其他的文件夹里面去了。 mysql没有data和my.ini文件怎么办?_云边的快乐猫的博客-CSDN博客 二、操作步骤 (一) 停止mysql的服务 1.使用快捷键CTRL+Alt+Delete打开任务管理器,找到这个mysql8.0,然后停止服务 (二)控制面板卸载 2.搜索控制面板,打开控制面板 3.点击卸载程序 4.点击卸载程序这两个mysql (三)清除残留的文件 5.一般默认在这个C盘的文件的位置,这些文件都进行删除 C:\Program Files\MySQL (四)删除注册表内容 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\MySQLD Service 6.找到mysql文件,进行删除 (五)删除MySQL环境变量 7.打开环境变量 下一步 8.点开系统环境变量,然后选择path打开,找到mysql的配置路径信息,点击删除,确定就好了 有什么问题都可以评论区留言,看见都会回复的 如果你觉得本篇文章对你有所帮助的,多多支持吧!!! 点赞收藏评论,当然也可以点击文章底部的红包或者👇订阅付费文章创作支持一下了。抱拳了! vip文章:http://t.csdn.cn/Uq5j1 bug大全订阅文章:http://t.csdn.cn/j6UyR

解决IDEA报错:java 找不到符号

1、重启idea 2、清除缓存,重新下载: 3、在报错的项目下的pom文件中重新加载项目 4、重新构建项目 以上四种办法还是无法解决,又找不到其他原因就使用最暴力的解决方案 5、点击File->Settings->Build,Execution,Deployment->Compoler在如下位置填入: -Djps.track.ap.dependencies=false

【Java系列】深入解析 Lambda表达式

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 1 基础介绍 1.1概念介绍 Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 Lambda表达式的主要目的是简化Java代码,使其更易于阅读和编写。 Lambda表达式的语法非常简洁和清晰。它们由参数列表、箭头符号和方法体组成。参数列表指定传递给Lambda表达式的参数,箭头符号 "->" 分隔参数列表和方法体,方法体则包含Lambda表达式要执行的代码。 1.2 简单示例 下面是一个简单的Lambda表达式示例: (int x, int y) -> x + y 这个Lambda表达式接受两个整数参数 x 和 y,并返回它们的和。可以将这个Lambda表达式存储在一个变量中,例如: IntBinaryOperator add = (int x, int y) -> x + y; 这个代码创建了一个名为add的变量,它的类型是IntBinaryOperator,它接受两个整数参数并返回一个整数结果。 该变量被初始化为一个Lambda表达式,该表达式实现了相同的功能,即将两个整数相加。 1.3 Lambda优点 Lambda表达式的主要优点包括: 简化代码:Lambda表达式可以将冗长复杂的代码简化为几行简洁的代码。可读性:Lambda表达式可以使代码更易于阅读和理解,因为它们更接近自然语言。可传递性:Lambda表达式可以作为参数传递给方法或存储在变量中,使代码更具可重用性和灵活性。并行处理:Lambda表达式可以与Stream API一起使用,使Java程序更容易地进行并行处理。 Lambda表达式是Java 8中最重要的新特性之一,它们为我们提供了一种更简单、更灵活、更易于使用的编程方式。 2 使用场景 Lambda表达式可以用于许多不同的场景,其中包括: 集合操作多线程编程事件处理排序过滤映射聚合函数式编程数据库操作并行计算GUI编程测试 2.1集合操作 Lambda表达式可以与Java 8的新集合操作方法(如stream()和forEach())一起使用,使集合的处理更加简单、灵活和易于读写。 例如,假设有一个字符串列表,想要对该列表中的所有元素进行大写转换并输出到控制台上,可以使用以下代码: List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.stream().map(String::toUpperCase).forEach(System.out::println); 这里,使用了stream()方法将列表转换为一个流,然后使用map()方法将每个字符串转换为大写形式,最后使用forEach()方法将结果输出到控制台。 2.2 多线程编程 Lambda表达式可以与Java中的函数式接口一起使用,使多线程编程更加简单和可读。

一文理解MySQL的For Update行级锁

一文理解MySQL的For Update行级锁 引言一、MySQL的For Update简介1.1、For Update的作用1.2、For Update与其他锁定方式的区别 二、For Update的语法2.1、SELECT语句的基本语法2.2、mysql如何开启事务和提交事务?2.3、使用For Update进行数据锁定 三、如何使用For Update3.1、For Update的应用场景3.2、使用案例分析 四、For Update的注意事项4.1、For Update的局限性4.2、不当使用For Update可能导致的问题4.3、For Update一定只锁行吗? 五、总结5.1、理解For Update的优缺点5.2、合理使用For Update,提升数据库性能 引言 💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 博客主页:https://blog.csdn.net/Long_xu 一、MySQL的For Update简介 For update是MySQL中用于实现行锁的一种语法,其主要作用是在SELECT查询语句中加上FOR UPDATE子句,以保证查询结果集中的每一行都被锁定,避免其他事务对这些行进行修改。具体语法如下: SELECT ... FROM table_name WHERE ... FOR UPDATE; 在执行For update语句时,MySQL会首先获取表级共享锁,然后再根据WHERE条件锁定符合条件的行。锁定的范围包括了WHERE条件筛选出来的所有行,即使有些行并不满足WHERE条件。 需要注意的是,For update语句会将锁定的行一直锁定到事务结束,因此在使用时需要考虑是否会导致死锁的问题,并尽量缩小锁定的范围。同时,对于InnoDB存储引擎的表,可以使用行级锁和间隙锁来提高并发性能。 1.1、For Update的作用 "For Update"是一种SQL语句,它的作用是在查询过程中锁定数据行,防止其他事务对这些数据进行修改操作。使用"For Update"可以保证当前事务对被锁定的数据具有排他性,并且能够避免产生并发问题。"For Update"适用于需要修改或者删除数据的场景,例如在一个订单系统中,如果多个用户同时尝试对同一个订单进行修改操作,就可以使用"For Update"方式来避免冲突。 1.2、For Update与其他锁定方式的区别 For Update是一种排它锁定方式,只有被锁定的行才能进行修改操作。而共享锁定方式允许多个事务同时读取同一行数据,但是不允许对其进行修改。For Update锁定方式可以避免出现脏读、不可重复读和幻读等并发问题,因为它会在读取某一行数据时将其锁定,直到事务结束或提交之前才释放锁定。For Update锁定方式可能会导致死锁问题,因为多个事务可能会互相等待对方释放锁定。而其他锁定方式如共享锁定则不存在这个问题。For Update锁定方式的性能较差,因为它需要在读取数据时进行锁定操作,增加了系统的开销。而其他锁定方式如共享锁定则没有这个问题。 二、For Update的语法 2.1、SELECT语句的基本语法 SELECT column1, column2, ... FROM table_name WHERE condition; 其中,column1、column2等为要查询的列名,用逗号分隔;table_name为要查询的表名;condition为查询条件,可选。

Android 之MPAndroidChart图表案例

一 简介 1.1 图表用于直观的分析数据的分布情况,用于对比数据的大小和趋势。 1.2 图表的类型也非常多,常见的有折线,柱状,饼状,其它的有面积,散点,股价,雷达,仪表盘,漏斗等。 1.3 Android也有非常优秀的图表库,比如MPAndroidChart,hellocharts-android,AnyChart-Android等,其中MPAndroidChart目前使用量第一,优势在于自定义程度非常高,而且配置参数非常多,通过配置就能基本上实现所有的图表。 二 MPAndroidChart图表案例,柱状图 2.1 效果 2.2 添加 MPAndroidChart 依赖库 repositories { maven { url 'https://jitpack.io' } } dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } 2.4 xml添加柱状图组件BarChart <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.github.mikephil.charting.charts.BarChart android:id="@+id/chart1" android:layout_width="match_parent" android:layout_height="300dp" /> </FrameLayout> 2.5 设置图表配置和数据 public class BarActivity extends AppCompatActivity { private BarChart chart; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bar_chart); //获取柱状图控件 chart = findViewById(R.

计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例

MSE(Mean Squared Error)均方误差 MSE公式 MSE 计算模型的预测 Ŷ 与真实标签 Y 的接近程度。公式表示为: 对于两个m×n的单通道图像I和K,它们的均方误差可定义为: 优点:MSE的函数曲线光滑、连续,处处可导,便于使用梯度下降算法,是一种常用的损失函数。而且,随着误差的减小,梯度也在减小,这有利于收敛,即使使用固定的学习速率,也能较快的收敛到最小值。 缺点:当真实值y和预测值f(x)的差值大于1时,会放大误差;而当差值小于1时,则会缩小误差,这是平方运算决定的。MSE对于较大的误差(>1)给予较大的惩罚,较小的误差(<1)给予较小的惩罚。也就是说,对离群点比较敏感,受其影响较大。 代码实现 # MSE # 方法一:自定义函数 import numpy as np def MSE(img1,img2): mse = np.mean( (img1 - img2) ** 2 ) return mse # 方法二:调用库函数 # 老版本的scikit-image,加载SSIM、PSNR、MSE的方式: from skimage.measure import compare_mse as mse # 新版本的scikit-image,加载方式: from skimage.metrics import mean_squared_error as mse PSNR(Peak Signal-to-Noise Ratio)峰值信噪比 PSNR(Peak Signal to Noise Ratio),峰值信噪比,是一种评价图像的客观标准。,应用场景有很多。它具有局性,PSNR是“Peak Signal to Noise Ratio”的缩写。peak的中文意思是顶点。而ratio的意思是比率或比列的。整个意思就是到达噪音比率的顶点信号,psnr一般是用于最大值信号和背景噪音之间的一个工程项目。通常在经过影像压缩之后,通常输出的影像都会在某种程度与原始影像不同。为了衡量经过处理后的影像品质,通常会参考PSNR值来衡量某个处理程序能否令人满意。它是原图像与被处理图 像之间的均方误差相对于(2n-1)2的对数值(信号最大值的平方,n是每个采样值的比特数),它的单位是dB。 PSNR是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即 基于误差敏感的图像质量评价。由于并未考虑到人眼的视觉特性(人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个 区域的感知结果会受到其周围邻近区域的影响等),因而经常出现评价结果与人的主观感觉不一致的情况。

【算法设计与分析】期末复习

文章目录 复习大纲第一章算法概述1.1算法与程序1.2 算法复杂性分析 第二章递归与分治策略分治法的基本思想递归与分治的关系:用分治法解决的问题的几个特征:例题: 第三章动态规划动态规划的基本思想:分治与动态规划算法的异同:理解动态规划算法的基本要素:动态规划算法求解问题的步骤:例题: 第四章贪心算法理解贪心算法的基本要素:贪心算法与动态规划算法的异同点:0-1背包问题能不能用贪心算法求解?为什么?例题: 第五章回溯法回溯法的基本思想:回溯法解题步骤用回溯法解题的特征:回溯法的算法框架:影响回溯法的效率因素:例题(看PPT): 第六章分支限界法分支限界法的基本思想:分支限界法与回溯法的异同:分支限界法的实现方式:例题: 复习题库选择题填空题算法填空简答题1.分治法的基本思想:2.设计动态规划算法的主要步骤为:3. 分治法与动态规划法异同4. 分支限界法与回溯法异同5.贪心算法与动态规划算法的主要区别6. 分治法所能解决的问题一般具有的几个特征是:7. 用分支限界法设计算法的步骤是:8. 常见的两种分支限界法的算法框架9. 回溯法中常见的两类典型的解空间树:10. 分支限界法的搜索策略是:11、回溯法的基本思想 算法设计题 复习大纲 第一章算法概述 1.1算法与程序 算法:是解决问题的一种方法或一个过程,是由若干条指令组成的有穷序列。 算法性质: 1.输入:有零个或多个 2.输出:至少一个 3.确定性:组成算法的每条指令清晰无歧义 4.有限性:算法中每条指令的执行次数和执行时间是有限的 5.算法与程序的区别:程序是算法用某种程序设计语言的具体实现,可以不满足有限性。 1.2 算法复杂性分析 1.算法的复杂性分时间复杂性和空间复杂性。 2.三种情况下的时间复杂性,可操作性最好最有实际价值的是最坏情况下的时间复杂性。 3.算法复杂性的渐进分析:O,o,Ω,ω,Θ 第二章递归与分治策略 分治法的基本思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 递归与分治的关系: 由分治法产生的子问题往往是原问题的较小模式,反复应用分治法,可以使子问题与原问题类型一致且规模不断缩小,最终使子问题缩小到很容易求解,因此用递归求解。 用分治法解决的问题的几个特征: •问题的规模缩小到一定的程度可以容易地解决; •问题可以分解为若干个规模较小的相同问题; •利用原问题分解出的子问题的解可以合并为原问题的解; •问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。如果子问题不是相互独立的,可以用动态规划法。 例题: 深刻理解算法的设计并能够进行时间复杂度分析 排列问题(包括有重复元素的情况),二分搜索,大整数乘法和矩阵乘法的分治思想,合并排序,快速排序,棋盘覆盖的思想。 第三章动态规划 动态规划的基本思想: 将待求解问题分解成若干个子问题,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,为避免大量的重复计算,用一个表记录所有已解决的子问题的答案,而在需要的时候再找出已求得的答案。 分治与动态规划算法的异同: 分治法与动态规划法的相同点是:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。 理解动态规划算法的基本要素: 最优子结构性质:问题的最优解包含了其子问题的最优解。重叠子问题性质:有些子问题被反复计算多次。 动态规划算法求解问题的步骤: 找出最优解的性质,并刻画其结构特征递归地定义最优值以自底向上的方式计算出最优值构造最优解 例题: 深刻理解矩阵连乘问题、最长公共子序列问题、最大子段和问题和0-1背包问题的动态规划算法,并进行时间复杂度和空间复杂度分析。 第四章贪心算法 理解贪心算法的基本要素: 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。最优子结构性质。 贪心算法与动态规划算法的异同点: (1)共同点:都需要最优子结构性质,都用来求最优化问题。 (2)不同点: 动态规划:每一步作一个选择—依赖于子问题的解。 贪心方法:每一步作一个选择—不依赖于子问题的解。 动态规划方法的条件:子问题的重叠性质。 可用贪心方法的条件:最优子结构性质;贪心选择性质。 动态规划:自底向上或自顶向下(备忘录方法)求解; 贪心方法:自顶向下求解。